반응형
https://webhacking.kr/challenge/web-32/
Challenge 18
webhacking.kr
[문제]
[풀이]
<?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>
소스코드를 보면 GET방식으로 no변수를 받고
preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])
이 부분에서 필터링이 되는 것을 확인할 수 있다.
필터링을 피해서 SQL Injection을 하면 문제가 풀린다.
if($result['id']=="guest") echo "hi guest";
if($result['id']=="admin"){
solve(18);
echo "hi admin!";
}
id가 admin이 되면 문제가 풀린다.
1을 넣으면 guest가 결과값으로 출력된다.
소스코드에 보면 2가 admin 넘버라고 알려준다.
2를 넣어본다.
아무일도 일어나지 않는다.
소스코드의 쿼리문을 보면 where id='guest and no=$_GET[no] 를 확인할 수 있다.
id가 guest이고 no가 1이면 정상적으로 guest가 나오는 것이고
id가 admin이고 no가 2가 되어야 문제가 풀린다.
하지만 id가 guest로 되어있기 때문에 id를 admin으로 바꾸어야 한다.
2 or id='admin'
이런식으로 접근하면 "where id='guest' and no=2"에서 false로 리턴하지만, or id='admin' 으로 id가 'admin'으로 바뀌며
if문에 의해 문제가 풀린다. (no값은 True가 되지 않는 아무런 값이나 넣어주시면 됩니다.)
하지만 필터링이 되어있기 때문에 우회를 해줘야하는데
이 구문에서 띄워쓰기가 필터링된다.
필터링을 우회하기 위해 urlencode 방식으로 \n: 다음줄로 이동시키는 문자 - %0a를 이용해준다.
input에 입력하게 되면 문자열로 받기때문에 url에 적어준다.
문제가 풀린다.
반응형