CG CTF-Web-上传绕过

WP

看完题目和进入环境,便知道这是一道文件上传的题目。
我首先写了个一句话木马在shell.php(事实证明这题不需要连蚁剑)然后上传shell.php,发现只能上传jpg,png等图片类型。
这个时候我们不知道这题的类型判断是前端还是后端,因此先把文件名改成shell.jpg,然后burp抓包,再把名字改成shell.php。
在这里插入图片描述
发现还是不行,因此知道是后端检验。这时候我改了php的大小写,再次尝试还是不行。因此大概率是后端直接检测后缀名而且大概率是白名单检测。
这时候我直接上传shell.jpg,情况如下:
在这里插入图片描述
可以看到文件存储的地址,而且文件名也被改了。而且。。后缀名是php?

Stored in: ./uploads/8a9e5f6a7a789acb.phparray(4) {

再往下看,分别是上传的目录,上传的文件名,上传的文件名的后缀和去除后缀之后的文件名。
又看到了这句“必须上传成后缀名为php的文件才行啊!”

想到这里,我看懂了它好像在后端判断后缀是不是jpg之类的,然后再把.jpg后缀截掉。这样的话我想到了把文件名改成shell.php.jpg试试:
在这里插入图片描述
可以看到相应中的第23行的filename已经变成了shell.php。但是…为什么还是说必须上传成后缀名为php的文件才行啊!????
这时候再仔细想想,难道它后端的第二次判断,判断的不是filename,而是第19行的basename?

那么basename又是什么?如果判断的就是你上传的文件名的话,它要求你上传的文件名又以.php结尾,又要以.jpg结尾,可能吗?

理论上不太可能,但是万一它的判断有漏洞呢?要知道,CTF不是实际渗透,它一定是有漏洞的。既然如此,让两次判断的时候后缀名不同,或许可以联想到00截断。
但是00截断怎么用呢?我看了看下面的文章,非常推荐。
http://www.admintony.com/%E5%85%B3%E4%BA%8E%E4%B8%8A%E4%BC%A0%E4%B8%AD%E7%9A%8400%E6%88%AA%E6%96%AD%E5%88%86%E6%9E%90.html
不过这篇文章不知道是不是需要挂代理才能看到,我不挂代理的话进不去,不知道是不是我的问题,因此这里直接引用这篇文章里的关键内容。

有很多朋友喜欢在文件名中加%00进行截断,笔者认为这种方式是不对的,为什么呢?比如攻击者构造文件名:admintony.php%00a.jpg,在提取后缀名的时候遇到%00则认为字符串结束了,那么他提取到的后缀名会是.php,.php后缀又不允许上传所以上传失败了(这里有必要提一句,有人可能会说在一些情况下,%00截断文件名可以成功,这种案例你试一下是不是任意文件上传,西普的00截断实验就是一个任意文件上传的上传点,既然是任意文件上传又何必用00截断绕过呢?)
那么00截断应该在什么时候使用呢?笔者认为,数据包中必须含有上传后文件的目录情况才可以用,比如数据包中存在path: uploads/,那么攻击者可以通过修改path的值来构造paylod: uploads/aa.php%00
在这里插入图片描述
为什么修改path才可以,因为程序中检测的是文件的后缀名,如果后缀合法则拼接路径和文件名,那么攻击者修改了path以后的拼接结果为:uploads/aaa.php%00/2018051413370000.php,移动文件的时候会将文件保存为uploads/aaa.php,从而达到Getshell效果。

知道了上述内容后我们再来看这题,我们往左边找找,发现了目录:
在这里插入图片描述

我们进行一下修改看看效果
在这里插入图片描述
我们发现basename的前面加上了我们在/uploads/后面加上的内容。因此,我们可以这样构造:
在这里插入图片描述
进行00截断,但是发现不行。
为什么不行呢?上面的那篇文章下面也有解答,这里引用一下:

在网上常见用Burp将数据包中的%00进行urldecode的操作,那为什么要进行这一个操作?网上也常见直接放入%00就可以截断成功的案例,为什么呢?
%00(urldecode)
首先解释为什么要进行urldecode操作呢?其原因在于上传的表单中有一个enctype的属性,并且需要enctype=“multipart/form-data” (不对表单中数据进行编码),path大多数都是存放在表单中的,因此需要在数据包中进行urldecode操作使%00变成字符串结束符号。

那么为什么网上也有直接添加%00而不进行urldecode操作呢?因为path也可以存放在URL或者Cookie中,而在提交数据的时候,浏览器会对数据做一次urldecode的操作,而到服务端,会对数据进行一次urldecode的操作,因此如果path在非enctype=multipart/form-data的表单中或URL or Cookie中的时候,就可以直接写%00不需要进行URLdecode操作,让服务端对%00进行URL解码即可。

因此,我们还需要将%00解码。
在这里插入图片描述

之后再发送就可以正确获得flag了。
在这里插入图片描述

后记

这题还是很好的,以前的我对于文件上传中的00截断有些似懂非懂,经过这题之后对00截断有了比较深的理解。

猜你喜欢

转载自blog.csdn.net/rfrder/article/details/108430958