宇宙免责声明!!!
本推文提供的信息、技术和方法仅用于教育目的。文中讨论的所有案例和技术均旨在帮助读者更好地理解相关安全问题,并采取适当的防护措施来保护自身系统免受攻击。
严禁将本文中的任何信息用于非法目的或对任何未经许可的系统进行测试。未经授权尝试访问计算机系统或数据是违法行为,可能会导致法律后果。
作者不对因阅读本文后采取的任何行动所造成的任何形式的损害负责,包括但不限于直接、间接、特殊、附带或后果性的损害。用户应自行承担使用这些信息的风险。
我们鼓励所有读者遵守法律法规,负责任地使用技术知识,共同维护网络空间的安全与和谐。
-
登录框处存在sql注入。
-
判断注入:
-
用户名是base64编码,所以我们的测试语句需要编码成base64再发送。
-
用户名测试单引号报错,登录失败:
-
测试两个单引号,发现正常。
-
初步判断存在注入。可以看到是aspx的,那就首先测试看是不是mssql数据库吧。
a' or db_name()='1
-
返回正常,那试个语法错误看看会不会报错。
a' or db_namea()='1
-
报错,那就可以确实这是一个mssql数据库的注入了。
-
后端sql语句大概就是:
select xx from xxx where username=’’ and password=’’
-
尝试构造语句注入:
' or '1'='1
-
那后端sql应该就是:
select xx from xxx where username=’' or '1'='1’ and password=’’
-
这条sql返回的结果应该是真,根据万能密码,我们应该是可以直接登录的。
-
这里返回了:帐号已被禁止登录系统。
-
这里其实是构造成功了,只不过账号被禁用了登不进去。
-
那试试
or ‘1’=’2
-
会发现也是返回帐号已被禁止登录系统。为什么呢?分析一下sql语句就知道了。
select xx from xxx where username=’' or '1'='1’ and password=’’
-
因为and的优先级被or高,所以这里可以看成or把前后语句分开了。
-
首先红色部分,也就是username=’’,这里为真。
-
然后黄色部分是’1’=’1’ and password=’’,这里肯定为假,因为我们填入的password不是真正的密码。And要两边为真才是真。
-
所以真or假=真。所以这里不管输入or ‘1’=’1’ 还是 or ‘1’=’2,返回的结果都是真,是没办法构造出true和false两种状态的。
-
既然知道了登录的sql逻辑,再尝试构造一下语句,进行布尔盲注。
-
尝试输入
' and 1=1 or '1'='1
再试试
' and 1=2 or '1'='1
-
到这里可以发现两种回显不一样,1=1的时候返回真,1=2的时候返回假。那就构造出true和false两种状态了。
-
那为什么这样可以呢?还是来分析下sql语句。
select xx from xxx where username=’' and 1=2 or '1'='1’ and password=’’
-
首先还是红色部分:username=’’为真,1=2为假,所以红色部分整体为假。
-
再看黄色部分,黄色部分整体肯定为假,因为password是假的。
-
所以假 or 假 = 假。
-
其实整个sql语句是真还是假,是由1=2这块确定的,如果输入的条件为真就是真,为假就是假。
-
那到这里基本拿下了。判断下user的长度。
Len(user) > 1
-
正常
Len(user) > 100
-
报错
-
那后面就是慢慢确定user的位数了。
-
注意:这里用--注释不行的。
Select xx from xxx where username=’’ or 1=1 -- and password=’’
-
如果注释可以用,那就是普通方式注入了,直接or后面跟注入语句。
课程介绍链接:https://www.yuque.com/syst1m-/blog/lc3k6elv0zqhdal3?singleDoc# 《课程介绍》
外部交流群(欢迎进群骚扰我,互相交流)
原文始发于微信公众号(Zer0 sec):团队内部漏洞挖掘-sql注入实战案例
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论