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

原理详解:

  1. 编码转换与截断问题
    • 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)。
  2. HTTP 协议控制字符的注入
    • 利用截断结果\r\n 是 HTTP 协议中的 控制字符(用于分隔请求行、请求头、请求体)。攻击者在请求路径中嵌入精心构造的 Unicode 字符(如 \u{010D}\u{010A}),Node.js 处理时会将其转换为 \r\n注入到 HTTP 请求的原始字节流中
    • 请求拆分攻击:通过注入 \r\n,攻击者可篡改请求结构,将原本的单一请求拆分为多个伪造的请求(如在路径中插入新的请求头或请求体),欺骗服务器发起 未授权的内部请求(即 SSRF 攻击)。
  3. 漏洞触发条件
    • Node.js 版本:8 或更低版本(Node.js 10 及以上已修复,对非 ASCII 字符直接报错)。
    • 请求特征:
      • 接受用户输入的 Unicode 数据 并包含在请求路径中。
      • 请求 无主体(如 GET、DELETE,此时默认使用 latin1 编码)。

原型链污染

image-20250526194358035

proto是object的一个私有属性,prototype是原型对象,null没有原型

实例**._prototype*_指向它的构造函数的原型对象

image-20250526195607344

Son.prototype=son.proto

image-20250526202746124

通过proto来改变原型的属性

image-20250526203707315

json解析使proto被当作是键名

image-20250526205234353

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

image-20250526205407303

通俗解释:

  • 普通对象(如 {} 或 new Object () )没有 prototype 属性,只有 proto ,指向它的原型。
  • 函数对象(如 Object、Array、Function 等)既有 proto ,也有 prototype 。prototype 是函数对象的 “模板”,所有通过该函数创建的对象都会继承这个模板。

obj–>Object.prototype–>null

重要概念: 1. obj.__proto__ 是直接访问对象原型的方式

​ 2.obj.constructor.prototype 是间接访问对象原型的方式

​ 3.这两种路径都能用来修改原型,从而影响所有对象


node js
http://fearless-123.github.io/2025/06/11/nodejs/
作者
fearless123
发布于
2025年6月11日
许可协议