jsPDF 本地文件包含/路径遍历(CVE-2025-68428)漏洞分析
此漏洞源于 jsPDF (Node.js 构建版) 的部分方法(loadFile, addImage, html, addFont)未对用户传入的文件路径进行严格的过滤与校验。远程攻击者可构造包含路径遍历序列(如 ../)的恶意请求,绕过预期的资源目录限制,读取服务器上的敏感文件(如配置文件、密钥等),并将文件内容嵌入到生成的 PDF 文档中。
漏洞影响
受影响的版本<=3.0.4
已打补丁的版本版本 >=4.0.0
漏洞复现
通过补丁描述可知,提供俩种解决方式
1. 通过控制 Node.js 进程的文件系统访问权限node --permission --allow-fs-read
2. 通过代码层面添加allowFsRead,设置允许读取文件以及目录
继续查看代码,对process.permission以及this.allowFsRead进行判断
读取文件
在readFileSync函数处下一个断点,没有进行任何判断,直接将相对路径解析为绝对路径
读取文件后返回内容,最后调用writeFileSync读取到的文件内容写入文件
新版本必须配置run node with the --permission and --allow-fs-read flags or set the jsPDF.allowFsRead property.
配置allowFsRead后可以成功运行
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
此漏洞源于 jsPDF (Node.js 构建版) 的部分方法(loadFile, addImage, html, addFont)未对用户传入的文件路径进行严格的过滤与校验。远程攻击者可构造包含路径遍历序列(如 ../)的恶意请求,绕过预期的资源目录限制,读取服务器上的敏感文件(如配置文件、密钥等),并将文件内容嵌入到生成的 PDF 文档中。
import { jsPDF } from "jspdf";
const doc = new jsPDF();
doc.addImage("../secret.txt", "JPEG", 0, 0, 10, 10);
doc.save("test.pdf"); 漏洞影响
受影响的版本<=3.0.4
已打补丁的版本版本 >=4.0.0
漏洞复现
通过补丁描述可知,提供俩种解决方式
1. 通过控制 Node.js 进程的文件系统访问权限node --permission --allow-fs-read
2. 通过代码层面添加allowFsRead,设置允许读取文件以及目录
继续查看代码,对process.permission以及this.allowFsRead进行判断
读取文件
在readFileSync函数处下一个断点,没有进行任何判断,直接将相对路径解析为绝对路径
读取文件后返回内容,最后调用writeFileSync读取到的文件内容写入文件
新版本必须配置run node with the --permission and --allow-fs-read flags or set the jsPDF.allowFsRead property.
配置allowFsRead后可以成功运行
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
❤1
JAVA代码审计篇-用友NC65鉴权绕过分析
首先我们知道用友NC有很多注入漏洞都是基于一个鉴权绕过的前提下进行的注入 也就是用 pageId=login 来绕过鉴权,但是在网上找了找发现都是关于注入漏洞部分的分析,都没有提到鉴权部分的分析(很烦)于是只能自己分析下。
查看PortalLoginFilter类 发现继承了AbstractLfwLoginFilter 并且没有重写doFilter 所以我们就看他的父类AbstractLfwLoginFilter中的doFilter方法。
这里查看AbstractLfwLoginFilter的doFilter方法
在这里,前两个
构造请求包进行测试验证
没有加pageId的情况下 没有走到功能点 302响应 被重定向到 /portal 。
加入参数pageId=login 或者pageId=passwordmng 可以看到是参数错误导致的500报错也就是成功绕过鉴权。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
首先我们知道用友NC有很多注入漏洞都是基于一个鉴权绕过的前提下进行的注入 也就是用 pageId=login 来绕过鉴权,但是在网上找了找发现都是关于注入漏洞部分的分析,都没有提到鉴权部分的分析(很烦)于是只能自己分析下。
查看PortalLoginFilter类 发现继承了AbstractLfwLoginFilter 并且没有重写doFilter 所以我们就看他的父类AbstractLfwLoginFilter中的doFilter方法。
这里查看AbstractLfwLoginFilter的doFilter方法
在这里,前两个
if 判断条件满足,即可直接进入后续的 doFilter 流程并放行请求。首先关注第一个判断条件,其调用的 isToLogin 方法仅依据从可控的请求参数 pageId 的取值进行判断。当 pageId 等于 login 或 passwordmng 时,方法直接返回 `true`,从而绕过登录校验,导致鉴权绕。this.isToLogin(req, res)
private boolean isToLogin(HttpServletRequest req, HttpServletResponse res) {
String pageId = req.getParameter("pageId");
return pageId != null && (pageId.equals("login") || pageId.equals("passwordmng"));
}
构造请求包进行测试验证
没有加pageId的情况下 没有走到功能点 302响应 被重定向到 /portal 。
加入参数pageId=login 或者pageId=passwordmng 可以看到是参数错误导致的500报错也就是成功绕过鉴权。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
modelConfig.getConfigValue(ESCAPE_URL) 用于从配置文件中读取免鉴权访问的路径白名单,并将该配置与当前请求的 URL 进行匹配判断。然而在匹配过程中,代码采用 indexOf 的方式进行字符串包含判断,而非严格的路径匹配。同时,请求 URL 的构造中包含了 `req.getQueryString()`,即将用户可控的请求参数一并纳入匹配范围。 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
PortalLogger.debug((String)LfwResBundle.getInstance().getStrByID("ds", "AbstractLfwLoginFilter-000000"));
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
WebContext webCtx = LfwRuntimeEnvironment.getWebContext();
String currentUrl = req.getRequestURI();
String loginURL = this.getLoginJspName();
if (webCtx != null) {
LfwRuntimeEnvironment.getWebContext().setResponse(res);
} 在上述逻辑下,攻击者可通过在请求参数中加入配置文件中定义的免鉴权路径关键字,使请求 URL 命中免鉴权规则,从而导致鉴权绕过。
经过搜索发现在以下配置文件中存在很多免鉴权的路径。
随便选取其中的一个路径构造请求包进行测试如 pt/oncelogin/getAuth ,500返回确实没有被鉴权拦截。
更换其他接口地址试一下320响应了,被鉴权拦截 上述接口确实为免鉴权路径。
接下来使用构造一个参数值为pt/oncelogin/getAuth的请求包进行测试确实绕过鉴权。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
内存解密远控木马
通过分析,发现shellcode成功加载后:
● 将在内存中解压缩PE文件;
● 解压缩PE文件的MD5是69CECFC2549EAF971FA04212EC4A121D,与笔者《金眼狗(APT-Q-27)滥用AWS S3存储桶分发最新恶意载荷》文章中释放的远控木马Hash相同;
● 解压缩后的PE文件是一款隶属于金眼狗组织的远控木马,具备检查运行环境、内置C2地址、判断管理员权限、创建服务、远控指令等功能;
letsvpn-latest.exe
文件名称:letsvpn-latest.exe
文件大小:23015744 字节
文件版本:3.16.4.0
MD5 :3D8F35E54A3DD41286738C8C2A9823BB
SHA1 :D8FE5C317D695733EC312C432CC39E861E46BF4B
SHA256:124E8F7CA958FD8CB2A3BAF91681513F93F73D9CFA4EFEA6F4A1F165D8CBC8D9
释放文件
通过分析,发现此样本运行后,将从文件资源段中提取载荷数据,并将载荷数据拆分成多个文件,释放至%APPDATA%\Crash目录中。
进一步分析,发现释放的文件均携带了数字签名,根据数字签名名称可确定与此次攻击活动相关的样本为libcurl.dll和qr.dll样本。
创建计划任务
通过分析,发现此样本将通过Windows Task Scheduler COM接口创建计划任务,计划任务将在用户登录时触发:
● MicrosoftEdgeUpdate_QR:C:\Windows\System32\rundll32.exe "C:\Users\admin\AppData\Roaming\Crash\qr.dll",StartQR
● MicrosoftEdgeUpdate_TenioDL:C:\Users\admin\AppData\Roaming\Crash\Crash.exe
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
通过分析,发现shellcode成功加载后:
● 将在内存中解压缩PE文件;
● 解压缩PE文件的MD5是69CECFC2549EAF971FA04212EC4A121D,与笔者《金眼狗(APT-Q-27)滥用AWS S3存储桶分发最新恶意载荷》文章中释放的远控木马Hash相同;
● 解压缩后的PE文件是一款隶属于金眼狗组织的远控木马,具备检查运行环境、内置C2地址、判断管理员权限、创建服务、远控指令等功能;
letsvpn-latest.exe
文件名称:letsvpn-latest.exe
文件大小:23015744 字节
文件版本:3.16.4.0
MD5 :3D8F35E54A3DD41286738C8C2A9823BB
SHA1 :D8FE5C317D695733EC312C432CC39E861E46BF4B
SHA256:124E8F7CA958FD8CB2A3BAF91681513F93F73D9CFA4EFEA6F4A1F165D8CBC8D9
释放文件
通过分析,发现此样本运行后,将从文件资源段中提取载荷数据,并将载荷数据拆分成多个文件,释放至%APPDATA%\Crash目录中。
进一步分析,发现释放的文件均携带了数字签名,根据数字签名名称可确定与此次攻击活动相关的样本为libcurl.dll和qr.dll样本。
创建计划任务
通过分析,发现此样本将通过Windows Task Scheduler COM接口创建计划任务,计划任务将在用户登录时触发:
● MicrosoftEdgeUpdate_QR:C:\Windows\System32\rundll32.exe "C:\Users\admin\AppData\Roaming\Crash\qr.dll",StartQR
● MicrosoftEdgeUpdate_TenioDL:C:\Users\admin\AppData\Roaming\Crash\Crash.exe
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
某远oa-xrdController.do后台-文件复制漏洞
漏洞复现
1.查看补丁
存在漏洞的Controller为xrdController首先看看补丁与漏洞代码有何不同 重点关注 checkIsSign 方法中的 fileName 参数 在有漏洞的版本之中直接通过接收 http的参数来拼接路径 (所以这个时候我们通过传入 ../../ 就能达到目录穿越的效果) 然而在补丁之中则是通过
2.漏洞分析
由下述代码可以得知 http 需要接受 两个参数 一个是 summaryId 另外一个参数则是 attList ( attList fildData[0] 则是我们需要传入的 fileid , fildData[1]则是我们传入的 filename 通过 $ 符号分割)
接着我们来看一下 创建文件夹 与 创建文件的 两个方法 createDir 与 decrypt 可以看到都是很耿直的方法没有经过任何过滤。
getFile 传入的就是fileid
所以这个时候理论上我们只需要再上传一个文件拿到fileid即可 这里我们采用 fileUpload.do 的 processUpload 方法上传 回包记录 fileid
3.构造POC
这个时候就可以开始构造最终POC 这里是有一点小鸡肋的 我们得知道 web的绝对路径 才可以写入web目录
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
漏洞复现
1.查看补丁
存在漏洞的Controller为xrdController首先看看补丁与漏洞代码有何不同 重点关注 checkIsSign 方法中的 fileName 参数 在有漏洞的版本之中直接通过接收 http的参数来拼接路径 (所以这个时候我们通过传入 ../../ 就能达到目录穿越的效果) 然而在补丁之中则是通过
fileName = (new File(Strings.getCanonicalPath(fileName))).getName(); 来获取 fileName 从而限制传参达到过滤的效果
2.漏洞分析
由下述代码可以得知 http 需要接受 两个参数 一个是 summaryId 另外一个参数则是 attList ( attList fildData[0] 则是我们需要传入的 fileid , fildData[1]则是我们传入的 filename 通过 $ 符号分割)
接着我们来看一下 创建文件夹 与 创建文件的 两个方法 createDir 与 decrypt 可以看到都是很耿直的方法没有经过任何过滤。
getFile 传入的就是fileid
/seeyon/xrdController.do?method=checkIsSign&summaryId=123&attList={fildData[0]}${fildData[1]}所以这个时候理论上我们只需要再上传一个文件拿到fileid即可 这里我们采用 fileUpload.do 的 processUpload 方法上传 回包记录 fileid
3.构造POC
这个时候就可以开始构造最终POC 这里是有一点小鸡肋的 我们得知道 web的绝对路径 才可以写入web目录
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke