模板语言第一次接触这么多,以前就随便写写用用,套个变量,然后一些绕过姿势也是通过模板语言自带的方法去绕过的,所以感觉有必要小总结一下
来分析一下所有过滤的内容
re.search(r"\'|\"|args|\[|\_|os|\{\{|request|[0-9]|print|count",name,re.I)
首先 [
和 {{
的过滤绕过是比较有意思的
然后 '
和 "
的过滤是比较常见的
其余的过滤都有点为了过滤而过滤,不过也能学到一些新的点
- 对于
'
和"
的过滤,这里主要是思路是利用变量或者整数转换为字符然后拼接 - 对于
[
过滤,利用内置属性__getitem__
模拟字段访问,或者模板语言获取子属性,如foo|attr("bar")
可以表示foo.bar
- 对于
{{
过滤,可以考虑用模板语言其他的定界符,如{% %}
不过缺点就要手动输出一下 - 在没有过滤
request
前,过滤许多关键字都可以通过 http 的一些特殊字段,如args
、cookie
等来获取,但过滤之后,需要深入了解模板语言的其他函数才能进行下一步,比如select
选择器直接使用为对象,Python中对象输出类似与<generator object select_or_reject at 0x105bc9970>
这种格式,然后string
转换为字符串,里面有一些可以用的字符,虽然不够26个字母,但可以慢慢凑,然后再通过列表的pop
方法获取相应下标的字符…这个request配合前面的过滤,这步跨度比较大,直接看web369就好了,记录的很详细,以及为什么要这样用。 - 数字的过滤在正常的场景中几乎不会遇到,2333,不过也学到了
全角
绕过正则,这点在SSRF
或许也可以用到 - 对于无回显的情况,自己多试试还发现别的师傅脚本有问题,自己完善了个更能兼容所有字母的,也能无视docker环境反弹shell,这里做的还是不错的。23333
感觉 SSTI 过滤单一符号都不安全,比如仅直接过滤 (
圆括号,直接通过 request
传参就绕过了
仔细想了一下,过滤 (
圆括号和 .
点号,好像会安全很多,因为 (
没了,很多拼接行不通了,然后 .
没了,request
这类传参类又行不通了。感觉可以~