rust实现深度js分析工具

Posted on 2025-08-05  72 Views


几个月之前我做过一个类似的,当时做的时候基本就是对付用一下,后面做渗透没有这个工具也能对付对付,但是前几天打hvv的时候因为扫描速度不够的问题,只能吃大伙剩下的,于是整个攻防就变成了像渗透测试一样的大规模攻坚战;抛开扫描问题不谈,在攻坚过程中我又开始想念之前的js工具了,毕竟大部分情况下findsomething作为被动扫描工具,能捕获到的信息非常有限,如果给findsomething加一套主动爬虫,那就能更有效的挖掘js中的信息

下面的链接是几个月前做的东西

基于语法分析引擎实现API端点模糊测试工具
语义分析的API FUZZ工具适配webpack – zgbsm's note

之前做的东西有几个问题
1、python太卡
2、爬取规则过于松弛,很容易导致爬取量过大,不仅卡,还会输出大量无效数据
3、python太卡

这次用rust写,为什么要用rust呢?用rust总感觉在受虐,但是rust也确实很方便,异步这块做起来也比C++容易,有时候rust做出来的东西性能很好、问题很少,就会让人感觉很爽;但是现在回想一下这种开发体验总感觉哪里怪怪的

IMG_20250804_201607_731

所以为什么要用rust呢?因为别的不想用,为什么不想用呢?首先做这东西之前要明确这次的目标,大伙应该记得我最近在改进自己的扫描平台,目前对网站自动化模糊测试这块还是空白(dirsearch都还没缝进去),我想既然要搞就干脆拉坨大的,把ARL原版捆绑的wih也一起丢掉,直接换成我的

那么既然要缝合到扫描平台,性能问题必须要考虑;首先内存占用必须小,如果内存占用跑赢了nuclei,那很容易直接被linux刀掉;其次要快,不能一个站跑15分钟半个小时,最好大一点的站也能3-5分钟搞定;最后体积也是个问题,每次部署扫描节点,npoc的docker环境都要上传将近1个G,等起来很累

python刚才说过了,很卡,一核有难三核围观;C#在linux上很肥,水土不服;java也肥;c++要慢慢调,维护成本也有点大;nodejs可以直接美美调用findsomething,但是channel、queue这块好像没听说有什么比较好的包可以用;最后就剩下rust和go了

为什么不用go?go确实比rust写起来方便很多,交叉编译也非常方便,只是有一个问题,go的内存是通过gc回收的,回收的时机可能会比较晚,如果突然接了几个超级大js,那可能内存胖胖时期会稍微长一点;而rust大伙都知道,时间一到就马上消失了,就跟你今天不加班一样

虽然tokio让rust对异步的支持非常优秀,但是不是什么代码都支持异步的,这就是代码刺客,等你什么都写好了,才发现有个报错说xxx cannot be sent between threads safely,好像是线程切换到挂起会导致一些对象的状态不确定,然后又要想办法处理

总之代码是写好了,采用总分总构型,有个“总包”负责传输参数,然后“总包”下面挂着很多“外包”,最后“外包”的结果汇总到“项目经理”,输出报告

Untitled Diagram.drawio

爬虫节点不断获取html上的路径,然后拿到js就通过tree-sitter获取抽象语法树,再通过语义特征进行js路径的针对性提取组合;爬虫节点是自交的,每一个http请求对应一个爬虫任务,爬虫任务将分析出来的每个js路径再通过“交换机”发送给自己,而每个js内容都会同时发送到后续节点;敏感信息提取节点通过google大v8调用findsomething的相关功能,输出内容继续发送到后续节点

这里的节点路径是自由的,用户可以通过命令行参数进行定义,可以选择哪些节点启用、哪些不启用,可以自定义执行顺序,也能调整线程数

这个东西昨天完善的差不多了,正好这周有攻防要打,试了一下效果很不错,第一次见findsomething玩的这么开心,挖掘了完整的系统功能,本来有一个站拿了后台准备略过了,结果看了一眼这个工具的输出,发现了一坨大的,吃得很爽


你好