豆知识(第二周)
虽然是豆知识,但又不是关于豆子的知识。
iconv
iconv = “International Code Conversion” 是一个用于在不同字符编码之间转换文本的标准工具/函数库。
不同于base64 或者 URL encode 那种数据层面的编码,iconv 是字符层面的编码,正如其名,国际化,管的是UTF-8转GBK之类的
linux里面有iconv这个命令,可以用它来演示一下有意思的绕过
|
|
非法字节过滤
|
|
to-code 中这数据格式为 “目标编码//修饰符”,其中例子中的IGNORE就是一个修饰符,可以在遇到目标编码不支持的字符时,直接跳过该字符,不报错、不生成任何替代内容,继续转换后续字符。
其中这个\x80就是一个非法的UTF-8字符,会被无视掉变成
模糊
|
|
另外一个修饰符TRANSLIT就是音译的感觉,可以近似替换无法转换的字符(如 é→e)
UTF-7
|
|
一种为了在只支持 7-bit ASCII 的古老信道中传输 Unicode 字符而设计的过渡性编码,由于特殊的历史背景,它有如下特性:
|
|
可以看到,UTF-7编码通过+...-围住了一个base64吗,这是为了打通对非ASCII码的编码支持,但是对ASCII同样生效,这个东西打通了数据编码和字符编码的界限,让绕过很好做
URL编码
URL 编码可以用 % 加上字符的十六进制 ASCII 值来表示特殊字符,避免没有普通的?,&,/ 被解析出特殊含义,其中比较特别的是会把+认成 (空格),其中不需要编码的有这几个
|
|
%00 = ASCII 0x00 = C 语言字符串结束符 \0 ,某些语言/库在遇到 \0 时会提前截断字符串
我让ai总结了其他的一些东西
展开:
URL 结构关键字符(最容易引发解析歧义)
| 字符 | 名称 | URL 编码 | 说明 |
|---|---|---|---|
|
空格 | %20 或 + |
Query 中 + 等价空格,Path 中 + 就是 + |
? |
问号 | %3F |
查询参数起始符 |
& |
和号 | %26 |
参数分隔符 |
= |
等号 | %3D |
键值分隔符 |
# |
井号 | %23 |
片段标识符(锚点) |
/ |
斜杠 | %2F |
路径分隔符 |
% |
百分号 | %25 |
编码起始符(双重编码关键) |
+ |
加号 | %2B |
常被误解析为空格,传 literal + 必须编 |
命令执行/路径遍历字符(CTF 高频)
| 字符 | 名称 | URL 编码 | 绕过用途 |
|---|---|---|---|
| |
管道符 | %7C |
命令拼接 |
; |
分号 | %3B |
命令分隔 |
> |
大于号 | %3E |
重定向 |
< |
小于号 | %3C |
重定向/标签 |
. |
点号 | %2E |
路径遍历 (%2E%2E%2F = ../) |
\ |
反斜杠 | %5C |
Windows 路径/转义 |
$ |
美元符 | %24 |
变量引用 (${IFS}) |
` |
反引号 | %60 |
命令替换 |
~ |
波浪号 | %7E |
家目录/正则 |
控制字符(绕过空格/过滤)
| 字符 | 名称 | URL 编码 | 绕过用途 |
|---|---|---|---|
\0 |
NULL | %00 |
截断字符串(老版本 PHP/Java) |
\t |
TAB | %09 |
代替空格(命令执行) |
\n |
换行 | %0A |
代替空格/绕过正则 |
\r |
回车 | %0D |
配合换行/%0D%0A |
\x0b |
垂直 Tab | %0B |
代替空格(PHP 某些函数识别) |
\x0c |
换页符 | %0C |
代替空格(PHP 某些函数识别) |
脚本/注入相关字符
| 字符 | 名称 | URL 编码 | 说明 |
|---|---|---|---|
" |
双引号 | %22 |
字符串边界 |
' |
单引号 | %27 |
SQL 注入/字符串边界 |
( |
左括号 | %28 |
函数调用 |
) |
右括号 | %29 |
函数调用 |
[ |
左方括号 | %5B |
数组/正则 |
] |
右方括号 | %5D |
数组/正则 |
{ |
左花括号 | %7B |
模板注入/变量 |
} |
右花括号 | %7D |
模板注入/变量 |
@ |
at 符号 | %40 |
邮件/权限 (@localhost) |
! |
感叹号 | %21 |
逻辑非/历史扩展 |
双重编码速查(WAF 绕过专用)
原理:% 本身编码为 %25,所以 X 的双重编码是 %25XX。
| 原始字符 | 一次编码 | 二次编码 | 用途 |
|---|---|---|---|
/ |
%2F |
%252F |
绕过路径过滤 |
. |
%2E |
%252E |
绕过 .. 检测 |
' |
%27 |
%2527 |
SQL 注入绕过 |
|
%20 |
%2520 |
绕过空格过滤 |
+ |
%2B |
%252B |
绕过 UTF-7 转义符过滤 |
% |
%25 |
%2525 |
测试解码层级 |
几个重要提醒
- 大小写不敏感:
%2f和%2F效果一样,混合使用(%2F%2f)有时能绕过正则。 +的陷阱:只有在application/x-www-form-urlencoded(通常是 GET 参数或 POST 表单)中,+才被解析为空格。在 Path 或 JSON Body 中,+就是+。%00的现状:现代 PHP (≥5.3.4) 和大多数框架已修复%00截断漏洞,但在 CTF 的老题或嵌入式设备中仍有效。- UTF-8 多字节:中文字符会被编码成多个
%序列,例如中→%E4%B8%AD。
zip 解压路径穿越
下面这个zip解压缩没有限制路径,可以实现创建任意文件
|
|
无头浏览器
写题的时候遇到一个很复杂的前端认证机制,用来防止自动化脚本攻击,如果要是逆向的话会很麻烦,可以使用无头浏览器,通过代码模拟浏览器的操作,python里面有这个playwright的库
闲话
以前一直执着于挑战一些最难的曲子,结果静下心来去听了刘嘉卓的《嶋》,明明是很简单的指法,但是在细节的处理和情感的把握,仔细听就会感叹:多么精湛的技艺啊
刘嘉卓是我的偶像,听他的曲子可以想象出他是一个什么样的人,也能想象出我想成为的那个人是什么样的
