freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

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

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

FreeBuf+小程序

FreeBuf+小程序

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

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安全 # 系统安全 # 企业安全 # 网络安全技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录