1 什么是宽字节注入漏洞
所谓宽字节漏洞,简单的说就是对用户输入的内容不谨慎,导致有漏洞代码注入。比如,章三创建一个用户名为:admin。 李四创建用户名:Admin。 区别在于A的字母大小写。如没有做大小写处理,就会导致有2个相同的账号在我们系统中。
2 漏洞的危害
- 可以通过这种漏洞绕过应用程序的安全检查,执行恶意代码或更改应用程序的数据库。
- 攻击者可以利用这种漏洞来获取敏感信息,如用户名和密码等。
3 实战过程
实验靶场是hack the box - LoveTok 来演示宽字节注入漏洞过程。
3.1 信息收集
1.从网站中只可以看出只能点击最下方的按钮,点击后会有一个get参数format=r, 且页面上会根据这个参数输出不同的时间。
2.观看没有session记录
3.网络上无其他接口请求
4.查看js代码并无与数据库有交互
5.后端使用的是php语言
3.2 漏洞分析
根据以上信息可以得知是一个静态页面,且根据参数format改变,中间的时间也会跟着变化。因为是静态无第三方交互。因此可以排除sql注入、xss、ssrt 这些手段。剩下的便可考虑ssti、宽字节漏洞。在操作中可以发现,format主要是控制时间的格式,因此应该在后端做了处理,因此可以排除ssti,尝试宽子节漏洞。
3.3 漏洞利用
得到以上信息后,尝试输入发现 '、"、\ 这些特殊符号做了过滤处理,使用的是addslashes函数,只要绕过这个过滤函数即可为所欲为。
0x01 PHP绕过addslashes,
博主也是百度的,谁知道那么多语言写法呢?是吧。根据以上过滤,发现可以使用${函数} 这个方法进行绕过addslashes函数,可以尝试输入:format=${phpinfo()} 发现可以看到php版本信息。因此这个方法是可行的。
0x02 宽子节漏洞利用
那么就可以尝试使用以下命令来为所欲为了:
format=${${eval($_GET[cmd])}}&cmd=echo(system('ls /'));
参数 cmd 是需要执行的命令,想怎么玩就怎么玩, 命令输入在system('这里是命令'),以上语句将会执行查看服务器的根目录。
在此我们能看到flag文件,下一步使用命令:
format=${${eval($_GET[cmd])}}&cmd=echo(system('cat /flagkloyN'));
flag到手。
任务结束,这就是一个简单的宽子节漏洞演示。
4 漏洞的防范措施
针对这种漏洞的措施包括但不限于:
- 使用安全的编码方式来避免宽字节注入漏洞,如UTF-8编码。
- 对所有输入数据进行验证和过滤,确保不接受危险的字符或命令。
- 使用参数化查询,避免将输入数据直接插入到SQL查询中。
- 定期更新应用程序和数据库系统的安全补丁,以修复已知的漏洞。
- 实施严格的安全策略和访问控制,确保只有授权用户才能访问敏感信息或执行危险操作。
- 监控应用程序和数据库系统的日志,及时发现并应对攻击行为。