一些网站的业务需要,可能提供文件查看或下载的功能,如果对用户查看或下载的文件不做限制,就能够查看或下载任意的文件,可以是源文件,敏感文件等等。
任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取配置信息甚至系统重要文件。严重的话,就可能导致SSRF,进而漫游至内网。
漏洞产生原因
任意文件读取
<?php $filename=”test.txt”; readfile($filename); ?>
<?php $filename=”test.txt”; echo file_get_contents($filename); ?>
文件读取函数
readfile()
、file_get_contents()
、fopen()
中,$filename
没有经过校验或者校验不合格,用户可控制变量读取任意文件,如/etc/passwd
、./index.php
、/config.ini
。
一些网站由于业务需求,往往需要提供文件下载功能,但若对用户下载的文件不做限制,则恶意用户就能够下载任意敏感文件,这就是文件下载漏洞。
漏洞产生原因
文件下载的两种方式
1、直接下载:
<a href=”http://www.a.com/xxx.rar”>下载</a>
2、增加header头
<?php $filename = $_GET['filename']; echo '<h1>开始下载文件</h1><br /><br />'; echo file_get_contents($filename); <span class="nb">header</span><span class="p">(</span><span class="s1">'Content-Type: imgage/jpeg'</span><span class="p">);</span> <span class="nb">header</span><span class="p">(</span><span class="s1">'Content-Disposition: attachment; filename='</span><span class="o">.</span><span class="nv">$filename</span><span class="p">);</span> <span class="nb">header</span><span class="p">(</span><span class="s1">'Content-Lengh: '</span><span class="o">.</span><span class="nb">filesize</span><span class="p">(</span><span class="nv">$filename</span><span class="p">));</span>
?>
利用思路
.log
文件,从中寻找一些后台地址,文件上传点之类的地方,如果运气好的话会获得一些前辈们的后门。尝试读取/root/.bash_history
看自己是否具有root权限。
如果没有,就只能利用../
来回跳转读取一些.ssh
下的配置信息文件。
读取mysql下的.bash_history
文件。来查看是否记录了一些可以利用的相关信息。然后逐个下载需要审计的代码文件,但是下载的时候变得很繁琐,只能尝试去猜解目录,然后下载一些中间件的记录日志进行分析。
一些常见利用方式
可以先下载/WEB-INF/classes/applicationContext.xml 文件,这里面记载的是web服务器的相应配置,然后下载/WEB-INF/classes/xxx/xxx/aaa.class对文件进行反编译,然后搜索文件中的upload关键字看是否存在一些api接口,如果存在的话我们可以本地构造上传页面用api接口将我们的文件传输进服务器。
也可以先下载网站的配置文件,在根目录/WEB-INF/Web.xml的(一般都有很多内容,有时含有数据库连接用户名和密码等关键信息)。
在linux中有这样一个命令 locate 是用来查找文件或目录的,它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次。
当不知道路径是什么的情况下,这个可以说是一个非常好用的了,我们利用任意文件下载漏洞将mlocate.db文件下载下来,利用locate命令将数据输出成文件,这里面包含了全部的文件路径信息。
locate 读取方法
locate mlocate.db admin
可以将mlocate.db
中包含admin
内容全部输出来。
利用这个文件可以获取到该服务器任何我们想要的内容并下载出来而不用一个一个去猜解目录,但是这个文件只有root用户才能读取。另一方面我们也可以利用linux内核的一个文件/proc/self/cmdline
当前进程的cmdline
参数,可以获取到路径信息。
总的来说,任意文件下载漏洞的利用主要是为了信息收集,我们通过对服务器配置文件的下载,获取到大量的配置信息、源码,从而根据获取的信息来进一步挖掘服务器漏洞从而入侵。
1、web漏洞扫描器(awvs、appscan、openvas、nessus)
2、手动挖掘从连接和参数名查看
Google search
inurl:”readfile.php?file= inurl:”read.php?filename= inurl:”download.php?file= inurl:”down.php?file=
连接:
readfile.php?file=**.txt
download.php?file=**.rar
参数名:
&RealPath=
、&readpath=
、&FilePath=
、&filepath=
、&Path=
、&path=
、&Inputfile=
、&inputfile=
、&url=
、&urls=
、&Lang=
、&dis=
、&Data=
、&data=
、&readfile=
、&filep=
、&Src=
、&src=
、&menu=
、META-INF=
、WEB-INF
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配置信息
Linux:
/root/.ssh/authorized_keys //如需登录到远程主机,需要到.ssh目录下,新建authorized_keys文件,并将id_rsa.pub内容复制进去
/root/.ssh/id_rsa //ssh私钥,ssh公钥是id_rsa.pub
/root/.ssh/id_ras.keystore //记录每个访问计算机用户的公钥
/root/.ssh/known_hosts
//ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/etc/my.cnf //mysql 配置文件
/etc/httpd/conf/httpd.conf // Apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数
示例代码:
<?php $filename=$_GET['f']; echo file_get_contents($filename); ?>
测试:
readfile.php?f=../../../../../../etc/passwd readfile.php?file=../../../../../../../../etc/passwd%00
readfile.php?f=../index.txt
file://
伪协议 ,读取文件内容
readfile.php?f=file:///etc/passwd
示例代码:
<?php $filename = $_GET['f']; echo '<h1>讲开始下载文件!</h1><br /><br />'; echo file_get_contents($filename);
header(‘Content-Type: imgage/jpeg’);
header(‘Content-Disposition: attachment; filename=’.
f
i
l
e
n
a
m
e
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
p
"
>
)
;
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
n
b
"
>
h
e
a
d
e
r
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
p
"
>
(
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
s
1
"
>
′
C
o
n
t
e
n
t
−
L
e
n
g
h
:
′
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
o
"
>
.
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
n
b
"
>
f
i
l
e
s
i
z
e
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
p
"
>
(
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
n
v
"
>
filename</span><span class="p">);</span> <span class="nb">header</span><span class="p">(</span><span class="s1">'Content-Lengh: '</span><span class="o">.</span><span class="nb">filesize</span><span class="p">(</span><span class="nv">
filename</span><spanclass="p">);</span><spanclass="nb">header</span><spanclass="p">(</span><spanclass="s1">′Content−Lengh:′</span><spanclass="o">.</span><spanclass="nb">filesize</span><spanclass="p">(</span><spanclass="nv">filename));
?>
当然,我下载的这个文件并没有内容。
参数f
的参数值为PHP文件时:
1.文件被解析,则是文件包含漏洞
2.显示源代码,则是文件查看漏洞
3.提示下载,则是文件下载漏洞
我学习任意文件读取与下载漏洞,就是因为遇到了一个任意文件读取与下载漏洞的Web题,所以在此实战一下
不是弱口令,也不能扫出目录。只有一个help.docx
文件可以下载。于是可能是任意文件下载漏洞。
点击蓝字“help”,抓包,发包。发现GET方式一直什么都下载不了。后来修改为POST,就可以下载了。
因为题目提示java,所以可以先下载网站的配置文件,在根目录WEB-INF/web.xml
发现操作flag的关键文件位置,读取(或下载)/WEB-INF/classes/
下的flag的关键文件位置,又因为Java字节码类文件(.class
)是Java编译器编译Java源文件(.java
)产生的“目标文件”。
最终得出flag的关键文件位置为:/WEB-INF/classes/com/wm/ctf/FlagController.class
Base64解码得到flag
通用
.
点,使用户在url中不能回溯上级目录php.ini
配置open_basedir
限定文件访问范围文件下载漏洞修复
www.test.com/download?filename=文件名
blog.csdn.net/frozen_fish/article/details/2244870
文件读取、下载、包含、删除、上传,都是文件操作漏洞,需要更加深入的学习。这里我只简单分析了一下文件读取与下载漏洞。
转载至https://xz.aliyun.com/t/6594