WEB安全

zzcms v8.1前台无条件Getshell

问题出在\uploadimg.php  这是upload类中部分代码:


  1.  

而我们进行未知扩展名上传的时候Content-Type头是这样的Content-Type:application/octet-stream

下面判断上传类型如果不为数组中的其中一个的话,就无法上传


  1.  

这是一个很经典的用Content-Type头判断上传类型的案例,绕过方法很简单,拦截包修改Content-Type头为$uptypes的其中一个类型即可

当然,不会这么轻易的就能上传成功,下面还有判断:


  1.  

用strpos判断后缀是否为php,asp,jsp。

如果是的话,输出文件后缀和这种文件不允许上传。常见的黑名单式判断,绕过方式很简单,只要用一个不在黑名单中的文件后缀,即可绕过。


 

前两步绕过后,依然是不能上传的。

因为下面存储的时候用GetImageSize()函数检查了图片属性、


  1.  

若不为图片,直接删除

绕过姿势:

使用十六进制编辑器打开一张图片:

其中8950 4E47 0D0A 1A0A 为png图片的文件流的前几个字(头字节)。

php的Getimagesize()函数就是用这几个字节流来判断文件是否为图片的,这个函数本身就是有漏洞的。

用十六进制编辑器修改头字节之后的字节,这样Getimagesize()也会当成图片来解析,即可绕过上传。

 

具体分析此函数漏洞请看这里:Getimagesize 函数不是完全可靠的

成功上传:

 

上传成功后不会返回路径,这就比较坑爹了,找到文件命名方法:


  1.  

 

把文件上传到uploadfiles目录下以今年的月份为目录名,如:\uploadfiles\2017-6\

文件名是用年月日时分秒+三位随机数来命名,如:20170625091239283.phtml

20170625091239为2017年6月25日9点12分39秒,283为三位随机数。

好吧,这里没有什么优雅的姿势直接获取了,不过三位数的可以直接写个获取上传时间然后爆破后100-999的三位数,在一分钟内可爆破完吧。

无条件上传:

上面上传分析完了,再来看看怎么无条件。


  1.  

这里判断cookies是为UserName,伪造一个cookie就可以搞定。

随便伪造一个UserName=xxx就能绕过咯。

当然此代码里连exit都没有

如果懒得伪造的话,就禁用js,也能上传成功。

为方便测试,以附送exp

使用方法:filename.py -u http://localhost/


  1.  

    注:此文转自http://www.lsafe.org/?p=131 原作者为ADminSS

(0)

热评文章

发表评论