记一个限制长度命令执行的骚操作
2021-07-30 15:37:54 Author: www.freebuf.com(查看原文) 阅读量:27 收藏

freeBuf

主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0x00 前言

本文来源于一道CTF题,这是一道文件上传题,限制了上传内容长度小于15个字符,且校验文件头,上传文件拓展名采用黑名单限制,最终使用了一个巧妙的方法成功getshell。

0x01 一顿操作拿flag

首先题目打开后页面如下,扫描了一下目录未发现其它文件

上传一张图片,提示长度不能大于等于15

1626586645_60f3be1562044cce229e2.png!small?1626586644121

然后把文件内容改短一点,可以看到是会校验文件内容的

1626588682_60f3c60a802b5589e2891.png!small?1626588681278

用常用的文件头可以绕过,如GIF89A1626586683_60f3be3be18be4e2ab8da.png!small?1626586683223

然后再测测文件名,发现php后缀是会拦截

1626586777_60f3be99c1ee2eb88812f.png!small?1626586776538

简单测试发现是黑名单,那就简单的pht/phtml等多种拓展名可绕过

1626586805_60f3beb57c5b4693c51ee.png!small?1626586804230

因为限制了长度,所以使用php短标签php标签不闭合也能执行,可以尽可能缩短内容长度

1626590437_60f3cce5b378051a08128.png!small?1626590436617

然后根据返回的文件路径,访问文件,可以看到php代码确实执行了

1626586893_60f3bf0dea1a6713a199e.png!small?1626586893507

再想执行稍长一点的命令,发现已经超长了,所以接下来的问题就是缩短文件内容长度

1626586976_60f3bf60a40270069bbca.png!small?1626586975589

测试发现仅使用GIF作为文件头也能成功绕过文件头校验1626586993_60f3bf7126231fd5ec346.png!small?1626586991872

然后居然就这么看到疑似flag的东西,提交上去是对的???
1626587009_60f3bf81214d7922e7fb7.png!small?1626587007862

0x02 进阶getshell

看到这个flag我不禁陷入沉思,题目这么出有什么意思???这不是单纯恶心人么???

于是想是否还有其它方式能够绕过长度拦截,从而getshell呢?

既然文件内容长度是有限制的,但是文件名确没有限制,那么是否能通过控制文件名来执行想要的命令呢?

于是研究起linux命令,发现sh -c *可以让当前目录的文件名作为命令执行

本地生成一个名为whoami的文件,使用sh -c *命令可以看到把文件名作为命令执行了
1626587048_60f3bfa8ea5f8c3ef8e19.png!small?1626587047604

因为sh -c本身就会把-c的值作为命令执行,*号统配符代表了当前目录所有的文件名,所以便执行成功

1626587071_60f3bfbf0faa089ea7e8e.png!small?1626587069699根据这个思路,构造文件内容,发现长度超了,16位整好超一位

1626587131_60f3bffb49bcf75fdbbfa.png!small?1626587130094于是测试其它文件头,发现BM可用

1626587142_60f3c0065543c1b5ca014.png!small?1626587141147接下来便是构造文件名了,我们既要文件名后缀为php可执行的.pht,又要执行命令,可用使用;号来分割命令,先试试whoami;.pht,通过;号分割后,即便后面的.pht不能正常执行也不影响前面的命令执行

2021-07-18-13-12-42.png

访问文件看到执行成功了

1626587191_60f3c03748c08f0349490.png!small?1626587189996

然后就是写shell,因为要写到文件名所以把文件内容base64编码一下再通过重定向写入文件1.pht

echo PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==|base64 -d >1.pht;.pht

1626587213_60f3c04d5292d75000811.png!small?1626587212149

发送上传包,成功写入这个畸形的文件名及内容

1626587291_60f3c09b628653d5ede18.png!small?1626587290336

接下来要访问一下,才能让它执行并生成1.pht,这里需要把空格URL编码,然后200访问成功

1626587300_60f3c0a4283ecaebfb01e.png!small?1626587298918

再访问一下上传命令的1.pht,200访问成功

1626587306_60f3c0aada062c17b8137.png!small?1626587305660

然后就拿个webshell连接工具就行了,这里用的是蚁剑
1626587318_60f3c0b6c77aa17910f68.png!small?16265873174941626587325_60f3c0bd01989a8d60044.png!small?16265873236791626587331_60f3c0c3496a353e385ec.png!small?1626587330379

0x03 修复建议

白名单制限制上传文件的拓展名

强制修改文件名,如使用随机字符串作为文件名

0x04 小结

本文介绍了一种限制上传文件内容长度的绕过思路,如有雷同,纯粹巧合。


文章来源: https://www.freebuf.com/vuls/281174.html
如有侵权请联系:admin#unsafe.sh