freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Xcheck之Node.js安全检查引擎
FreeBuf_367821 2021-06-03 17:38:34 111100

0x00 Node.js安全检查引擎

Node.js作为常见的Web开发语言之一,Xcheck也针对该语言打造了对应的扫描引擎:JsCheck

同样基于污点传播模型,支持以下常见漏洞类型:

命令注入

SQL注入

URL跳转

SSRF

路径穿越

XXE

反序列化

模板注入

XPath注入

目前JsCheck支持以下2个框架:Koa、Express,其他框架有需要可以方便添加。

1622712341_60b8a015462c5024c4802.png!small?1622712341955

0x01 Node.js一些有意思的特性

JsCheck为了能够精准的做污点传播,对Node.js的特性进行了精确的适配,比如:this关键字,变量声明提升等。

this关键字

Node.js里的this根据所处的位置不同(普通函数,箭头函数),调用方式不同(直接调用,赋值给一个对象的属性再调用,当做构造函数调用),有着不同的指向含义。
1)当在文件的最上层的时候,this指向的当前文件的exports对象:

1622712368_60b8a0301fd4b24a7709e.png!small?1622712368498

输出:

1622712392_60b8a04890b62149550f6.png!small?1622712392894

2)当this在一个普通函数里,this指向的是global对象:

1622712415_60b8a05f6ed918f3ea0ad.png!small?1622712416062

输出:

1622712435_60b8a0737144384de0886.png!small?1622712435830

3)当this在一个构造函数里,this指向的是该构造函数生成的对象:

1622712496_60b8a0b03b5b54710b536.png!small?1622712496483

输出:

1622712515_60b8a0c3848272db8b4dd.png!small?1622712515732

4)当this在箭头函数里,this指向的对象就会根据this定义时所处的为上下文而定:

1622712619_60b8a12b88d54efa00e5d.png!small?1622712619845

输出:

1622712641_60b8a141c080343d7bfd4.png!small?1622712642200

变量声明提升

在Node.js里,如果一个变量不使用var,const,let修饰,那么默认它是一个全局变量:

1622712664_60b8a15819aa513eeb93c.png!small?1622712664349

输出:

1622712692_60b8a174009bb1725f2ff.png!small?1622712692229

如果使用了var声明变量,则会出现变量声明提升:

1622712715_60b8a18bb74fb6a0391db.png!small?1622712716055

输出:

1622712737_60b8a1a185758b7d34f25.png!small?1622712737762

不但变量的声明会提升,函数的声明也会提升:

1622712756_60b8a1b41561599b9fd67.png!small?1622712756331

等价于:

1622712776_60b8a1c89b10c01031189.png!small?1622712776842

0x02 误报消除的尝试

在处理误报的时候,最不好处理的就是用户自定义的过滤逻辑。因为,这里的写法形式很多,难以提取出固定的模式,其中有两个关键点:
1.识别出一段代码是过滤逻辑
2.判定此段过滤逻辑是完备的
针对这两个点,目前从业界来看,都没有完美的解决办法,Xcheck在这里做了一些尝试,对一些情况能够做出准确的判定。
比如,通过字符串直接比对的情况:

1622712795_60b8a1db10e78974c76c7.png!small?1622712795386

检测不满足条件后抛出异常的情况:

1622712812_60b8a1ec51a7cfbf1661f.png!small?1622712812628

对污点数据进行常量化替换(清洗):

1622712833_60b8a2012c6839233a104.png!small?1622712833495

过滤逻辑叠加污点对象传播时:

1622712853_60b8a21576de1c98a35a9.png!small?1622712853709

判定对象和风险函数执行的对象不是同一个的情况:

1622712872_60b8a228cc6d1a83a63ee.png!small?1622712873219

常见目录穿越漏洞的过滤逻辑:

1622712890_60b8a23a7fea96f31d0d2.png!small?1622712890774

从实测效果来看,JsCheck的误报已经明显降低,但是后续还有优化提升空间。

0x03 扫描样例

目前,使用github上CodeQL的Node.js测试集来扫描,未做专门适配的情况下发现漏洞243个。

1622712914_60b8a2528670aa585bd1c.png!small?1622712914865

查看详细的扫描报告,针对每个漏洞,各个污点传播节点有详细的展示:

1622713021_60b8a2bd8fc04dc682171.png!small?1622713022218


# web安全 # 系统安全 # 企业安全 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 FreeBuf_367821 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
FreeBuf_367821 LV.4
这家伙太懒了,还未填写个人描述!
  • 7 文章数
  • 4 关注者
Xcheck Java引擎漏洞挖掘&防护识别
2021-07-05
Xcheck之Node.js安全检查引擎
2021-06-07
JumpServer日志读取漏洞自动化审计分析
2021-05-25
文章目录