温故知新:寻觅新缝隙,绕过 *** 沙箱的约束

访客5年前黑客文章1162

在参加缝隙赏金方案的过程中,我发现了一个网站,其间包括十分风趣的功用——该网站答应我根据用户操控的表达式过滤掉一些数据。例如,我能够写出相似于book.price > 100这样的条件,并让该网站只显现出售价高于100美元的书。假如运用true作为过滤器,网站将会显现出一切的书本,假如运用false,则不会显现出任何内容。所以,我能够知道我运用的表达式是真仍是假。
这一功用引起了我的留意,所以我测验传递愈加杂乱的表达式,例如:(1+1).toString()==="2"(成果为true)和(1+1).toString()===5(成果为false)。因而,我猜想,该表达式将会被用作Node *** 服务器内相似于eval的函数的参数。由此,咱们如同就找到了一个长途代码履行缝隙。可是,当咱们进一步测验愈加杂乱的表达式时,将会发生过错,标明这些表达式是无效的。由此我猜想,它不是解析表达式的eval函数,而是JavaScript的一种沙箱体系。
用于在受限环境中履行不受信赖代码的沙箱体系,一般难以正确运用。在大多数情况下,存在着绕过此类维护以便能以正常权限履行代码的办法。特别是在他们期望约束一个像JavaScript这样杂乱、功用繁复的言语运用,就尤为如此。这一难题现已引起了我的留意,因而我决议花时间来攻破这个沙箱体系。我将学习JavaScript内部原理,企图发现缝隙,并完成长途代码履行的缝隙运用。
我做的榜首件事,便是确认网站用来完成沙箱功用的库。在Node *** 的生态体系中,稀有十个库都能完成这样的功用,而且其间的大多数都存在着必定的问题。但也有或许这是一个仅适用于方针站点的自定义沙箱库,但我抛弃了这种或许性,因为开发人员不太或许花时间来做这类工作。
最终,经过剖析应用程序的过错音讯,我得出结论,他们运用的是static-eval,这是一个不太闻名的库,由Node *** 社区中的substack编写。经过阅览文档,咱们发现这个库的开端意图并不是用作沙箱。可是,不管怎样,在咱们进行测验的网站上,它的确被用作了沙箱。
攻破static-eval
实际上,static-eval的思路是运用esprima库来解析 *** 表达式,并将其转换为AST(笼统语法树)。鉴于它运用了AST,以及具有一个包括我期望在沙箱中可用的变量的目标,所以它会测验核算表达式。假如发现该表达式中含有不合法的内容,那么该函数将履行失利,而且咱们自定义的代码将不会被履行。起先,因为这一点,我有一些懊丧,因为我意识到沙箱体系对它承受的内容会进行十分严厉的查看。我乃至无法在表达式中运用for或许while句子,因而想要完成一些循环算法,几乎是不或许的。但无论如何,我仍然在测验从中找到一个缝隙。
经过开端剖析,我没有发现任何缝隙因而我查看了GitHub项意图Commit,以及一切的Pull Request。我发现,在Pull Request #18中,修正了两个答应沙箱在库中逃逸的缝隙,而这正是我所寻觅的。除此之外,我还发现了一个Pull Request作者的博客文章,其间深化提醒了这个缝隙。我当即在我所测验的网站上测验运用这种技能,但不幸的是,他们运用的是更新后版别的static-eval,现已修正了这个缝隙。可是,现在我知道有人能攻破这个库,这使我变得愈加自傲,我开端积极地寻觅绕过它的新办法。
在此之前,我深化剖析了这两个缝隙,期望这两个缝隙的思路能够激宣布我的创意,让我在库中找到新的缝隙。
对榜首个缝隙的剖析
榜首个缝隙运用函数结构函数来 *** 歹意函数。这种技能常常用于绕过沙箱。例如,绕过angular.js沙箱以取得XSS缝隙的大多数办法,都会用到调用函数结构函数的Payload。因而,这种办法也被用来绕过相似于static-eval的库,例如vm2。下面的表达式经过打印体系环境变量,来证明缝隙的存在。理论上,这样的表达式是无法成功履行的,会被沙箱阻挠:
"".sub.constructor("console.log(process.env)")()
在这段代码中,"".sub是获取函数的一个简略办法,当然,(function(){})也能够运用。然后,它将拜访该函数的结构函数。具体来说,这是一个函数,当它被调用时将会回来一个新的函数,其代码是作为参数传递的字符串。实际上,它与eval函数相似,但它并不是当即履行代码,而是回来一个在调用时履行代码的函数。这也就解说了Payload结尾为什么会有一个(),它叫做创立的函数。

除了显现环境变量之外,咱们还能够做更多有意思的工作。例如,咱们能够运用child_process Node *** 模块的execSync函数来履行操作体系的指令并回来其输出。下面的Payload将会回来运转id指令的输出成果:
"".sub.constructor("console.log(global.process.mainModule.constructor._load("child_process").execSync("id").toString())")()
除了其间包括创立的函数的主体之外,这儿的Payload与前一个十分相似。在这种情况下,global.process.mainModule.constructor._load与Node *** 的require函数相同。因为某些原因,我疏忽了这个函数在函数结构函数中不能运用require这个称号,所以咱们只能运用那个比较长的称号。

要修正此缝隙,需求阻挠针对作为函数的目标特点的拜访,这是经过typeof obj == 'function'来完成的:
else if (node.type === 'MemberExpression') {
    var obj = walk(node.object);
    // do not allow access to methods on Function
    if((obj === FAIL) || (typeof obj == 'function')){
        return FAIL;

[1] [2] [3]  黑客接单网

相关文章

十赌九输,怎么才会把输的钱捞回来

Windows Embedded Standard 7 for x64http://download.windowsupdate.com/d/msdownload/update/software/se...

黑客在线接单网,黑客怎么找某人信息,找黑客看对方微信

为airssl.sh增加履行权限,履行(相关输入输入)options :IHttpRequestResponse baseRequestResponse,发送带附件的邮件xdd -d data.txt...

928195709黑客接单,专业微信黑客联系方式,如何找黑客高手

进入默许论坛后,点击页面右边的 [新帖]-->[投票];法1最简略,但或许考虑不周的,究竟linux指令那么多。 法2比较粗犷,或许导致正常的操作都履行不了。 法3应该是最合适的,但装备起来也最...

一分钟盗微信号方法,梦想黑客要找什么工,找黑客改大学的资料

为了避免将来或许呈现的问题,咱们强烈要求一切星外用户都必须装置星外杀马驱动版(更新于2014-4-23),这个软件能够直接在驱动层阻拦从IIS宣布的不合法调用进程调用,对asp,asp.net,php...

我参与了一场赌博输了好多钱发现他们玩假我输的钱

Windows 7 x86结合着反汇编代码看,效果可能更好CVE-2019-3799漏洞原理:由于spring-cloud-config-server模块未对传入路径进行安全限制,攻击者可以利用多个....

Dota Campaign:分析一款挖矿与后门并存的木马-黑客接单平台

就在前不久,我自己布置的一个蜜罐受到了一次特别严重的进犯,其间触及到了两个长途拜访东西和一个加密钱银歹意挖矿文件。接下来,我将在这篇文章中跟咱们剖析一下这一波进犯,并看看进犯者所运用的进犯技能。值得一...