node js
node js
md5

在示例中:
a = {x: 1} 和 b = {x: 2} 定义了两个不同的对象。
当执行 console.log(a + “test”) //打印时,JavaScript 会先将对象 a 转换为字符串。由于没有为 a 定义自定义的 toString() 方法,所以会调用默认的 Object.prototype.toString() 方法,将 a 转换为 “[object Object]”,然后再与 “test” 进行字符串拼接,结果就是 “[object Object]test” 。
同理,对于 console.log(b + “test”) ,对象 b 也会调用默认的 Object.prototype.toString() 方法被转换为 “[object Object]”,然后与 “test” 拼接得到 “[object Object]test” 。
文件读写


readFile和wrteFileSync是两个参数
rce bypass
1.字符拼接

exec,execSync,eval可以执行命令
%2b是+,以及.concat()可以进行拼接字符bypass
2.编码绕过

\x十六进制编码,\u Unicode编码,以及base64编码
3.模板拼接

${‘ ‘}模板拼接
ssrf
原理详解:
- 编码转换与截断问题
- Unicode 到字节的转换:JavaScript 支持 Unicode 字符串(如
\u{010D}、\u{010A}),但 Node.js 在处理无请求主体(如 GET、DELETE)的 HTTP 请求时,默认使用 latin1 编码将路径字符串转换为原始字节。 - latin1 编码的限制:latin1 是单字节编码(仅支持 0-255 的字符),对于高编号 Unicode 字符(如
\u{010D},十进制值为 269,超出 latin1 范围),Node.js 会 截断其最低字节(如\u{010D}截断为0x0D,即\r;\u{010A}截断为0x0A,即\n)。
- Unicode 到字节的转换:JavaScript 支持 Unicode 字符串(如
- HTTP 协议控制字符的注入
- 利用截断结果:
\r和\n是 HTTP 协议中的 控制字符(用于分隔请求行、请求头、请求体)。攻击者在请求路径中嵌入精心构造的 Unicode 字符(如\u{010D}\u{010A}),Node.js 处理时会将其转换为\r\n,注入到 HTTP 请求的原始字节流中。 - 请求拆分攻击:通过注入
\r\n,攻击者可篡改请求结构,将原本的单一请求拆分为多个伪造的请求(如在路径中插入新的请求头或请求体),欺骗服务器发起 未授权的内部请求(即 SSRF 攻击)。
- 利用截断结果:
- 漏洞触发条件
- Node.js 版本:8 或更低版本(Node.js 10 及以上已修复,对非 ASCII 字符直接报错)。
- 请求特征:
- 接受用户输入的 Unicode 数据 并包含在请求路径中。
- 请求 无主体(如 GET、DELETE,此时默认使用 latin1 编码)。

原型链污染

proto是object的一个私有属性,prototype是原型对象,null没有原型
实例**._prototype*_指向它的构造函数的原型对象

Son.prototype=son.proto

通过proto来改变原型的属性

json解析使proto被当作是键名

利用proto控制基类的成员,造成代码注入从而rce

通俗解释:
- 普通对象(如 {} 或 new Object () )没有 prototype 属性,只有 proto ,指向它的原型。
- 函数对象(如 Object、Array、Function 等)既有 proto ,也有 prototype 。prototype 是函数对象的 “模板”,所有通过该函数创建的对象都会继承这个模板。
obj–>Object.prototype–>null
重要概念: 1. obj.__proto__ 是直接访问对象原型的方式
2.obj.constructor.prototype 是间接访问对象原型的方式
3.这两种路径都能用来修改原型,从而影响所有对象