Upload-labs靶场Pass-18
1、分析源码
// 初始化上传状态为 false,并且消息为空
$is_upload = false;
$msg = null;
// 检查是否通过 POST 请求提交了表单
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 = '上传出错!';
}
}
这段代码实现了一个简单的文件上传逻辑:
文件类型限制:只能上传 .jpg、.png 和 .gif 文件。
文件重命名:避免文件名冲突。
错误处理:确保不符合条件的文件不会留在服务器。
2.原理
发现
尝试将临时文件移动到上传路径
if (move_uploaded_file($temp_file, $upload_file)) {
检查文件扩展名是否在允许列表内
if (in_array($file_ext, $ext_arr)) {
代码中先将文件移动到了上传路径,然后才进行检查,不合法删除,合法重命名。于是我们可以多次发送请求,在非法文件没有被判断之前就访问它,该文件就会生效,我们可以上传一个能生成webshell的脚本,访问的时候,就在当前目录生成webshell一次来达到上传目的。这就涉及到条件竞争。
对于条件竞争,我不做过多介绍,大家可以参考
条件竞争
条件竞争之文件上传
或者自行查阅资料
3.准备工作
我们可以准备一段恶意代码
<?php
fputs(fopen("shell.php","w"),"<?php @eval(\$_POST[1]);?>");
?>
这段PHP代码的目的是通过在服务器上创建一个web shell文件(shell.php)来实现远程代码执行(RCE),属于恶意代码的一种,用于攻击或控制服务器。
代码解释
fopen(“shell.php”, “w”):
打开或创建一个名为shell.php的文件。
“w"表示以写入模式打开文件,如果文件不存在会自动创建,如果存在则覆盖其内容。
fputs():
将第二个参数中的字符串写入到打开的文件中(即shell.php)。
在这里,”<?php @eval(\$_POST[1]);?>"被写入到了shell.php文件中。
于是我们多次上传这段代码,然后不断访问,访问成功,就是在文件目录下生成一个shell.php,然后我们就可以访问shell.php来达到上传的目的。
4、攻击
4.1 先抓取恶意代码上传文件的包
发送到攻击模块并进行配置
在payload模块
第三个,模块
### 4.2 对访问恶意代码进行抓包
1.先上传一个可以通过的文件,获取到文件路径
2.然后通过此路径访问脚本,来达到在服务端木马生成木马的目的
3.抓包
4.跟上面一样进行同样配置,然后开始攻击
4.3 开始攻击
将两个模块打开开始攻击
5.结果
查看服务端‘
然后我们就可以访问
shell.php脚本,因为生成的是一句话木马,使用蚁剑连接
连接成功!