今天在绕Waf的时候通过fuzz看到了一个奇怪的姿势,于是把人家的payload的拆开了去学习了一波,发现了好玩的东西,学废了学废了。
正常语句
mysql> select * from test where id=1; +------+-------+------+ | id | name | flag | +------+-------+------+ | 1 | baynk | 1 | +------+-------+------+ 1 row in set (0.00 sec)
有意思的语句1
mysql> select * from test where id=1=1; +------+-------+------+ | id | name | flag | +------+-------+------+ | 1 | baynk | 1 | +------+-------+------+ 1 row in set (0.00 sec)
有意思的语句2
mysql> select * from test where id=1=2; Empty set (0.00 sec) mysql>
看到这,大多数人都会认为1=1
是真也就是true
,正常显示,而1=2
是false
所以没有数据,但并不是就这么简单,接着来看有意思的语句3
mysql> select * from test where id=1=0; +------+--------+------+ | id | name | flag | +------+--------+------+ | 2 | tutub | 1 | | 3 | tusiji | 1 | | 4 | baynk | 1 | | 5 | tutub | 1 | | 6 | tusiji | 1 | +------+--------+------+ 5 rows in set (0.00 sec)
有意思的语句4
mysql> select * from test where id=2=0; +------+--------+------+ | id | name | flag | +------+--------+------+ | 1 | baynk | 1 | | 3 | tusiji | 1 | | 4 | baynk | 1 | | 5 | tutub | 1 | | 6 | tusiji | 1 | +------+--------+------+ 5 rows in set (0.00 sec)
应该能发现不同了吧。
最终测试结果如下:
select * from test where id=1 =1; 这句应该是选择id=1的行,后面=1应该是代表true,0代表false,1代表true select * from test where id=2 =1; 这句应该是选择id=2的行,后面=1应该是代表true,0代表false,1代表true select * from test where id=2 =2 这句应该是选择id=2的行,后面=2没有任何含义,应该只能=0或者=1 select * from test where id=2 =0 这句应该时候选择id=2的行,但是后面=0表示false取反,也就是选择id不等于2的行。
嘿嘿,挺有意思的吧,接下来来看实战运用。
我自己想法就是当and
不能使用时,可以直接使用=
来代替。
比如and
关键字被过滤
此时可以使用=
号来进行测试,正常显示
除了admin
以外的所有数据
当然由于DVWA环境的特殊性,这里会显示所有,如果是用正常网站会显示出另外一个页面,我已经测试过了,大家也可以自己测试下。
还可以使用=2
此时肯定就没回显了。
也可以通过类型这种方法来做布尔注入。
以上就能说明当前用户名的长度是等于14
的。
可能还有啥其它妙用,后面发现了再测试。