模板语言第一次接触这么多,以前就随便写写用用,套个变量,然后一些绕过姿势也是通过模板语言自带的方法去绕过的,所以感觉有必要小总结一下

    来分析一下所有过滤的内容

    1. re.search(r"\'|\"|args|\[|\_|os|\{\{|request|[0-9]|print|count",name,re.I)

    首先 [{{ 的过滤绕过是比较有意思的
    然后 '" 的过滤是比较常见的
    其余的过滤都有点为了过滤而过滤,不过也能学到一些新的点

    1. 对于 '" 的过滤,这里主要是思路是利用变量或者整数转换为字符然后拼接
    2. 对于 [ 过滤,利用内置属性 __getitem__ 模拟字段访问,或者模板语言获取子属性,如 foo|attr("bar") 可以表示 foo.bar
    3. 对于 {{ 过滤,可以考虑用模板语言其他的定界符,如 {% %} 不过缺点就要手动输出一下
    4. 在没有过滤 request 前,过滤许多关键字都可以通过 http 的一些特殊字段,如 argscookie 等来获取,但过滤之后,需要深入了解模板语言的其他函数才能进行下一步,比如 select 选择器直接使用为对象,Python中对象输出类似与 <generator object select_or_reject at 0x105bc9970> 这种格式,然后 string 转换为字符串,里面有一些可以用的字符,虽然不够26个字母,但可以慢慢凑,然后再通过列表的 pop 方法获取相应下标的字符…这个request配合前面的过滤,这步跨度比较大,直接看web369就好了,记录的很详细,以及为什么要这样用。
    5. 数字的过滤在正常的场景中几乎不会遇到,2333,不过也学到了全角绕过正则,这点在SSRF或许也可以用到
    6. 对于无回显的情况,自己多试试还发现别的师傅脚本有问题,自己完善了个更能兼容所有字母的,也能无视docker环境反弹shell,这里做的还是不错的。23333

    感觉 SSTI 过滤单一符号都不安全,比如仅直接过滤 ( 圆括号,直接通过 request 传参就绕过了

    仔细想了一下,过滤 ( 圆括号和 . 点号,好像会安全很多,因为 ( 没了,很多拼接行不通了,然后 . 没了,request 这类传参类又行不通了。感觉可以~