728x90

오랜만에 SQL INJECTION 문제다.
<?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>
코드는 다음과 같다.
id가 guest면 guest를, admin이면 문제가 풀린다. admin의 no는 2
이때 #, select, (,limit,=,0x,i는 필터링한다.
r변수는 select id from chall27 where id ='guest' and no ({$_GET['no']})")) 명령어를 실행하는데
이전 문제에서 비슷한 유형을 어떻게 풀었냐면,
(TRUE AND FALSE) OR TRUE
현재 TRUE인게 id=guest, 그리고 no=가 false이면서 or no=2이면 됨
가볍게 적어보면
and no=-1 or no=2 이렇단 소린데 잘 보니 공백도 필터링하고 있다.
-1%09or%09no=2 이렇게 했는데 이것도 필터링 .. 왜냐하면 '='를 사용하면 안되기 때문이다.
여기서.. 또 실수한건.. false 부분을 적을 때 -1)하고 괄호를 닫아줘야하는데 까먹음..^^
참고로 url 창에 안 적고, 제출 폼에 입력하면 이렇게 이중 인코딩?이 된다


요로코롬..
그리고 맨 뒤에 주석 넣어주면 공백도.. 필요하단다. 몰랐다.. 꼭 익혀둬야지
728x90
'CTF, 워게임 문제 풀이 > webhacking.kr' 카테고리의 다른 글
| webhacking.kr 29번 문제 풀이 (0) | 2022.08.30 |
|---|---|
| webhacking.kr 28번 문제 풀이 (0) | 2022.08.30 |
| webhacking.kr 26번 문제 풀이 (0) | 2022.08.29 |
| webhacking.kr 25번 문제 풀이 (0) | 2022.08.29 |
| webhacking.kr 24번 문제 풀이 (0) | 2022.08.29 |
댓글