Webhacking.kr Challenge 27 - SQL Injection 우회
제가 웹을 잘못해서, 비오비에서 민폐가 될까봐 웹해킹.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 부분을 막아주면 된다.
마지막으로 뒤에 -- 를 붙혀서 뒤에 있는 이후의 쿼리문을 주석처리 했다.
-- 의 앞과 뒤에 공백이 존재해야 값이 인증되는줄 모르고 계속 해매서 블로그를 보니 공백이 존재해야 한다는 것을 알게되어 문제를 풀게 되었습니다.
앞으로 외우기 귀찮으니 -- 부분은 앞뒤로 띄어야 겠다고 생각했습니다.
0 개의 댓글