Featured image of post 豆知识(第二周)

豆知识(第二周)

生活小妙招

豆知识(第二周)

虽然是豆知识,但又不是关于豆子的知识。

iconv

iconv = “International Code Conversion” 是一个用于在不同字符编码之间转换文本的标准工具/函数库。

不同于base64 或者 URL encode 那种数据层面的编码,iconv 是字符层面的编码,正如其名,国际化,管的是UTF-8转GBK之类的

linux里面有iconv这个命令,可以用它来演示一下有意思的绕过

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
iconv --help
用法: iconv [选项...] [文件...]
转换给定文件的编码。

 指定输入/输出格式:
  -f, --from-code=名称     原始文本的编码
  -t, --to-code=名称       输出的编码

 信息:
  -l, --list                 列举所有已知的字符集

 输出控制:
  -c                         从输出中略去无效的字符
  -o, --output=文件        输出文件
  -s, --silent               关闭警告
      --verbose              打印进度信息

  -?, --help                 给出此帮助列表
      --usage                给出简要的用法信息
  -V, --version              打印程序版本号

非法字节过滤

1
2
3
$ printf "fl\x80ag" | iconv -f UTF-8 -t UTF-8//IGNORE   # 使用 printf 输出原始字节,\x80 是非法的 UTF-8 起始字节
iconv: 位置 5 处的输入序列非法
flag⏎

to-code 中这数据格式为 “目标编码//修饰符”,其中例子中的IGNORE就是一个修饰符,可以在遇到目标编码不支持的字符时,直接跳过该字符,不报错、不生成任何替代内容,继续转换后续字符。

其中这个\x80就是一个非法的UTF-8字符,会被无视掉变成

模糊

1
2
$ printf "fl\xc3\xa0g" | iconv -f UTF-8 -t ASCII//TRANSLIT ## \xc3\xa0 是 UTF-8 编码的 'à' (U+00E0)
flag⏎

另外一个修饰符TRANSLIT就是音译的感觉,可以近似替换无法转换的字符(如 é→e)

UTF-7

1
2
$ printf "+AGYAbABhAGc-" | iconv -f UTF-7 -t UTF-8 # 使用 UTF-7 的小特性
flag⏎

一种为了在只支持 7-bit ASCII 的古老信道中传输 Unicode 字符而设计的过渡性编码,由于特殊的历史背景,它有如下特性:

1
2
3
4
5
6
$ printf "铅笔" | iconv -f UTF-8 -t UTF-7
+lMV7FA-⏎                                                                                                                                                                                                                       󰪢 0s 󰜥 󰉋   /  /blog/images
$ printf "铅笔" | iconv -f UTF-8 -t UTF-16BE | base64
lMV7FA==
$ printf "flag" | iconv -f UTF-7 -t UTF-8
flag⏎

可以看到,UTF-7编码通过+...-围住了一个base64吗,这是为了打通对非ASCII码的编码支持,但是对ASCII同样生效,这个东西打通了数据编码和字符编码的界限,让绕过很好做

URL编码

URL 编码可以用 % 加上字符的十六进制 ASCII 值来表示特殊字符,避免没有普通的?&/ 被解析出特殊含义,其中比较特别的是会把+认成 (空格),其中不需要编码的有这几个

1
A-Z a-z 0-9 - _ . ~

%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 测试解码层级

几个重要提醒

  1. 大小写不敏感%2f%2F 效果一样,混合使用(%2F %2f)有时能绕过正则。
  2. + 的陷阱:只有在 application/x-www-form-urlencoded(通常是 GET 参数或 POST 表单)中,+ 才被解析为空格。在 Path 或 JSON Body 中,+ 就是 +
  3. %00 的现状:现代 PHP (≥5.3.4) 和大多数框架已修复 %00 截断漏洞,但在 CTF 的老题或嵌入式设备中仍有效。
  4. UTF-8 多字节:中文字符会被编码成多个 % 序列,例如 %E4%B8%AD

zip 解压路径穿越

下面这个zip解压缩没有限制路径,可以实现创建任意文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def safe_upload(zip_path: Path, dest_dir: Path) -> list[str]:
    with zipfile.ZipFile(zip_path, 'r') as z:
        for info in z.infolist():
            target = os.path.join(dest_dir, info.filename)    # 直接拼接地址没有检查路径,可以实现路径穿越
            if info.is_dir():
                os.makedirs(target, exist_ok=True)
            else:
                os.makedirs(os.path.dirname(target), exist_ok=True)
                with open(target, 'wb') as f:
                    f.write(z.read(info.filename))

无头浏览器

写题的时候遇到一个很复杂的前端认证机制,用来防止自动化脚本攻击,如果要是逆向的话会很麻烦,可以使用无头浏览器,通过代码模拟浏览器的操作,python里面有这个playwright的库

闲话

以前一直执着于挑战一些最难的曲子,结果静下心来去听了刘嘉卓的《嶋》,明明是很简单的指法,但是在细节的处理和情感的把握,仔细听就会感叹:多么精湛的技艺啊

刘嘉卓是我的偶像,听他的曲子可以想象出他是一个什么样的人,也能想象出我想成为的那个人是什么样的

alt text

你好,这是一个随便写写,随便看看的无聊而与我很重要的网站。
使用 Hugo 构建
主题 StackJimmy 设计