| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 생성형AI
- 예외처리
- 패키지
- sqld
- 수업복습
- 꽉뚝짝 시장
- 함수
- node.js
- SK쉴더스
- 성능평가지표
- dropna
- pandas
- 루키즈
- echo 명령어
- Package
- gdgm
- tunder client
- 지도학습
- 루키즈33기
- OT후기
- 블록(Block)
- 방콕
- 태국
- 레이블인코딩
- 보안공부
- Linked List
- List
- 클래스
- git push -u
- 데이터분포
- Today
- Total
개발 블로그
[DreamHeck] sql injection bypass WAF 본문
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 |