sql injection bypass WAF

2024. 10. 29. 14:46·DreamHack/WEB

 

 

 

 

 

 

 

 

 

 

 

문제 화면이다.

 

소스코드와 SQL를 하면 봐보자.

 

 

 

 

 

 

 

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를 이용해서 필터링을 만들어 놓은 거 같다.

 

보면 대문자에 대한 내용은 적혀있지 않다.

 

uid 를 조회하는 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;

 

SQL file 을 보면 user 테이블에 admin 이 존재하는 걸 확인할 수 있다.

 

admin의 upw 이 플래그에 내용을 담고 있다.

 

문제화면으로 돌아가 확인해 보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

대문자 ADMIN을 입력하니 uid 가 잘 출력이 되고 있다 

 

URL encode 도 잘 나오고 있다.

 

먼저 필터링을 우회하려면 공백( )을 우회해야 한다. -> Tab으로 대체

 

명령어 대문자 -> select -> SELECT , FROM , UNION

 

UNION을 사용하려면 SQL 쿼리의 규칙을 지켜야 한다.

 

반환시킨 칼럼의 수가 동일해야 한다.

 

Ex) UNION SELECT upw FROM user WHERE uid='ADMIN';

 

이런 식으로 명령어를 삽입하면 칼럼의 수가 동일하지 않아 에러를 일으킨다.

 

칼럼은 idx, uid, upw 가 있는데 upw 만 넣으면 안 된다는 것이다.

 

따라서

 

UNION SELECT NULL,NULL,upw FROM user WHERE uid='ADMIN';

 

이런 식으로 해야 정상적으로 upw 가 반환이 된다.

 

이걸 토대로 SQL injection을 하면...

 

 

 

 

 

 

 

 

 

 

 

'DreamHack > WEB' 카테고리의 다른 글

php7cmp4re  (0) 2024.11.05
blind sql injection advanced  (0) 2024.10.23
command-injection-chatgpt  (0) 2024.10.23
error based sql injection  (0) 2024.10.18
simple_sqli_chatgpt  (0) 2024.10.17
'DreamHack/WEB' 카테고리의 다른 글
  • php7cmp4re
  • blind sql injection advanced
  • command-injection-chatgpt
  • error based sql injection
G_OM
G_OM
최대한 설명 열심히 하려고 합니다. 궁금한 거 있으면 언제든지 물어보셔도 좋습니다.
  • G_OM
    끄적끄적
    G_OM
  • 전체
    오늘
    어제
    • 분류 전체보기 (160)
      • 모의해킹 (20)
      • CTF (22)
      • Wargame (69)
        • Linux_bandit (33)
        • Webhacking.kr (36)
      • DreamHack (52)
        • WEB (14)
        • Reverising (9)
        • System (0)
      • Mobile_security (14)
        • Drozer_Android (4)
        • Frida_Android (1)
        • IOS (2)
        • tool (1)
      • 정보보안기사 (2)
      • IT? (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.0
G_OM
sql injection bypass WAF
상단으로

티스토리툴바