관리 메뉴

Hax0r

[풀이] Webhacking.kr 50번 문제 본문

0x00 개발/Security

[풀이] Webhacking.kr 50번 문제

영준이 2017.10.10 11:26

50번 문제는 이전 문제보다 150스코어 높은 450스코어의 해당하는 문제이다.

문제를 보면 폼이 하나 보이고, 그 위에 큰 글자로 "SQL INJECTION" 이라 적혀 있다.

그렇다.


이 문제 또한 "SQL INJECTION" 문제인 것 이다.

폼은 "id", "password" 란이 보이고 기본 값으로는 "guest" 로 기재되어있다.


Get parameter 의 id 키 값을 mb_convert_encoding 함수를 통해 재 대입하는데,

이 때  euc-kr 인코딩에서 utf-8인코딩으로 변환하는 과정에서의 취약점이 존재합니다.



<?

if(time()<1258110000) exit();

?>

<!-- index.phps -->


<?

if($_GET[id] && $_GET[pw])

{

 

$_GET[id]=mb_convert_encoding($_GET[id],'utf-8','euc-kr');



foreach($_GET as $ck)

{

if(eregi("from",$ck)) exit();

if(eregi("pw",$ck)) exit();

if(eregi("\(",$ck)) exit();

if(eregi("\)",$ck)) exit();

if(eregi(" ",$ck)) exit();

if(eregi("%",$ck)) exit();

if(eregi("=",$ck)) exit();

if(eregi(">",$ck)) exit();

if(eregi("<",$ck)) exit();

if(eregi("@",$ck)) exit();

}



if(eregi("union",$_GET[id])) exit();

 

$data=@mysql_fetch_array(mysql_query("select lv from members where id='$_GET[id]' and pw=md5('$_GET[pw]')"));



if($data)

{

if($data[0]=="1") echo("level : 1<br><br>");

if($data[0]=="2") echo("level : 2<br><br>");


if($data[0]=="3")

{

@solve();

}

 

 

if(!$data)

{

echo("Wrong");

}

 

}

 

?>



php 에서 magic_quotes_gpc 설정하여 ', ", /, %00등의 값이 들어가게 되면 /와 함께 붙게 되어 injection을 방어합니다.

멀티바이트를 사용하는 언어셋 환경에서는 함수가 \ 앞에 %a1~%fe의 값이 들어오게 되면 %a1\이 한 개의 문자로 취급하여 인코딩해서 \를 치환해버린다.


pw 를 md5로 인코딩 하는 부분을 주석 처리하여 id와 pw가 이어지게하여 인젝션을 시도한다.



select lv from members where id='%a1'/*' and pw=md5('*/union select 3 #') 



저작자 표시 비영리 변경 금지
신고