Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 네트워크보안
- bee-box
- 웹
- 웹해킹
- 드림핵
- 소프트웨어보안
- network
- hacking
- TCP
- dreamhack
- Web
- 시스템해킹
- 소프트웨어
- 리버싱
- WarGame
- reversing
- 네트워크
- webhacking
- System
- ftz
- XSS
- 순서도
- 워게임
- 모의해킹
- Webhaking
- CodeEngn
- 비박스
- 해킹
- 알고리즘
- 시스템
Archives
- Today
- Total
Without a Break
[Dreamhack] sql injection bypass WAF 본문
[문제 코드]
import os
from flask import Flask, request
from flask_mysqldb import MySQL
app = Flask(__name__)
app.config['MYSQL_HOST'] = os.environ.get('MYSQL_HOST', 'localhost')
app.config['MYSQL_USER'] = os.environ.get('MYSQL_USER', 'user')
app.config['MYSQL_PASSWORD'] = os.environ.get('MYSQL_PASSWORD', 'pass')
app.config['MYSQL_DB'] = os.environ.get('MYSQL_DB', 'users')
mysql = MySQL(app)
template ='''
<pre style="font-size:200%">SELECT * FROM user WHERE uid='{uid}';</pre><hr/>
<pre>{result}</pre><hr/>
<form>
<input tyupe='text' name='uid' placeholder='uid'>
<input type='submit' value='submit'>
</form>
'''
keywords = ['union', 'select', 'from', 'and', 'or', 'admin', ' ', '*', '/']
def check_WAF(data):
for keyword in keywords:
if keyword in data:
return True
return False
@app.route('/', methods=['POST', 'GET'])
def index():
uid = request.args.get('uid')
if uid:
if check_WAF(uid):
return 'your request has been blocked by WAF.'
cur = mysql.connection.cursor()
cur.execute(f"SELECT * FROM user WHERE uid='{uid}';")
result = cur.fetchone()
if result:
return template.format(uid=uid, result=result[1])
else:
return template.format(uid=uid, result='')
else:
return template
if __name__ == '__main__':
app.run(host='0.0.0.0')
- 인덱스 페이지에서는 uid 파라미터를 통해 입력 값을 받고, check_WAF 함수의 인자로 전달해 특정 키워드가 포함되어 있는지 검사한다.
- 키워드 검사를 통과하면 실행할 쿼리에 입력 값을 직접 삽입하므로 SQL Injection 취약점이 발생한다.
[풀이]
문제 페이지에서는 사용자가 uid 입력창에 입력한 값을 출력한다.
SQL 인젝션이 발생한다면, 입력 가능한 값이 무엇인지 알아내야 한다.
문제에서는 keywords 리스트에 포함된 문자나 문자열을 모두 검사하므로 keywords 리스트에 없는 값을 사용하는 방법을 찾아야 한다.
공백 문자(Tab)를 포함하여 UNION을 통해 새로운 SELECT 구문을 사용한 우회 코드를 작성했다.
'Union Select null,upw,null From user where uid="Admin"#'
위의 sql을 입력창에 입력하면
플래그를 확인할 수 있다.
'Web > Wargame' 카테고리의 다른 글
[Dreamhack] Flying Chars (0) | 2023.08.26 |
---|---|
[Dreamhack] XSS Filtering Bypass (0) | 2023.08.25 |
[Dreamhack] error based sql injection (0) | 2022.11.22 |
[Dreamhack] blind sql injection advanced (0) | 2022.11.17 |
[Dreamhack] funjs (0) | 2022.11.16 |