SQL 注入攻击(一图讲清)
2022-09-05 19:07:53 1 举报
AI智能生成
一图讲清 SQL 注入 什么是 SQL 注入? 为什么会出现 SQL 注入? 如何预防 SQL 注入?
作者其他创作
大纲/内容
01. What<br>(什么是 SQL 注入?)
途径一:通过把 SQL 命令插入到 Web 表单递交
途径二:通过输入域名或页面请求的查询字符串
目的:最终达到欺骗服务器执行恶意的 SQL 命令,从而访问网站的数据库,或对数据进行篡改和毁坏
🌰 比如,之前有影视网站 VIP 会员密码泄漏,大多就是通过 Web 表单递交查询字符爆出来的
场景一:当应用程序使用输入内容来构造动态 SQL 语句以访问数据库时,会发生 SQL 注入攻击。
场景二:如果代码使用存储过程,而存储过程作为包含未筛选的用户输入的字符串来传递,也会发生 SQL 注入。
02. Why<br>(SQL 注入产生的原因)
SQL 注入攻击得逞的主要原因是:动态生成 SQL 语句时没有对用户输入的数据进行验证
对于 Java 数据库连接(JDBC)而言,SQL 注入攻击只对 Statement 有效,因 PreparedStatement 不允许在不同的插入时间改变查询的逻辑结构,所以对 PreparedStatement 是无效的。
相对 Statement,PreparedStatement 有以下优点<br>PreparedStatement 是访问数据库的语句对象的首选
防注入攻击
多次运行速度快
防止数据库缓冲区溢出
代码的可读性、可维护性好
PreparedStatement 的缺点是灵活性不够好
03. How<br>(SQL 注入示例)
SQL 注入的危害
绕过认证机制,在未经授权状况下操作数据库中的数据
拆解后台数据库全部的信息<br>
注入可以借助数据库的存储过程进行提权等操作
SQL 注入简单示例
假如我们有一个 User 表,里边有 username 和 password 字段。
我们通常用 SQL 拼接的方式进行用户验证
如:"select id from user where username =" 'username' "and password =" 'password' " 这里的 username 和 password 都是我们从 Web 表单获得的数据。
简单注入后:"select id from user where username =" 'username' "or 1=1-- " "and password =" '123' "
1=1 是 true,后面的都被注释掉了,所以这里就跳过了 SQL 的验证
04. 典型手段<br>(SQL 注入的典型手段)
按照注入点类型
数字型
其注入点类型为数字,所以叫数字型注入点
在 Web 端大概是 http://xxx.com/news.php?id=1 这种形式,这一类的 SQL 原型大概为 select * from 表名 where id=1 ;
组合出来的 SQL 注入语句一般为:select * from 表名 where id=1 or 1=1--;
字符型
其注入点为字符类型,所以叫字符型注入点
在 Web 端大概是 http://xxx.com/news.php?name=admin 这种形式,这一类的 SQL 原型大概为 select * from 表名 where name='admin';
组合出来的 SQL 注入语句一般为:select * from 表名 where name='admin' or 1=1--;
搜索型
这类注入指在进行数据搜索时没过滤搜索参数,有些显示在链接地址中,有些直接通过搜索框表单提交。
<span style="font-size: inherit;">这一类的 SQL 原型大概为 select * from 表名 where 字段名 like '%关键字%';</span><br>
组合出来的 SQL 注入语句一般为:select * from 表名 where 字段名 like '%关键字%' or '%1%'='%1%'--;
05. 防御方法<br>(SQL 注入的防御方法)
开发人员在开发过程中要有SQL注入防御的思想,对用户输入的所有内容都要进行过滤和检查。<br>
使用数据库时,命名应该较为复杂,不应出现 admin,user 这样的库以及 username、password 这样的字段。<br>
涉及密码的时候一定要加密存储。<br>
使用一些框架及模板前检查代码是否有输入内容检测。<br>
测试阶段,应进行SQL测试。<br>
数据库权限最小化,防止拿到 webshell 权限,不要用特权账户或者能够登录系统的账户启动数据库。
0 条评论
下一页