▼ 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()<1260615600) exit(); $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명 입니다.
'WarGame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] Challenge 55 :: Blind SQL Injection 2 (0) | 2015.12.11 |
---|---|
[webhacking.kr] Challenge 29 :: SQL Injection (subquery) (0) | 2015.12.08 |
[webhacking.kr] Challenge 48 :: Command Injection 1 (0) | 2015.12.06 |
[webhacking.kr] Challenge 35 :: SQL Injection (Multi-Records 삽입) (0) | 2015.12.06 |
[webhacking.kr] Challenge 08 :: SQL Injection (Multi-Records 삽입) (0) | 2015.12.05 |