官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
0x00 前言
本文来源于一道CTF题,这是一道文件上传题,限制了上传内容长度小于15个字符,且校验文件头,上传文件拓展名采用黑名单限制,最终使用了一个巧妙的方法成功getshell。
0x01 一顿操作拿flag
首先题目打开后页面如下,扫描了一下目录未发现其它文件
上传一张图片,提示长度不能大于等于15
然后把文件内容改短一点,可以看到是会校验文件内容的
用常用的文件头可以绕过,如GIF89A
然后再测测文件名,发现php
后缀是会拦截
简单测试发现是黑名单,那就简单的pht/phtml
等多种拓展名可绕过
因为限制了长度,所以使用php短标签
,php标签
不闭合也能执行,可以尽可能缩短内容长度
然后根据返回的文件路径,访问文件,可以看到php代码确实执行了
再想执行稍长一点的命令,发现已经超长了,所以接下来的问题就是缩短文件内容长度
测试发现仅使用GIF
作为文件头也能成功绕过文件头校验
然后居然就这么看到疑似flag的东西,提交上去是对的???
0x02 进阶getshell
看到这个flag我不禁陷入沉思,题目这么出有什么意思???这不是单纯恶心人么???
于是想是否还有其它方式能够绕过长度拦截,从而getshell呢?
既然文件内容长度是有限制的,但是文件名确没有限制,那么是否能通过控制文件名来执行想要的命令呢?
于是研究起linux命令,发现sh -c *
可以让当前目录的文件名作为命令执行
本地生成一个名为whoami
的文件,使用sh -c *
命令可以看到把文件名作为命令执行了
因为sh -c
本身就会把-c
的值作为命令执行,*
号统配符代表了当前目录所有的文件名,所以便执行成功
根据这个思路,构造文件内容,发现长度超了,16位整好超一位
于是测试其它文件头,发现BM
可用
接下来便是构造文件名了,我们既要文件名后缀为php可执行的.pht
,又要执行命令,可用使用;
号来分割命令,先试试whoami;.pht
,通过;
号分割后,即便后面的.pht
不能正常执行也不影响前面的命令执行
访问文件看到执行成功了
然后就是写shell,因为要写到文件名所以把文件内容base64编码一下再通过重定向写入文件1.pht
echo PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==|base64 -d >1.pht;.pht
发送上传包,成功写入这个畸形的文件名及内容
接下来要访问一下,才能让它执行并生成1.pht
,这里需要把空格URL编码,然后200访问成功
再访问一下上传命令的1.pht
,200访问成功
然后就拿个webshell连接工具就行了,这里用的是蚁剑
0x03 修复建议
白名单制限制上传文件的拓展名
强制修改文件名,如使用随机字符串作为文件名
0x04 小结
本文介绍了一种限制上传文件内容长度的绕过思路,如有雷同,纯粹巧合。