ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOS] 17. zombie_assassin 문제 풀이
    Wargame/LOS (Lord of SQL Injection) 2019. 7. 22. 17:41

    zombie_assassin

    id와 pw에 addslashes 함수와 strrev 함수가 사용되었다. addslashes 함수는 싱글 쿼터('), 더블 쿼터("), 백슬래시(\), NULL 문자를 이스케이핑해주는 함수이고, strrev 함수는 인자로 받은 문자열을 순서를 뒤집은 상태로 반환하는 함수이다.

    ex) strrev("abcdefg"): gfedcba

     

    strrev 함수로 인해 GET 방식으로 전달된 id와 pw는 아래와 같이 변환된다.

    id=admin&pw=12

    또한 addslashes 함수로 인해 싱글쿼터(')나 더블쿼터(')는 이스케이핑되어 앞에 백슬래시(\)가 추가되고, strrev 함수에 의해 순서가 뒤집힌다. 따라서 싱글쿼터(')를 인자로 주면 addslashes에 의해 \'가 되고, strrev 함수에 의해 '\가 되어, 결과적으로 아래처럼 id의 싱글쿼터(')가 닫히고, 뒤의 싱글 쿼터(')는 \이 붙어서 문자로 변한다.

    이러한 점을 이용하여, id에 NULL 또는 더블 쿼터(")를 입력하면, 앞에 \가 붙은 후 strrev 함수에 의해 뒤집혀서 아래와 같이 변할 것이다.

    id='"' and pw='1'

    id='"\' and pw='1'

    \로 인해 뒤의 싱글 쿼터(')가 문자로 변하기 때문에, 결국 "\' and pw=는 싱글쿼터로 묶여서 하나의 문자열이 된다.

     

    따라서, id의 인자로 더블 쿼터(") 또는 NULL(%00)을 주고, pw의 인자로 or 1=1--%20을 주면, 전체 쿼리문이 참이 되어 id를 반환할 것이다. (--%20은 뒤에 남아있는 싱글쿼터(')를 주석 처리한다.) 다만 주의할 점은, strrev 함수 때문에 pw의 인자를 거꾸로 주어야 한다는 점이다.

     

    ?id="&pw=%20--1=1 ro

    ?id=%00&pw=%20--1=1 ro

    ZOMBIE_ASSASSIN Clear!

     

    ※ id의 인자로 싱글쿼터(')와 백슬래시(\)가 들어갈 수 없는 이유

    아까 addslashes에 의해 이스캐이핑이 적용되는 문자에는 4개가 있다고 했지만, 그 중 id의 인자로 넣을 수 있었던 것은 더블쿼터(")와 NULL(%00)밖에 없었다. 나머지 2개인 싱글쿼터(')와 백슬래시(\)가 인자로 들어갈 수 없는 이유는 아래와 같다.

     

    1) 싱글쿼터(')

    id=''\' and pw='1'

    : id에는 아무것도 들어가지 않은 채로 싱글쿼터(')가 닫혀버리고, 중간에 문자형으로 변한 싱글쿼터(\')만이 남게 되어 쿼리문에 오류가 발생한다.

     

    2) 백슬래시(\)

    id='\\' and pw='1'

    : 백슬래시를 인자로 넣으면 \\로 변환되는데, 이는 strrev에 의해 순서가 바뀌어도 똑같은 문자열이 된다. 결국 백슬래시는 문자 그대로의 백슬래시가 되기 때문에 정상적인 쿼리문이 된다. (쿼리문을 조작할 수 있는 여지가 없다.)

    'Wargame > LOS (Lord of SQL Injection)' 카테고리의 다른 글

    [LOS] 19. xavis 문제 풀이  (4) 2019.07.24
    [LOS] 18. nightmare 문제 풀이  (0) 2019.07.22
    [LOS] 16. succubus 문제 풀이  (0) 2019.07.22
    [LOS] 15. assassin 문제 풀이  (0) 2019.07.19
    [LOS] 14. giant 문제 풀이  (0) 2019.07.19
Designed by Tistory.