滴滴滴滴,发车了,系好安全带,带好安全帽
一:SQL前提知识点
1)SQL语句,比如mysql中的`select name from t_user where id = $id`
2)web程序一般具有3层结构;展示层,业务逻辑层,数据层(如下图)
复制代码
二:SQL注入攻击主要方式
1)猜解后台数据库,提高权限
2)绕过认证
复制代码
三:SQL注入攻击核心
(展示层)用户动态输入 + (逻辑层)传入参数没有审查 => SQL攻击
复制代码
四:绕过认证举例
一般我们查询用户个人信息的时候,我们会使用id进行查询,如下面的语句
select * from user where id = $id
select * from user where username = 'user' and password =' 111 '
这时我们如果将输入的id变成:id=1or1=1
或者使用字符串注解
的方式,那么整个后端查询语句多久变成
select * from user where id= $id or 1=1
select * from user where username = $username -- and password = '111'
这个时候就算你没有正确的用户id,没有用户密码,你还是获取到了用户的个人信息,并且登陆用户账号
五:猜解后台数据库举例
比如我们有一段查询信息表个如下
select * from user where student_id = '4'
我们通过union
拼接查询语句,获取数据库各种信息,比如数据库版本,数据库名称,查询所有库名称等等操作
select * from user where student_id = '4' union select 1,1,version(),1
select * from user where student_id = '4' union select 1,1,database(),1
通过这样不断的猜解,分析数据库信息,获取更多的用户数据和敏感内容
这个只是SQL最简单的攻击方式,并且真实的SQL注入攻击是比较复杂的,但是3种SQL注入式攻击的核心点,就是注入。比如我们猜解后台数据库中,就是通过不断的注入,获取各种信息(请求方式,编码语言,数据库名称,数据库编码方式等等),综合各种信息和不断的猜测,就获取了各种个人信息。
六:如何预防
代码层防止SQL注入攻击的最佳方案就是SQL预编译。使用预编译,而其后注入的参数将不会再进行SQL编译
。也就是说其后注入进来的参数系统将不会认为它会是一条SQL语句,而默认其是一个参数
,参数中的or或者and 等就不是SQL语法保留字了。
严格检查传入参数类型,长度
严格控制数据库权限,处理SQL异常响应