文件操作漏洞总结
本文涉及内容,仅限于网络安全从业者学习交流,切勿用于非法用途…
0x01 文件上传漏洞
1. 漏洞简介
File upload(任意文件上传漏洞),Web 应用程序在处理用户上传的文件时,没有判断文件的扩展名或文件类型是否在允许的范围内,就把文件保存在服务器上,导致恶意用户可以上传任意文件,甚至上传脚本木马到web 服务器上,直接控制 web 服务器。
a. 攻击场景
1 | (1) 上传文件是Web脚本语言,Web服务器解释并执行了用户上传的脚本,导致代码执行 |
b. 利用条件
1 | (1) 上传的文件能够被Web容器解释执行,文件上传后所在的目录需是Web容器所覆盖到的路径 |
c. 漏洞类型
1 | 1.服务器配置不当 |
2. 绕过姿势
a. 客户端绕过
1 | 1. 通过火狐插件NOscript插件或者禁用IE中JS脚本 |
b. 服务端绕过
(1) 黑名单扩展名绕过
1 | 1) 利用黑名单未包含的扩展名进行绕过:如iis6.0中的asa 和cer, |
(2) 利用系统文件命名规则绕过
1 | 1) windows系统下,如果文件名以"."或者空格作为结尾,系统会自动删除"."不空格,利用此特性也可以绕过黑名单验证;apache中可以利用点结尾和空格绕过,asp和aspx中可以用空格绕过 |
(3) 服务端MIME文件类型(Content-Type)绕过
1 | 1)MIME作用 |
(4) 利用文件包含漏洞绕过
1 | 1) 运行上传文件包含脚本木马和一句话木马 |
c. 白名单绕过
(1) 利用web服务器解析漏洞
1 | 1) nginx空字节漏洞 |
(2) .htaccess 文件重写绕过
1 | .htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录访问、禁止目录列表、配置默认文档等功能 |
(3) 文件头检测绕过
1 | 文件头过滤主要是通过验证图片的文件头的方式来判断是不是图片文件,针对这种情况,在要上传文件的文件头里面加上图片文件头即可绕过;如图片文件是否文件头含有gif89,可以通过一句话图片木马生成工具edjpgcom或者通过编辑器在木马内容基础上再加一些文件信息 |
(4) CMS、编辑器漏洞绕过CMS漏洞
1 |
|
(5) 对渲染/加载测试攻击内容检查绕过
通过向图片中加入代码注入,这里一般为一句话图片木马,可能正常访问图片
d. WAF绕过
(1) WAF检查的位置
1 | 文件名:解析文件名,判断是否在黑名单内 |
(2) 绕过WAF方法
1 | 1) 填充垃圾数据绕过 |
3. 防御及修复
当一个文件以HTTP协议进行上传时,将以POST请求发送至Web服务器,Web服务器接收到请求并同意后,用户与Web服务器将建立连接,并传输数据,针对文件上传过程检测校验措施如下:
a. 客户端校验
1 | 通过javascript来校验上传文件的后缀是否合法,可以采用白名单/黑名单的方式;在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包 |
b. 服务端校验
1 | 1) 文件头content-type字段校验(image/gif) |
c. WAF拦截
使用不同的WAF产品来进行过滤,通常是独立于服务程序的一段中间程序或者硬件
d. 漏洞修复
1 | (1) 将文件上传的目录设置为不可执行:只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响 |
0x02 文件读取漏洞
任意文件读取是属于文件操作漏洞的一种,任意文件读取漏洞可以读取配置信息甚至系统重要文件。
1. 敏感文件
用户目录下的敏感文件
1 | .bash_history |
应用的配置文件
1 | /etc/apache2/apache2.conf |
应用的日志文件
1 | /var/log/apache2/access.log |
站点目录下的敏感文件
1 | .svn/entries |
特殊的备份文件
1 | .swp |
Python的Cache
1 | __pycache__\__init__.cpython-35.pyc |
2. 文件读取函数
readfile()、file_get_contents()、fopen()中,$filename没有经过校验或者校验不合格,用户可控制变量读取任意文件
0x03 文件包含漏洞
为了更好地使用代码的重用性,引入了文件包含函数,通过文件包含函数将文件包含进来,直接使用包含文件的代码。
1. 漏洞成因
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。
2. PHP危险函数
1 | include() |
3. 漏洞分类
本地文件包含漏洞(LFI)
指能打开并包含本地文件的漏洞,较为普遍。
文件包含可以包含任意文件,如图片,文本文件,压缩包等等,如果文件中有服务器能识别的脚本语言,就按照当前脚本语言执行,否则就直接显示出源代码。
远程文件包含漏洞(RFI)
指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在,危害性会很大。
利用条件较苛刻,需要php.ini中配置:
1 | allow_url_fopen=On |
4. PHP伪协议
PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。
1 | file:// — 访问本地文件系统 |
a. php://filter
利用条件:
只是读取,所以需要开启allow_url_fopen
,对 allow_url_include
不做要求
用法:
1 | index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php |
通过指定末尾文件,可以读取经base64加密后的文件源码,能够读取敏感文件
b. php://input
可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行
利用条件:
需要开启allow_url_include=on,对allow_url_fopen不做要求
用法:?file=php://input
数据利用POST传过去,可以写入木马、命令执行
c. zip://伪协议
zip://可以访问压缩文件中的文件
条件: 使用zip协议,需要将#编码为%23,所以需要PHP 的版本> =5.3.0,要是因为版本的问题无法将#编码成%23,可以手动把#改成%23。
用法:?file=zip://[压缩文件路径]#[压缩文件内的子文件名]
d. phar://伪协议
与zip://协议类似,但用法不同,zip://伪协议中是用#把压缩文件路径和压缩文件的子文件名隔开,而phar://伪协议中是用/把压缩文件路径和压缩文件的子文件名隔开,即 file=phar://[压缩文件路径]/[压缩文件内的子文件名]
e. data:text/plain
和php伪协议的input类似,也可以执行任意代码,但利用条件和用法不同
条件:allow_url_fopen参数与allow_url_include都需开启
用法1:?file=data:text/plain,<?php 执行内容 ?>
用法2:?file=data:text/plain;base64,编码后的php代码
经base64编码后的加号和等号要手动的url编码
f. file://伪协议
file:// 用于访问本地文件系统,且不受allow_url_fopen与allow_url_include的影响。
用法:?file=file://文件绝对路径
5. 防御修复
1、PHP 中使用 open_basedir 配置限制访问在指定的区域
2、过滤.(点)/(反斜杠)\(反斜杠)等特殊字符
3、尽量关闭allow_url_include配置
0x04 目录穿越漏洞
1. 简介
目录穿越(目录遍历/directory traversal/path traversal)是通过使用 ../ 等目录控制序列或者文件的绝对路径来访问存储在文件系统上的任意文件和目录,攻击者可以利用该漏洞读取运行应用程序的服务器上的任意文件。
2. 攻击载荷
常用路径
1 | /../../../../../../../../../../../../../../../../../etc/passwd%00 |
URL参数
1 | ../ |
Nginx Off by Slash
1 | https://vuln.site.com/files../ |
UNC Bypass
1 | \\localhost\c$\windows\win.ini |
3. 绕过方式
基础目录遍历
直接利用 ../ 返回上一级来遍历任意文件
1 | ../../../etc/passwd |
绝对路径
web网站有时候会采取目录遍历的防御措施,如过滤 ../ 上一级等关键字,然后简单的过滤通常会被绕过。可以直接采用绝对路径,无须 ../ 返回上一级目录遍历
1 | /etc/passwd |
双写../绕过
遇到防御措施是直接将 ../ 替换为空的情况,可以直接采用双写直接绕过:
1 | ....//....//....///etc/passwd |
绝对路径配合 ../
有些 web 在获取文件时,会首先判断是否以一个固定的路径开头,那么就可以配合 ../ 来返回上一级遍历任意文件
1 | /var/www/html/../../../etc/passwd |
截断文件后缀
某些 web 对文件类型作了限制,只有当后缀为图片时才解析,可以利用 %00 来截断
1 | ../../../etc/passwd%00.jpg |
URL编码绕过
可以采用 URL 编码来绕过服务器对 . 或者 / 的检测
1 | . => %2c |
16位Unicode编码
1 | \u002e |
超长UTF-8编码
1 | \%e0%40%ae |
0xFF Reference
- https://portswigger.net/web-security/file-path-traversal
- https://book.hacktricks.xyz/pentesting-web/file-upload
- https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html
- Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out
- https://highon.coffee/blog/lfi-cheat-sheet/
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20Insecure%20Files
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Directory%20Traversal
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion
- https://github.com/almandin/fuxploider
- https://github.com/c0ny1/upload-labs
- https://github.com/c0ny1/upload-fuzz-dic-builder