实战 | 记一次授权令牌中SQL注入漏洞挖掘​

VSole2022-07-17 07:42:21

记一次授权令牌中SQL注入漏洞挖掘

今天在这篇文章中,我将分享一篇关于使用授权Header(Authorization Headers token)的 SQL 注入的文章。

Authorization Headers token的一些介绍,

=> 授权令牌由服务器生成和签名,用于通过唯一令牌验证用户。

=> 登录成功后,服务器会发送一个授权令牌,Web 开发者通常会将其存储在浏览器的本地存储或会话存储中。

=> 现代网站使用 JWT(JSON Web 令牌)进行用户授权。这并不意味着每个授权令牌都是 JWT。这取决于网站使用的后端和框架,

渗透过程

我是一个季节性的 Bug 赏金猎人。我尝试通过google dorks搜索一些私人的bug赏金计划,并随机选择了一个程序进行狩猎。

当我从主要目标开始时,我没有做像子域枚举或任何 Dorking 这样的基本侦察。

对我来说,这是平凡的一天。我刚刚启动了 BurpSuite并打开了目标站点。根据公司政策,我不能透露目标。

在 Wappalyzer 插件的帮助下,我注意到目标在 PHP 上运行。

对我来说,PHP 本质上是易受攻击的。作为一名 Web 开发人员,我有丰富的 PHP 构建网站和修复漏洞的经验。

在攻击目标时,我会在侦察过程的初始阶段对目录进行暴力破解并检查 robots.txt 文件。

我使用 Dirsearch 查找隐藏目录,但没有运气。除了管理页面,我没有得到任何可疑的东西。

我尝试通过访问 target/admin/ 打开管理页面

但是没有成功,它会引发错误403 Forbidden

我并没有太快放弃,再次尝试使用Dirsearch 在管理页面内进行 Fuzz。这次活动页面收到了200状态码。

没有任何延迟,我已经打开了页面 www.target.com/admin/events/

我注意到这个页面是一个普通的登录页面,它有两种登录方式,一种用于用户,另一种用于超级管理员

发现SQL注入

正如我所说,登录页面有两个链接,一个用于用户,另一个用于管理员,我选择了第一个,并将我重定向到

www.target.com/admin/events/?classic_login=true

它弹出用户名和密码,我开始提供错误的凭据并观察服务器的响应,测试了一段时间后,我提供的用户名和密码为1'

幸运的是,它出现了SQL报错。

我试图重现它,但它不起作用,并且登录弹出窗口完全消失了。

即使刷新页面后,错误消息也会显示在那里,因为我认为这可能是一些后端错误。

我查看了 Burp代理历史记录,发现没有发送常规的 POST 表单数据或 JSON 数据。

我有一段时间空白,后来在隐身模式下打开了链接,然后出现了用于登录的弹出窗口。再次观察请求和响应。

后来,我注意到带有令牌的 Header Value Authorization。

作为一名 Web 开发人员,我知道授权令牌是如何工作的,并且我对 PHP、MERN 堆栈和一些 Django 框架有很好的了解。我可以很容易地猜到开发人员使用的标记化

Authorization: Basic Base64Values

您可能经常在 Web 应用程序中看到此 Header。

专业提示:在后端,在大多数情况下,Bearer 被忽略,开发人员将令牌与发行的令牌匹配。

如果那是 JWT,那么开发人员通常会对其进行解码,而不是验证这就是不正确的访问控制、帐户接管发生的地方。

我已将请求发送到Repeater,选择了令牌并使用 Burp 解码器对其进行解码,因为我通过长度和性质猜测了加密类型。它不是 JWT,而是 1':1' 的 base64 值

我很快想起了 Sqlmap 工具,捕获了整个请求,并将其保存到一个文本文件中。

并尝试运行sqlmap,但问题出现在base64编码。虽然 sqlmap 支持 base64 编码,但场景是值之间有一个冒号 :。

因为应用程序的行为如下

它接受用户名和密码,并使用 base64 对值进行编码,其中用:分隔

虽然我擅长手动 SQL 注入利用,但有一种 base64 编码的实时模式,并在转发器中应用有效负载。为此,我试图找到目标的列数。

并将用户名和密码的payload:

1' Order By 1 — -:1' Order By 1 — -

Base64后 Auth的payload如下。

Authorization: Basic MScgT3JkZXIgQnkgMS0tIC06MScgT3JkZXIgQnkgMS0tIC0=

base64 编码发送,无 SQL 错误,显示常规未授权错误

试图增加这些列,但抛出错误。我知道只有一列并尝试注入联合语句。

注入payload:

1' Union Select 1 — -:1' Union Select 1 — -

编码后

Authorization: Basic MScgVW5pb24gU2VsZWN0IDEtLSAtOjEnIFVuaW9uIFNlbGVjdCAxLS0gLQ==

我已成功登录管理面板并能够修改内容

下面是没有打码的POC演示

文章来源:HACK学习呀
sql注入base64
本作品采用《CC 协议》,转载必须注明作者和本文链接
HW蓝队初级面试总结
2022-10-12 07:00:02
一、sql注入原理、分类、绕过原理:产生sql注入漏洞主要因为没有对接受到的参数进行过滤、验证和处理直接拼接到了sql语句中,然后直接执行该sql语句,这样就会导致恶意用户传入一些精心构造的sql代码,与后台sql语句拼接后形成完整的sql语句执行,达到攻击者的目的。
在所有漏洞类型中,SQL 注入可是说是危害最大最受大家关注的漏洞。简单说来,SQL 注入是通过在用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。还是以 ThinkJS 为例,假设我们写了如下一个接口(实际情况肯定不会这么写的):
id=3';对应的sql:select * from table where id=3' 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常; 加and 1=1 ,URL:xxx.xxx.xxx/xxx.php?id=1' order by 3# 没有报错,说明存在3列爆出数据库:?id=-1' union select 1,group_concat,3 from information_schema.schemata#爆出数据表:?id=1' and extractvalue--+(爆字段)?
id=1' order by 3# 没有报错,说明存在3列。id=-1' union select 1,group_concat,3 from 数据库名.数据表名--+拓展一些其他函数:system_user() 系统用户名。updatexml函数:细节问题:extractvalue()基本一样,改个关键字updatexml即可,与extractvalue有个很大的区别实在末尾注入加上,如:,而extractvalue函数末尾不加1(数值)?
本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。故事开始1、拿到资产清单后,发现有这样一个站。
0x01 %00绕过WAF输入一个单引号页面报错首先闭合,这里用')闭合keywords=1') %23. order by x 被拦截,用--%0a代替空格即可直接上union select会一直卡着,没有任何返回把空格都改为--%0a,成功响应,在 select 跟 1,2,3... 之间用两个 --%0a 会无响应在 1 后面加上?并 url 编码,原理是 waf 把空字节认为是结束导致了后面的语句可以绕过0x02 Base64绕WAF发现参数为 base64 编码测试字符发现页面报错,使用报错注入来出数据133 and updatexml. 这里可以使用16进制或者科学计数法0x1或1e1keywords=11'and-updatexml
概述在学习SQL注入之前,我们应先了解什么是SQL?原理SQL注入就是当开发人员对用户输入数据的合法性没有判断或过滤不严时,攻击者通过拼接恶意SQL语句诱使解释器在未经适当授权的情况下执行意外命令或访问数据。
VSole
网络安全专家