在黑盒中 源码 数据库配置文件都是很不好找的,,但源码审计不同
所有的漏洞,成因都是相同的,但我们自以最基础的作为代表,
这里文件上传这个点可以配合文件包含一块利用,当某个站对数据处理不严时,存在sql注入,那也可能会有文件注入,
常见的文件目录穿越配合文件包含实现getshell
演示目录穿越的原理,这里通过readfile函数读取文件,注意file变量里有个正斜杆
<?php
if(isset($_GET['file'])){
readfile("file/".$_GET['file']);
}
第一种情况,读取同文件夹下的1.txt
然后我们利用目录阶乘符…/ 目录穿越到file文件夹下的1.txt,达到目录穿越
修复措施: 不使用文件名作为变量传输。
同时,这里写一个有文件包含功能点的php
<?php
$file = $_GET['name'];
if(isset($file)){
include ($file);
}
通过include函数包含同文件夹下的phpinfo,
可以看到可以本地包含,,这时候,,如果allow_url_include=on,我们可以尝试利用目录穿越和文件包含写入shell到我们可以访问的地方,
include函数如果没做后缀过滤,我们远程包含 a.jpg 函数会自动识别位a.jpg.php
同样,存在任意文件读取需要配合目录穿越, …/ ./ …\目录阶乘符可以通过url编码绕过验证
通过readfile函数读取admin目录下的配置文件config / index.php
$file = $_GET['a'];
if(isset($file)){
readfile($file);}
通过fopen函数创立$fp 指针,fread函数读取,最后通过fclose函数回收指针
$file = $_GET['a'];
if(isset($file)){
$fp = fopen($file,"r") or ("cannot read");
$data = fread($fp,filesize($file));
fclose($fp);
echo $data;}
通过file_get_contents函数读取输出
$file = $_GET['a'];
if(isset($file)){
echo file_get_contents($file);
}
通过 目录穿越配合Unlink函数达到任意文件删除
$file = $_GET['a'];
if(file_exists($file)){
unlink($file);
}
通过?a=./admin/config.php 删除配置文件,危害很高
既然是文件上传,需要了解的点是文件上传的配置:
写一个前端功能上传点
<form action="upload12.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="2" />
</form>
文件上传的变量$_FILES
1,参数name: 原始上传文件名
2. 参数tmp _name 临时上传文件名。在php.ini获取
3. 函数move_uploaded_file 两个参数,一个移动的路径,第二个文件名。
这里先定义一个文件上传路径
$dir = "O:\phpstudy\WWW\uploads";
赋值一个文件上传变量$upload_name
$upload_name = $dir . "\\" . $_FILES['file']['name'];
通过move_uploaded_file函数移到uploads文件夹中
move_uploaded_file($_FILES['file']['tmp_name'],$upload_name);
完整源码
<?php
header("Content-type:text/html;charset=utf-8");
$dir = "O:\phpstudy\WWW\uploads";
if(isset($_FILES['file'])){
$upload_name = $dir . "\\" . $_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'],$upload_name);
}