记一次文件上传引发的 SQL 注入
2022-1-6 17:27:45 Author: mp.weixin.qq.com(查看原文) 阅读量:19 收藏

本文作者:Jerry Shah (Jerry)

翻译作者:myh0st(文末点击阅读原文查看英文全文)

在一次测试过程中,发现一个文件上传的入口,如图:

测试时,使用 burp 提交数据包时,将文件名处添加 XSS 的 Payload:("><img src=x onerror=alert(document.domain>.png):

然后,发现 xss 漏洞触发执行,算是一个 self-xss,危害有限:

关闭弹窗后,发现一些错误信息:

感觉文件是文件名在插入数据库时报的错,所以尝试将 xss 的 payload 修改为 SQL 注入的:

1、--sleep(15).png

2、--sleep(6*3).png

3、--sleep(25).png

4、 --sleep(5*7).png

从测试上来看,大概猜测了下后端代码的实现方式,如下:

<?php$target_dir = “uploads/”;   #存放文件的目录$target_file = $target_dir . basename($_FILES[“fileToUpload”][“name”]); #上传之后的文件路径$uploadOk = 1;$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); #文件名扩展小写// 检查图片的格式是否是真实图片if(isset($_POST[“submit”])) {$check = getimagesize($_FILES[“fileToUpload”][“tmp_name”]);if($check !== false) {echo “File is an image - “ . $check[“mime”] . “.”;$uploadOk = 1;} else {echo “File is not an image.”;$uploadOk = 0;}}?>

以上代码没有检测文件名是否有效,从而导致,任意构造文件名,进入后续文件写入、数据入库的环节,导致漏洞产生,应该增加如下代码来检测文件名是否有效:

$filename = ‘../../test.jpg’;if (preg_match(‘/^[\/\w\-. ]+$/’, $filename))echo ‘VALID FILENAME’;elseecho ‘INVALID FILENAME’;

至此这个测试的过程就分享到这里。虽不是什么特别高大上的测试过程,也算一个不错的漏洞案例,任何用户可控的参数都是不可信的,都是可能存在漏洞的,细节决定成败。


文章来源: http://mp.weixin.qq.com/s?__biz=MzI5MDQ2NjExOQ==&mid=2247496457&idx=1&sn=c3393cd165e363904e6500a294d344e5&chksm=ec1dc321db6a4a373c9f0633e70006fabb5819f4a2a2fedbd1cef2bfc8217883066dd2b01597#rd
如有侵权请联系:admin#unsafe.sh