Description

Category: Web

Source: webhacking.kr

Points: 100

Author: Jisoon Park(js00n.park)

Description:

Write-up

이름부터 친절하게 SQL INJECTION 문제이다.

출제자가 매우 친절한지 소스코드 링크까지 바로 보여준다. 봐주는게 예의.

<html> 
<head> 
<title>Challenge 18</title> 
<style type="text/css"> 
body { background:black; color:white; font-size:10pt; } 
input { background:silver; } 
a { color:lightgreen; } 
</style> 
</head> 
<body> 
<br><br> 
<center><h1>SQL INJECTION</h1> 
<form method=get action=index.php> 
<table border=0 align=center cellpadding=10 cellspacing=0> 
<tr><td><input type=text name=no></td><td><input type=submit></td></tr> 
</table> 
</form> 
<a style=background:gray;color:black;width:100;font-size:9pt;><b>RESULT</b><br> 
<? 
if($_GET[no]) 
{ 

if(eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack"); 

$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); 

if($q[0]=="guest") echo ("hi guest"); 
if($q[0]=="admin") 
{ 
@solve(); 
echo ("hi admin!"); 
} 

} 

?> 
</a> 
<br><br><a href=index.phps>index.phps</a> 
</cener> 
</body> 
</html> 

텍스트박스로 입력하는 값이 no로 넘어간다. 1을 넣어보면 'hi guest'라는 메세지가 나오는 것으로 보아, guest의 no는 1인걸 알 수 있다.

admin의 no는 아마도 0이거나 2일 것이다. admin 계정을 얻기 위해서는 sql query의 where 절에 "... or id=0" 정도의 문자열을 넣어줘야 할텐데, fetch 바로 윗 라인에 필터링 구문이 있다.

sql 쿼리에서 공백을 대체하는 문자로는 (0x0a), (0x09), (0x0d), /**/, (), + 등이 있다고 하는데, 필터링 구문에서 걸러내는 문자열을 제외해서 대충 아무거나 넣어보면 될것 같다.

만만한 사용해보자. 문자열을 그대로 텍스트박스에 넣으면 %5Cn로 인코딩되어 전송되므로, 특수문자 전송을 위해 주소표시줄에 %0a으로 URL 인코딩한 문자열을 보낸다.

원래 뭐라고 나왔었는지는 기억이 안난다.(...)

'writeups > Web' 카테고리의 다른 글

webhacking.kr 024  (0) 2019.11.25
webhacking.kr 020  (0) 2019.11.25
webhacking.kr 017  (0) 2019.11.25
type confusion  (0) 2019.11.25
webhacking.kr 006  (0) 2019.11.25

+ Recent posts