0%

记一道限制长度命令执行的CTF解题过程

本文仅作为技术讨论及分享,严禁用于任何非法用途。

前言

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

一顿操作拿flag

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

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

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

用常用的文件头可以绕过,如GIF89A

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

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

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

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

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

测试发现仅使用GIF作为文件头也能成功绕过文件头校验

然后居然就这么看到疑似flag的东西,提交上去是对的???

进阶getshell

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

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

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

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

本地生成一个名为whoami的文件,使用sh -c *命令可以看到把文件名作为命令执行了

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

根据这个思路,构造文件内容,发现长度超了,16位整好超一位

于是测试其它文件头,发现BM可用

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

访问文件看到执行成功了

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

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

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

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

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

然后就拿个webshell连接工具就行了,这里用的是蚁剑


小结

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