Without a Break

[Dreamhack] sql injection bypass WAF 본문

Web/Wargame

[Dreamhack] sql injection bypass WAF

와븨 2022. 11. 24. 18:39

 

 

[문제 코드]

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