Unicode Injection

Reading time: 4 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

介绍

根据后端/前端在接收奇怪的unicode字符时的行为,攻击者可能能够绕过保护并注入任意字符,这些字符可能被用于利用注入漏洞,例如XSS或SQLi。

Unicode规范化

Unicode规范化发生在unicode字符被规范化为ascii字符时。

这种类型漏洞的一个常见场景发生在系统在检查用户的输入后以某种方式修改该输入。例如,在某些语言中,简单地调用将输入转换为大写或小写可能会规范化给定的输入,unicode将被转换为ASCII,生成新字符。
有关更多信息,请查看:

Unicode Normalization

\u%

Unicode字符通常用**\u前缀表示。例如字符\u3c4b在这里查看)。如果后端前缀\u转换为%,则结果字符串将是%3c4b,URL解码后为:<4b。正如你所看到的,<字符被注入
如果后端存在漏洞,你可以使用此技术注入任何类型的字符
查看https://unicode-explorer.com/以找到你需要的字符。

这个漏洞实际上来自于一位研究人员发现的漏洞,想要更深入的解释请查看https://www.youtube.com/watch?v=aUsAHb0E7Cg

Emoji注入

后端在接收表情符号时表现得有些奇怪。这就是在这篇文章中发生的情况,研究人员成功地通过一个有效载荷实现了XSS,例如:💋img src=x onerror=alert(document.domain)//💛

在这种情况下,错误在于服务器在删除恶意字符后将UTF-8字符串从Windows-1252转换为UTF-8(基本上输入编码和转换编码不匹配)。然后这并没有给出一个正确的<,而是一个奇怪的unicode字符:
``所以他们将这个输出再次从UTF-8转换为ASCII。这规范化<,这就是该系统上漏洞能够工作的方式。
发生的事情是:

php
<?php

$str = isset($_GET["str"]) ? htmlspecialchars($_GET["str"]) : "";

$str = iconv("Windows-1252", "UTF-8", $str);
$str = iconv("UTF-8", "ASCII//TRANSLIT", $str);

echo "String: " . $str;

Emoji 列表:

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks