티스토리 뷰

hacking/LOS

<LOS> -3번(goblin)

khe0616 2018. 3. 22. 16:44






쿼리문을 전송했을때, 반환되는 레코드가 존재하면서, 그 레코드의 '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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함