今天遇见了一个SQL注入未曾关注的问题,虽然年华小姐姐讲解了一番,但还是没能很透彻的明白,以此记录,再找机会弄明白。*****where user='admin' password='123123';
用户名正确,密码错误,where查询的结果为“false”,so无结果
用户名正确,密码错误,结果为“false”;
1恒等于1,结果为“true”;
所以where查询的结果为“true”,but为什么会将user表中这两个字段的所有值查询出来?
where后面只有1=1,恒为“true”,but为什么能全部查出来?
关于SQL查询机制,年华小姐姐是这样解释的:
第一条语句:select user,password from users where user='admin' and password='123456md5的值';
首先,将表中第一条数据(admin)提取出,判断where后面的admin是否等于表中admin&判断123456的md5值是否等于表中admin对应的password值,如果都相等,那么where语句为true,再一次对第二条第三条对应的值进行判断。最终会将符合where条件的值显示出。
第二条语句:select user,password from users where 6=6;
首先确认,6恒等于6,所以where语句恒为true。现在进行判断,先拿出第一条数据,判断where后面的语句是否为真,为真就输出,那么第一条将被输入,第二条、第三条、第n条一次被显示出,所以1=1会显示出表中所有的内容。
好,现在来到了SQL注入的万能密码环节。
1、 ' or 1=1
SQL语句为: select......where user='' or 1=1 and password='';
会将所有的内容查出,但是否能登陆成功就要看程序员如何写的网站验证机制了(源码),如果要求查询出的列数>=1,就可以登录;如果相反,则不能登录。
DVWA---Brute Force(Low)
测试语句1: amdin' or 1=1 -- 未登录成功
sql中执行结果:
测试语句2: admin' or '1'='1' -- 登陆失败
测试语句3: admin' or '1'='1 -- 登录成功