漏洞原理
在目前的很多业务系统中,很多上传点都无法进行利用,最常见的就是上传一个文件不返回上传路径,即使我们成功上传了木马也无法进行后续连接。虽然不返回路径,但是上传的文件应当可以进行读取的,所以也就衍生出很多网站采用一个接口的方式进行文件的下载和读取的需求,但是这种方式真的安全吗?
在日常中,我们经常会遇到以下几种下载文件的url格式
http://xxx.com/upload/xxx.pdf
http://xxx.com/readfile?id=1407
http://xxx.com/downfile?name=abc.pdf
首先说第一种URL,这种URL存在的安全问题很少,如果非要测的话,可以对后面的文件名和后缀进行Fuzz,从而在文件中获取敏感信息等
接着第二种URL格式,这种URL既然id参数可控,那么我们可以对此参数进行SQL注入,服务器既然接收了id参数,那么应该会对id参数进行数据库查询操作。如果这个id值有规律,那么也可以对id值进行遍历操作。
最后第三种url格式,此种安全问题就是可能存在任意文件下载漏洞,也是本文着重讲解的主要点。
在Linux和Windows系统中,可以用绝对路径和相对路径来表示一个文件的地址,此处不作相对路径和绝对路径的讲解。./
在系统中表示当前目录,../
为当前目录的上一级目录。这样的话安全问题就显而易见了,我们只需要在我们控制的文件名前加上../
跳到上一级目录,然后一直跳就可以跳到根路径,想下载&读取需要的文件就可以造成任意文件读取漏洞。
漏洞位置
根据功能点判断
文件上传后的返回URL中、文件下载功能,文件预览功能,文件读取功能
如果上诉功能点存在那么可以抓包根据下面的URL判断
根据URL判断
download.php?path=
download.php?file=
down.php?file=
readfife.php?file=
read.php?filename=
绕过思路
Fuzz文件
简单粗暴,但是BP发包的时候注意编码问题,取消勾选自动URL编码


URL编码绕过
方法 | Payload |
---|---|
使用 %2e 代替 . | ?name=%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd |
使用 %2f 代替 / | ?name=..%2f..%2f..%2f..%2f..%2fetc%2fpasswd |
使用 %2e%2e%2f 代替 ../ | ?name=%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd |
常用绕过一般是后两种,点一般不会被过滤,因为文件名中间也会存在一个 .
二次编码绕过
方法 | Payload |
---|---|
使用 %25%32%65 代替 . | ?name=%252e%252e/%252e%252e/%252e%252e/%252e%252e/etc/passwd |
使用 %25%32%66 代替 / | ?name=..%252f..%252f..%252f..%252f..%252fetc%252fpasswd |
使用 %25%32%65%25%32%65%25%32%66 代替 ../ | ?name=%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252fetc%252fpasswd |
将 / 替换为 \ 绕过
%00绕过
?name=.%00./.%00./.%00./.%00./etc/passwd
双写绕过
有些代码会进行过滤,会把 ../ 置空,那么利用 ….// 代替 ../ ,利用 ..// 代替 /
这种情况很少见,视情况而定
漏洞利用
Linux 系统下利用
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/issue 系统版本
/etc/fstab
/etc/host.conf
/var/log/xferlog FTP会话,记录拷贝了什么文件
/var/log/cron 计划任务日志
/etc/(cron.d/|crontab) //这两个也是定时任务文件
/var/log/secure 用户登录安全日志
/etc/rc.local 读apache的路径
/etc/motd
/etc/sysctl.conf
/var/log/syslog 记录登陆错误时的密码等信息
/etc/environment 环境变量配置文件 可能泄露大量目录信息
/etc/inputrc 输入设备配置文件
/etc/default/useradd 添加用户的默认信息的文件
/etc/login.defs 是用户密码信息的默认属性
/etc/skel 用户信息的骨架
/sbin/nologin 不能登陆的用户
/var/log/message 系统的日志文件
/etc/httpd/conf/httpd.conf 配置http服务的配置文件
/etc/mtab 包含当前安装的文件系统列表 有时可以读取到当前网站的路径
/etc/ld.so.conf
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history 终端命令操作记录
/root/.mysql_history
/proc/mounts
/porc/config.gz
/var/lib/mlocate/mlocate.db Linux系统全文件路径数据库
/porc/self/cmdline
tomcat/conf/server.xml tomcat连接数据库的密码配置文件
tomcat/webapps/ROOT/WEB-INF/classes/database.properties 同上
tomcat/conf/tomcat-users.xml tomcat管理员账号密码的配置文件
思路:
- 读取/etc/passwd 和/etc/shadow 进行撞库解密,如果能解出来那么直接ssh登录
- 读取/root/.ssh/id_rsa 等ssh登录密钥文件,从而通过密钥免密登录服务器
- 读取/root/.bash_history 终端命令操作记录,进而从命令记录中推测出web源码位置,审计源码进行GetShell
- 读取数据库配置信息,远程连接数据库,进行脱库等操作
- 读取/var/lib/mlocate/mlocate.db 文件信息,获取全文件绝对路径,想下载啥就下啥了
总结:
以上一些利用思路,核心思想不过与对数据的获取或者是权限的获取,黑客的目的也不过如此,数据和权限这两者其实是可以互相转换的,当一个无法进行利用时,那么可以转换一下思路对另一个进行利用
Windows 系统利用
windows的这些路径不一定都存在
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
C:\Windows\win.ini //Windows系统的一个基本系统配置文件
由于Windows服务器特性,可以分盘操作,导致我们黑盒测试很难知道目标服务器是否存在其他盘符,即使知道了盘符也很难知道绝对路径,所以Window系统很难利用此漏洞。
修复建议
- 限定文件访问范围,在php.ini等配置文件中配置open__basedir限定文件访问范围
- 禁止客户端传递../这些敏感字符
- 文件放在web无法直接访问的目录下。