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