kangsecu's B1og

[webhacking.kr] pro 46 문제풀이 본문

Web Hacking/webhakcing.kr

[webhacking.kr] pro 46 문제풀이

Kangsecu 2018. 2. 24. 02:10

[webhacking.kr] pro 46 문제를 풀어보도록 하겠습니다. 문제에 들어가면 아래와같은 화면이 출력됩니다.


SQL INJECTION이라고 합니다. 무작정 1을 입력해봤습니다. 그랬더니 위 사진과 같이 출력됩니다. 그럼 이제 index.phps를 확인해보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<html>
<head>
<title>Challenge 46</title>
</head>
<body>
<form method=get action=index.php>
level : <input name=lv value=1><input type=submit>
</form>
<?
if(time()<1256900400exit();
 
?>
<!-- index.phps -->
<?
 
$_GET[lv]=str_replace(" ","",$_GET[lv]);
$_GET[lv]=str_replace("/","",$_GET[lv]);
$_GET[lv]=str_replace("*","",$_GET[lv]);
$_GET[lv]=str_replace("%","",$_GET[lv]);
 
if(eregi("union",$_GET[lv])) exit();
if(eregi("select",$_GET[lv])) exit();
if(eregi("from",$_GET[lv])) exit();
if(eregi("challenge",$_GET[lv])) exit();
if(eregi("0x",$_GET[lv])) exit();
if(eregi("limit",$_GET[lv])) exit();
if(eregi("cash",$_GET[lv])) exit();
 
$q=@mysql_fetch_array(mysql_query("select id,cash from members where lv=$_GET[lv]"));
 
if($q && $_GET[lv])
{
echo("$q[0] information<br><br>money : $q[1]");
 
if($q[0]=="admin") @solve();
 
}
?>
 
 
 
</body>
</html>
cs

이렇게 코드가 있습니다. 코드를 확인해보면 union,select,from,challenge,0x,limit,cash 이lv값에 파라미터로 들어가면 exit함수가 실행됩니다.

또한 공백, /,*,%가 들어오면 str_replace함수로 필터링이 됩니다. 그리고 값이 admin이면 문제가 해결됩니다. 

Exploit Vector

lv에 파라미터로 admin값을 넣어주어야합니다. 근데 앞에 쿼리를 거짓으로 만들어주고 공백을 우회하며 admin값을 대입해야합니다.

하지만 그냥 admin을 넣으니까 안되는걸 봐서는 magic_quotes_gpc가 설정되있는것 같습니다. 그래서 char을 이용하여 우회를 해야합니다.


Exploit

아주간단합니다. 앞에 쿼리에 거짓을 위해서 2값을 넣어준후, or연산자를 이용하여 id=admin값을 넣어주어야합니다.

그런데 magic_quotes_gpc 설정을 우회하기 위하여 '가 없는 char과 아스키코드를 이용하여 admin값을 넣어주어야합니다.

또한 공백은 %0a를 이용하여 str_replace를 우회해야합니다. 그렇다면 최종 쿼리문은 2%0aor%0aid=char(97,100,109,105,110) 입니다.

짜잔

webhacking.kr pro 46 Clear!