freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

记一次真实渗透排序处发现的SQL注入学习
2022-07-15 00:11:19
所属地 贵州省

00x0前言

为啥叫真实渗透的sql注入“学习”呢,嘿嘿,自然不是本人挖到的,是同事大佬挖到的,本着学习的态度,去复现了下,结果遇到些问题,才有了这篇文章。

00x1复现失败

大佬发现的这个sql注入非常快,另一个同事刚把站的后台管理系统弱口令给发出来几分钟,大佬就发sql注入得到数据库名的截图了。我人麻了,太强了。我寻思那么多接口,那么多参数,是怎么那么迅速的发现问题的?带着这个疑问我去试了一下。

大佬的图是这样的。

我按着接口找到漏洞点。

我直接点击查询,然后抓包,并利用上大佬的payload,可是数据库第一个字母不是i吗,我a怎么也返回200?(试了其他的,全都返回200)

换个判断长度的语句,根据大佬跑出来的数据库名长度为7,我填8还是返回200,说明有问题。

后来发现order参数的值undefined有些奇怪,就随意更改了一下,发现返回500,但是不管是啥都返回500,看样子确实是参数的问题,猜想应该是order为某个特殊的值,才会触发SQL注入(大佬的截图刚好没有截到order参数的值),FUZZ了半天也不知道是啥,就跑去请教大佬,大佬说确实是这样,是需要让其值为asc或者desc才能触发。asc在sql语句中起到升序作用,desc为降序。具体原理后面再总结。

00x2重新复现

得到大佬的指示,开始重新复现,更换order值为asc,column参数加单引号果真报错。

输入payload,数据库名第一位a,返回500(i的话就会返回200)

这里忘截图了,借用一下大佬的图,数据库长度为7。返回200(其余的都会返回500)

发送数据包到intruder模块爆破一下

攻击类型选择第四个cluster bomb

把数据库名的位数和数据名的字母给添加一下

设置payload1为1-8的数字

设置payload为a-z的字母。

开始爆破,成功得到数据库名。

00x3总结

后来又测试了其他参数后,发现并不存在注入,仅仅只有column参数在order为asc和desc时存在注入。又去找大佬交流了一下。大佬说这个是一个小技巧,像这种java站的,这种排序的地方都可以测一下,可能就有order by注入。

大佬解释了下大概原理:参数化会将参数值加上引号,但是order by字段不能带引号,所以很多排序功能常存在注入问题,如mybatis中预编译使用 #{} 而order by 字段使用参数化后有问题,所以开发者可能直接就使用 ${ }从而存在注入问题。本次遇到的也正是mybatis。

对于本次使用的payload我也解释一下:IF(substr(database (),1,1)='i',1,(select+1+union+select+2))

因为此处是order by注入,这句payload翻译过来就是:如果数据库名字的第一个字母是i,就执行1,如果不是i,就执行select 1 union select 2,又因为这个语句返回的是两行数据,在语法规范上是错误的,导致整条语句都不执行,所以报错。这样就可根据返回码来区分,并进行快速爆破来判断出数据库名,类似于布尔盲注。

# 渗透测试 # web安全 # 学习分享 # order by 注入
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者