导语

关于sql中insert 和 select 对长度和空格的处理方式差异造成的漏洞

背景分析

现在的注册页面的逻辑是这样的:

1.用select * from table where username=’$username’检测你输入的用户名,如果存在,说明你注册过,那么不让你注册。

2.用户名不存在,用 insert into table values(‘$username’,’$password’)把你输入的用户名密码插入数据库。

漏洞分析

select 语句对于参数后面空格的处理是删除,insert只是截取最大长度的字符串,然后插入数据库。

假设最大长度限制为25 我们输入用户名为 admin[20个空格]1,密码随意。脚本查询的时候因为用了select 语句,空格被删除,剩下了admin1。

假设数据库里面只有一个admin,所以查不到,因此重新注册为新用户,但是注册的时候用的是insert语句,他不会删除空格,只是截取最大长度的字符串,也就是admin[20个空格],和自己设的密码插入到数据库,作为新的用户。

这时候如果我们用admin 去查找,用select语句,就会返回两条记录,一条是真正的admin另一条是我们绕过用户名检测假的admin(数据库里面的空格也在查询的时候被删除了再比较),这时我们用admin和自己设的密码就可以登陆了。

本地演示

1.数据空中的真正的用户(我们要绕过的用户)
image

2.看看空格是不是被删了
image
image

3.insert 连空格一起插入
image
image

4.模拟用假密码登陆真用户
image

总结

这种绕过方式利用的是select 和 insert 的差异性,其实差异性也是漏洞的根本成因之一,要多多留心

本文参考: