ABOUT ME

-

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

    nightmare

    주석 처리에 사용되는 --와 #이 모두 필터링 목록에 포함되어 있다. 괄호 역시 필터링 대상인데, 특이한 것은 ()만 필터링되고 (나 )를 따로 사용하는 것은 필터링이 되지 않는다는 점이다.

    또한 pw의 길이가 6보다 크면 No Hack 문구가 출력된다. 

     

    길이 제한이 있기 때문에 or 1=1과 같은 인증 우회는 사용이 불가능하다.

    따라서 길이 제한을 피하고 쿼리문이 참이 되게 하려면 pw가 참이 되도록 만드는 수밖에 없다.

     

    SQL에서 문자열을 숫자와 비교할 때, 숫자 없이 문자로만 이루어진 문자열은 0으로 자동 형변환된다.

    또한 select id from table where pw=1=1와 같이 쿼리문을 작성하면, 1=1은 참이므로 전체 쿼리문은 참이 되어 정상적으로 실행된다.

     

    이러한 점들을 이용하여, select id from table where pw=('')=0이 되도록 쿼리문을 작성하면, ('')=0이 참이기 때문에 전체 쿼리문도 참이 되어 id가 반환된다. (여기서 ('')는 빈 문자열이므로 0으로 자동 형변환된다.)

     

    따라서 아래와 같이 pw 인자를 전달하면 문제가 해결된다.

    (마지막에 주석 처리 문자를 사용하여 뒷부분을 모두 주석으로 처리한다.)

    (주석을 우회해서 처리하는 방법은 여러 가지가 있지만, 길이 제한이 있으므로 가장 길이가 짧은 ;%00을 쓰도록 한다.)

     

    ?pw=')=0;%00

    select id from prob_nightmare where pw=('')=0;%00') and id!='admin'

     

    NIGHTMARE Clear!

     

Designed by Tistory.