Webhacking.kr Writeup old-18번 문제입니다.
접속하면 소스코드 링크를 줍니다.
먼저 소스코드 링크를 보겠습니다.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 18</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; }
a { color:lightgreen; }
</style>
</head>
<body>
<br><br>
<center><h1>SQL INJECTION</h1>
<form method=get action=index.php>
<table border=0 align=center cellpadding=10 cellspacing=0>
<tr><td><input type=text name=no></td><td><input type=submit></td></tr>
</table>
</form>
<a style=background:gray;color:black;width:100;font-size:9pt;><b>RESULT</b><br>
<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2
if($result['id']=="guest") echo "hi guest";
if($result['id']=="admin"){
solve(18);
echo "hi admin!";
}
}
?>
</a>
<br><br><a href=?view_source=1>view-source</a>
</center>
</body>
</html>
다른부분은 볼거 없이 아래 부분을 보겠습니다.
<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2
if($result['id']=="guest") echo "hi guest";
if($result['id']=="admin"){
solve(18);
echo "hi admin!";
}
}
?>
필터링이 걸려있는데 해석하면 (공백, / , ( , ) , | , & , select , from , 0x)를 필터링해서 사용시 no hack를 출력한다고 합니다.
다음구문은 id 가 guest로 고정되어 있고 우리가 입력할 창에 no 값을 입력시
True 일때 DB에서 no값이 있는 id를 result 변수에 배열로 저장된다고 되어 있습니다.
맨끝 주석처리 된 부분을 보시면 admin`s no = 2라고 주어져 있습니다.
즉 우리는 no=2가 되도록 만들면 되는 것입니다.
그러나 이전설명에 id 가 guest로 고정되어 있어 문제가 발생합니다.
해서 구글링으로 해결법을 찾았습니다.
현재 ( id='guest' and no=입력값 ) 상태인데
T and no=F or T 상태로 만들면
고정된 id값과 상관없이 우리가 원하는 값을 도출하는 것이 가능해집니다.
해서 F가 나올 수 있는 -1을 사용해
SQL 인젝션 삽입구문은 -1 or no=2 가 됩니다.
그러나 여기서 공백이 걸립니다.
실제로 삽입해보면 no hack가 출력되고 실패합니다.
소스코드를 봤을 때 알았어야 했던건데 get 방식으로 받는 경우 url에 직접입력해도 결과가 같다는 겁니다.
단 url에 입력할때는 url 인코더를 거쳐야 하기에 이를 찾아보겠습니다.
우리가 써야하는 건 공백인데 필터링에 걸려있다고 설명했는데 변환해도 걸릴지 안걸릴지는
공부가 부족해 잘모르겠습니다.
그러니 안전하게 tab을 사용해보겠습니다.
SQL문에서는 ( )와 tab을 사용해도 공백과 같은 효과를 내기 때문에 문제가 없을 겁니다.
해서 url에 삽입할 코드는 -1%09or%09no=2 가 됩니다.
이전에 삽입한 결과를 지우고 url 인코딩 한 값을 전달해보면
문제가 해결되었습니다!!
'Wargame(Web) > Webhacking.kr Writeup' 카테고리의 다른 글
Webhacking Writeup 26번 문제 (0) | 2022.07.20 |
---|---|
Webhacking Writeup g00gle1 문제 (0) | 2022.07.07 |
Webhacking Writeup 15번 문제 (0) | 2022.07.06 |
Webhacking Writeup 14번 문제 (0) | 2022.07.06 |
Webhacking Writeup 12번 문제 (0) | 2022.07.06 |