新项目-UploadFuzzer

项目地址
https://github.com/T-Jinhao/UploadFuzzer

设想缘由

最近刷文章,又刷到了很久之前曾看过的文件上传绕过知识点整理,回味之后发现姿势太多,很难全部记住且印象并没有多深刻。同时又回顾前几天正好在某处SRC测试中利用到了其中的一个知识点,充分认识这些知识点积累起来还是很有必要的。因此赶紧掏出纸和笔把当时的一些想法给记录下来。要是能整理成一款好用的工具,也是很不错的。

参数与设计

选项 示例 作用
-h 帮助
-u -u htttp://xxx.com/upload 文件上传路径
-c -c “sessionid=xxx;userid=1” 身份认证,cookies,格式为document.cookie()
-f -f ~/image/a.jpg 上传的文件
–field –field upload_file 文件上传对应的参数值
–data –data “submit=提交;token=xxx” 文件上传时一并发送的数据
–attach –attach ~/exploit/webshell.php webshell文件,附加时将尝试合并在正常文件内
–bypass –bypass 尝试构造畸形请求绕过WAF,成功即停
–bypass_ignore –bypass_ignore 尝试构造畸形请求绕过WAF,将尝试全部payload
–content_type –content_type png 指定文件上传类型,可MIME欺骗

想法与困难

困难:结构设计
从众多绕过姿势中可发现,有相当多一部分是通过构造特殊的畸形请求(文件名换行)绕过WAF的检测,或伪造协议(MIME)欺骗服务器,或以特殊的文件命名字符触发服务器的某些漏洞(文件名截断)等。众多的姿势意味着有多种可能,如果前期没有扩展好足够的接口,到后面处理时将十分复杂。同时如何构造这些payload,如何进行发送(畸形的请求可能导致python端报错),如何让使用者有更多的操作性等,依然在摸索中,期待在遇到中边思考边解决。

困难:识别结果
先写了普通上传的功能,因此引出了一个大问题:如何识别结果。
在尝试了多个网站的上传接口后发现,在上传成功/失败时,网页状态码都是200,瞬间觉得不太妙,一度觉得脚本无法继续展开。因为在这种情况下使用脚本,将有极高的误报率,因为很难识别上传结果,很多站点都没有上传专属的API(api会反馈信息)。
但观察了挺多网站之后,发现另一种方法,通过判断网站上传前后的diff进行判断。我将其简单化后,改成先在上传前扫描一遍网页的URLs(A),在上传后再获取一遍页面的URLs(B),通过找出在B中且不在A中的url,在大多数情况下(头像上传、图片上传等),都能得到正确的反馈,将其与主站拼接(完整路径不拼接)打印出来即是上传得到的图片路径。但对于部分站点只显示成功or失败这样的API信息,很难通用化处理,还没找到比较好的方法。

upload-labs为例:
未上传:

进行上传:

使用脚本:

至此觉得这种方法算是可行。

困难:未知困难
有相当多的困难无法在遇到前想起并解决,如同我最新添加的--data参数,因为在一整个下午的测试中,发现脚本未报错但就是没有上传图片到docker内,使用wireshark能看到完整的数据流但一直失败,直到次日突发奇想在GitHub看了upload-labs的源码后发现,在处理前先检查$submit,至此把坑补上再测试,才得到成功的反馈。
对于这类未知的困难,将不断被发现并被记录至此。

发表评论

邮箱地址不会被公开。 必填项已用*标注