예전 시큐때 문제가 생각나서 비교적 쉽게 푼 문제이다.
일단 소스를 확인해보자.
<?
if($_POST[lid] && $_POST[lphone])
{
$q=@mysql_fetch_array(mysql_query("select id,lv from c59 where id='$_POST[lid]' and phone='$_POST[lphone]'"));
if($q[id])
{
echo("id : $q[id]<br>lv : $q[lv]<br><br>");
if($q[lv]=="admin")
{
@mysql_query("delete from c59");
@clear();
}
echo("<br><a href=index.php>back</a>");
exit();
}
}
if($_POST[id] && $_POST[phone])
{
if(strlen($_POST[phone])>=20) exit("Access Denied");
if(eregi("admin",$_POST[id])) exit("Access Denied");
if(eregi("admin|0x|#|hex|char|ascii|ord|from|select|union",$_POST[phone])) exit("Access Denied");
@mysql_query("insert into c59 values('$_POST[id]',$_POST[phone],'guest')");
}
?>
lv 이 admin 이면 된다. insert 문은 insert into 테이블 values(1,1),(1,1) 이런식으로 () 를 연속으로 써줌으로써
여러개의 값을 삽입할 수 있다. 일단 id 와 phone 둘다 admin 이란 문자열과 # 주석처리를 쓸 수 없다.
id부분에는 nimda phone 부분에는 1,reverse(id)),(a,a 를 넣어 쿼리를 날려보자.
쿼리는 아래와 같이 날라갈것이다.
insert into c59 values('nimda',1,reverse(id)),(a,a,'guest')
이와 같은 쿼리를 날리게 되면 서버에는 nimda 라는 아이디와 a 라는 아이디가 동시에 insert 된다.
reverse(id) 를 통해 nimda 를 거꾸로 반전시켜줌으로써 admin 을 만들었다.
해당 아이디와 암호로 로그인 해보면 Clear
'Wargame(CTF)' 카테고리의 다른 글
Suninatas All Clear (1) | 2014.08.12 |
---|---|
Webhacking.kr All Clear (4) | 2014.07.26 |
Challenge 50 (0) | 2014.07.22 |
itchy's Funny injection 풀이 (0) | 2014.06.18 |
Challenge 13 (0) | 2014.06.15 |