관리 메뉴

Hax0r

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

0x00 개발/Security

[풀이] Webhacking.kr 45번 문제

영준이 2017.09.13 23:27

45번은 550 스코어의 해당하는 문제입니다.

문제 내 index.phps 라는 주석이 있는데, 본 경로로 이동하면 아래와 같은 내부 소스 코드가 노출됩니다.



if(time()<1256900400) exit();

?>


<!-- index.phps -->


<?


$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");

}


}




중간 쯤 아래의 코드 라인을 보시면, 본 문제가 멀티 바이트 취약점을 공격하는 문제라는 것을 유추해 볼 수 있습니다.

php 에 `mb_convert_encoding` 내부 함수는 아래와 같은 역할을 합니다.


Convert character encoding (return value is  encoded string.)



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


본 함수에는 취약점이 존재한다.

싱글쿼터(%27) 앞에 %aa 와 같은 값을 기입 시,  magic_quotes_gpc 의 영향을 받지 않고 싱글쿼터를 사용할 수 있다. (멀티바이트의 범위 : %a1 ~ %fe)

admin  문자열도 필터링을 하고 있으므로 concat+char 을 이용하여 아래와 같이 우회하여 문제를 해결한다.


* magic_quotes_gpc

싱글 쿼터('),더블쿼터("),백슬래시(\),와 같은 문자열의 맨 앞에 슬래시(/)를 이스케이프(연결)하여 문자열로 인식 시킴. (e.g. '-> \' (%27 => %5c%27))


우회하여 요청하는 문자열은 아래와 같다.


%aa'%09or%09id%3d%090x61646d696e%23&pw=hax0r



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