文章首发在:先知社区
https://xz.aliyun.com/news/17077
0x00 文章背景
日常测试时发现客户网站存在注入,我看着这界面的样子就像是个CMS来的,搜集一会之后确认了,果然是。本来还想着以为可以捡到一本证书了,结果显然运气不够,开发厂商的注册资产没达标。
那怎么办了,挖都挖了,记录一下吧~~
0x01 报错出现
在瞎注的帮助下,发了有几个数据包出现了报错。同时,发现报错信息中返回了SQL语句。最后在逐步测试中,确认了这个包的参数存在注入:
哎,那很好了。通过上图的报错信息我们可得,最后面的报错信息是:in(''),说明呢,这一段语句原来应该是:
select * from xlz where id in ($id);
我就简单还原一下,大致是这样基本没有问题了。那么同时,单引号被转换成了反斜杠+单引号,说明这里有函数对单引号进行转义。经过测试呢,这个位置出现单引号、双引号、斜杠之类的会直接报错:
接下来,在数据库里造一下语句给大家展示一下:
那么我们后续的Payload,基于这个格式就包没有问题。
0x02 长度判断
经过构造构造构造,最后使用的Payload如下所示:
11)AND(CASE+WHEN(1=1)+THEN+1+ELSE+exp(710)+END
很显然没毛病,接下来二分法判断库名长度:14
接下来,尝试截取字符串,获取库名。但是,显然某个地方出现了问题,我盲猜一波,有东西被过滤了:
0x03 手拿把掐
依照我一坤年的注入经验来看,前面的语句都没有问题,但是来到substr()函数时爆炸了。那么,大概率是逗号被干掉了,那么我们可以:
可以用from for来代替逗号,如下:
让我们套进数据包,发包看看怎么事:
果然我的经验没毛病,接下来直接改一下再往里套:
又忘了件事,出现单引号会被转义。但是获取库名时,字符串是需要被引号包裹的。此时引号又不能用怎么办?那就改造Payload,加入Ascii码函数来转换为十进制:
11)AND(CASE+WHEN(ascii(Substr(database()+from+1+for+1))=1)+THEN+1+ELSE+exp(710)+END
没问题了,直接开爆:
库名已出,点到即止,噢耶~
原文始发于微信公众号(亿人安全):记一次漏洞挖掘过程中的SQL注入浅浅绕过记录
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论