본문 바로가기

WarGame/webhacking.kr

[webhacking.kr] Challenge 53 :: SQL Injection (procedure analyse() 함수)


▼ Challenge 53은 다음과 같습니다.



 php 소스는 다음과 같습니다.


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
<?
if(time()<1260615600exit();
 
$hidden_table="????";
 
if($_GET[answer]==$hidden_table)
{
@solve();
exit();
}
 
if(eregi("union",$_GET[val])) exit();
if(eregi("select",$_GET[val])) exit();
if(eregi("from",$_GET[val])) exit();
if(eregi("/",$_GET[val])) exit();
if(eregi("\*",$_GET[val])) exit();
if(eregi("#",$_GET[val])) exit();
if(eregi("-",$_GET[val])) exit();
if(eregi(",",$_GET[val])) exit();
if(eregi("=",$_GET[val])) exit();
if(eregi("!",$_GET[val])) exit();
if(eregi("\|",$_GET[val])) exit();
if(eregi("by",$_GET[val])) exit();
 
 
$f=@mysql_fetch_array(mysql_query("select test1 from $hidden_table where test2=$_GET[val]"));
 
echo($f[0]);
 
if($f)
{
echo("<br><br><form method=get action=index.php>challenge53 TABLE NAME : <input type=text name=answer size=50><input type=submit></form>");
}
?>
cs


"val" 파라미터가 12~23번 라인에서 필터링되고, 26번 Line에서 SELECT 구문으로 입력됩니다.

그리고 6번 Line에서 "$hidden_table"을 알아내면 문제가 풀리게 됩니다.


예전 글 중에 MySQL에서 DB명과 Table명, Column명을 알아내는 방법에 대해 소개한 적이 있었습니다. 

(http://limjunyoung.tistory.com/4)


이와 같은 방법으로

UNION SELECT table_name FROM information.schema.tables

라고 입력하면 쉽게 Table명을 알아낼 수 있지만, "union"과 "select"가 필터링되어 있습니다.



본 문제는 다른 블로그의 글(http://hyunmini.tistory.com/46)을 참고하여 풀었습니다.


MySQL에서 제공하는 procedure analyse() 라는 함수 입니다.


 바로 사용해 보면 다음과 같은 결과가 나옵니다. 

( 사진 크기 문제로 중간에 짜르도록 하겠습니다. )



언뜻 보기에 Field의 속성 정보가 나와 있는 듯 합니다.


여기서 우리에게 필요한 정보는 Field_name을 보시면 web.hidden.test1 이라고 나와 있습니다.

이것은 각각 DB명.Table명.Field명 입니다.