본문 바로가기

wargame/WEBHACKING.kr

[WEBHACKING.kr]27

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