** 今天做了一道关于sql注入的题(被虐了555),看了一些题解终于知道了方法,哎!心累**
不过收获还是蛮多的!特别是得到了一个很有用的技巧!!!事实证明我在以后的测试中会经常碰到这样的
打开链接
发现是一道POST注入题(挺头疼的),并且一开始以为给的提示是过滤掉的,后来fuzz(模糊测试)发现并不是;
随便输入一个admin账号
发现竟然只是密码错误(一定是先判断账号正误,在判断密码正误,既可以在账号处尝试一下布尔注入的方式)
猜一下sql语句 select * from xxx where username=‘xxxx’;(大致是这样)
后面发现过滤了很多包括+ * and or…等等啦,于是自己弄个测试的字典(以前也没有这种习惯,不多后来发现很重要的,特别对于一些过滤严密的!)
确实过滤了很多
返回长度为370的为过滤掉的,367的为未过滤的,判断方法(点击一个爆破结果,点击response,发现返回为 alert(‘illegal character!!@_@’ ,判断为过滤):
果然还是要弄个模糊测试啊,不然要判断到什么时候啊,这时候问题又来了,想着要进行布尔注入,可是这好像什么都过滤了,但是发现异或符号^没有过滤,可以尝试一下异或注入,构造如图
发现只有当括号内为"真"时,会返回username error,或许有人想利用burp爆破功能,可惜---------
无论是username error 还是 password error 两者返回的长度是相同的
。。。。这就只能手工了。。。还有注意事项,盲注的时候会用到substr()函数,可是逗号被过滤,因此可以这样绕过substr(database()from(1)for(1))==substr(database(),1,1)----可是for被过滤了啊!!!!!!!
不用怕直接这样substr(database()from(1))------>>>如果默认不加后面的参数的话他会返回后面所有的字符串,看图:
但是进行比较的时候只会用第一个进行比较:
因为该表有五条记录所以会有五条查询结果:
但是此题仍然不能这样去做,因为。。。。or被过滤了!!!!坑啊!!!害我弄这么长时间;
接下来就是看了一下wp:
说是看的POST表单里的name属性猜的。。。。。(我怎么可能想得到QAQ),但结果就是对的。。。
所以去构造payload:
32位的,应该是md5,手工慢慢弄吧:
之后得到md5加密后的密码到专门的网址解密就行了:
1
2
上面的可以互补,cmd5有的要收费;
执行以下得到flag
曲折---------,不过有一点不明白,就是在上述我的payload的最后一个单引号后面加一些东西,就导致回显不能用于判断了,求大佬告知!
以上都是看了大佬们写的博客弄出来的,下面讲一下博客里面的思路;
当然并没有用异或,用的是"-",即减法(就这样说吧);下面讲一下原理,就是在一些运算符进行运算的时候会先观察左右两端的数据类型是否相同;
不同的话就会进行数据强制的转换;
根据我们猜测的sql语句做一下实验:
select * from xxx where username=‘xxxx’;
上面是实验用表;
首先试一下 select *from users where username=0;(没错就是0)
发现能把几乎所有信息给爆出来(除了一个特别的123Mikasa);这是为什么?
这就是强制类型转换在 “=”,左右进行比较时会将两者类型转换相同在进行比较,因此字符串就会被整数,如果一个字符串不是以数字开头的那么转换后将为零,比如"bhdfvsdjaokaakod"转换后就为0,因此username=0;就可以爆出所有满足条件的用户,反而"123Mikasa"转换后为123,不满足username=0;因此就不会回显;
而此题我们知道用户名为admin,就知道用这种方法可以成功,因此接下来就判断啦;
首先试一下select * from users where username=‘admin’-0-’’;
结果一致。分析,减法 “-” 也是一种运算符因此也会发生类型转换,上述理解为
字符串 -(减) 0 -(减)字符串
发生类型转换所以为 0-0-0结果为零;不信我们做个试验:
这下相信了吧:
下面我们这样试试:select * from users where username=‘tset’-(1=2)-‘test’;
也可以!!(1=2)为假,所以对于布尔值就是0,结果0-0-0=0;回显正常!!!
试试这个:
select * from users where username=‘test’-(1=1)-‘test’;
一个都找不到,我们看看它的结果是啥:
嘿嘿(1=1)成立,因为是布尔值就为1;
0-1-0=-1
一切就都解释的通了;
下面构造payload
当括号为真时,结果为username=-1;—>查不到这个用户名,用户名可是admin,类型转换后为0!!!
因此就这样判断!!!!!下面的过程类似。
原地址:
以上均为个人观点,如有不对,望指点!!!
PS:当然用不仅仅是减号,乘号*,加法+,除法/,都是值得一试的
这个是字典链接:https://pan.baidu.com/s/1JRX9I1fuz_OnrHbcB1qAgg