27
SQL INJECTION 문제
소스코드를 살펴보았다. get 방식으로 받고 input text의 name은 no이다. 그리고 index.phps가 있다.
index.phps를 확인해보았다
범상치 않은 코드 무더기. 해석하기 귀찮을 것 같아서 복사해서 html문서로 만들어 브라우저 상에서 열어서 확인했다.
변환한 것을 해석해보았다
<html>
<head>
<title>Challenge 27</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get action=index.php>
<input type=text name=no><input type=submit>
</form>
<?
if($_GET[no]) # get방식으로 no를 받는다
{
if(eregi("#|union|from|challenge|select|\(|\t|/|limit|=|0x",$_GET[no])) exit("no hack");
# no에 다음과 같은게 존재한다면 exit
$q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");
#id가 guest이고 no가 xx인 행을 배열로 만들어라
if($q[id]=="guest") echo("guest");
#배열의 id가 guest이면 'guest' 출력
if($q[id]=="admin") @solve();
#배열의 id가 admin이면 문제 해결
}
?>
<!-- index.phps -->
</body>
</html>
저번에 풀었던 18번 문제와 매우 유사하였다. 필터링 된 문자의 종류만 다를 뿐 푸는 형식은 비슷했다. 그래서 우선 guest의 no를 찾았다. 저번과 같이 1이었다.
이제부터 A and B or C 에서 A와 B를 and 연산해서 False로 만들고 C를 admin으로 추정되는 2를 no로 주면 저번처럼 풀릴 것 같았다.
필터링을 확인해봤더니 =를 사용하지 못한다. 그래서 like를 쓰기로 하였다.근데 query error가 떴다.
공백이 필터링 된 게 아니여서 공백을 제거하고 다시 시도했다.
확인해봤더니 no를 받는 형식이 )여서 ' 대신 )를 사용했다. 또한 주석인 -- 뒤에 공백이 꼭 들어가야 한다고 해서 공백을 추가했더니 성공하였다.
'wargame > WEBHACKING.kr' 카테고리의 다른 글
[WEBHACKING.kr]21 (0) | 2019.05.29 |
---|---|
[WEBHACKING.kr]22 (0) | 2019.05.27 |
[WEBHACKING.kr]26 (0) | 2019.05.21 |
[WEB]URL 인코딩, 디코딩 (0) | 2019.05.21 |
[WEBHACKING.kr]25 (0) | 2019.05.21 |