zj3t

email: euntaejang@gmail.com

Latest Posts

Webhacking.kr Challenge 27 - SQL Injection 우회

By 오전 12:16

제가 웹을 잘못해서, 비오비에서 민폐가 될까봐 웹해킹.kr 문제를 푸는중 sql 인젝션에 대한 문제는 포스팅을 해보기로 해서 포스팅을 하겠습니다.





0이 admin인줄 알았는데 어서 테이블을 봤는데 No2가 admin일 수도있겠다라는 것을 알게되었습니다.

그렇다면 공격 구문은 ?no=2 or no =2 를 해주면 된다고 생각하였습니다.


true가 guest라....

?no=2 or no =2 를 해주면

select id from challenge27_table where id='guest' and no=2 or no=2

처음 id='guest' and no=2에서 false가 터지게 되고 그 뒤에있는 where no=2 가 되어 admin계정을 따낼 수 있을 것이라고 생각했습니다.

if(eregi("#|union|from|challenge|select|\(|\t|/|limit|=|0x",$_GET[no]))

필터들이 존재하는데 띄어쓰기는 필터링을 하지 않았고, '=' 문자를 필터링을 하기때문에 다른 대안이 필요했습니다.

찾아본 결과 '=' 를 대체할 수 있는 것이 like 라고 하네요. like는 검색용도로 쓰이는 sql 구문인줄 알았는데 '=' 를 대체할 수 있는 용도로도 쓰입니다.

따라서 ?no=2 or no like 2 해주면 될까 싶었지만......
(입력할 떄는 no=2+or+no+like+2)

왜 안되지...

"select id from challenge27_table where id='guest' and no=($_GET[no])"

 이 부분에 문제가 있었습니다. $GET으로 전달받은 변수를 괄호 () 를 이용해서 묶어 버렸습니다.

그렇게 되면 select id from challenge27_table where id='guest' and no=(2+or+no+like+2)

뒤에있는 guest 부분 자체가 no like 2 true가 되어 앞의 값과는 관계없이 true가 되어 guest 계정을 띄우게 됩니다.

따라서 괄호를 닫아주면 될 것 같습니다.
no=2)+or+no+like+2 를 해주면

select id from challenge27_table where id='guest' and no=(2) or no = 2)

가 결과적으로 되는 것이기 때문에 앞의 no=2를 주어서 guest 와 관련 된 no 부분을 막아주면 된다.

마지막으로 뒤에 -- 를 붙혀서 뒤에 있는 이후의 쿼리문을 주석처리 했다.

-- 의 앞과 뒤에 공백이 존재해야 값이 인증되는줄 모르고 계속 해매서 블로그를 보니 공백이 존재해야 한다는 것을 알게되어 문제를 풀게 되었습니다.

앞으로 외우기 귀찮으니 -- 부분은 앞뒤로 띄어야 겠다고 생각했습니다.


You Might Also Like

0 개의 댓글