SQL注入
SQL注入
SQL
注入即是指web
应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web
应用程序中事先定义好的查询语句添加额外的SQL
语句,从而实现非法操作,获取数据库数据,服务器提权等,很多机构将SQL
注入作为第一危险的安全漏洞。
原理
SQL
注入攻击是通过操作输入来修改SQL
语句,用以达到执行代码对WEB
服务器进行攻击的方法。简单的说就是在post/get
表单、输入域名或页面请求的查询字符串中插入SQL
命令,最终使web
服务器执行恶意命令的过程。
SQL
注入语句一般都嵌入在普通的HTTP
请求中,比较难过滤,攻击者可以不断调整攻击的参数,导致SQL
注入变种极多,而且互联网上有很多SQL
注入工具,不需要专业知识也能自如运用。
简单实例
首先建立简单表,在user_info
中写入账号acc
与密码pwd
,qqq
表用来测试drop
CREATE TABLE `user_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`account` varchar(20) NOT NULL,
`password` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;
CREATE TABLE `qqq` (
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
加入后端查询数据库使用此SQL
进行查询,通过用户输入的数据进行拼接,查询结果等于1
即作为登录成功,此查询结果明显等于1
SELECT count(*) FROM user_info WHERE account = 'acc' AND password = 'pwd'
假如用户传入的账号为'or 1=1#
,后端并未过滤特殊字符,那么这条查询就出现了问题,此结果明显也能查出count(*)
结果为1
,or
操作的1=1
永远为true
,#
后边的内容则被注释掉了
SELECT count(*) FROM user_info WHERE account = ''or 1=1#' AND password = 'pwd'
甚至我们可以通过注入来drop
表,同样通过传入不正常的账号';DROP TABLE qqq#
,执行后qqq
表即被drop
SELECT count(*) FROM user_info WHERE account = '';DROP TABLE qweqwe#' AND password = 'pwd'
注入过程
注入点探测
首先进行SQL
注入点探测,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。如果此时后端使用拼接查询的方式执行SQL
,那么就有可能被注入。
观察系统行为
带内注入:观察后端是否将数据库错误信息向前端返回,从显示的错误消息中获取有关数据库的信息;使用UNION ALL
将被盗信息与合法信息链接起来进行尝试,两者都是试错法,可以检测到错误。
盲注入:推理注入,盲注入攻击不会直接从目标数据库中显示数据;相反,攻击者会仔细检查行为中的间接线索。HTTP
响应中的详细信息,某些用户输入的空白网页以及数据库响应某些用户输入需要多长时间,这些都可以是线索,具体取决于攻击者的目标。
带外注入:这种攻击有点复杂,攻击者会制作SQL语句,这些语句在呈现给数据库时会触发数据库系统创建与攻击者控制的外部服务器的连接。以这种方式,攻击者可以收集数据或可能控制数据库的行为。
数据获取
判断字段长度,判断字段回显位置,判断数据库信息,查找数据库表名,查找数据库表名,查找字段名,再根据这些信息构建注入SQL
进行注入,登录后台,数据盗取,进行服务器提权等操作。
防御
分级管理
对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。
拦截请求
拦截正则表达式匹配的非正常的请求,例如s+(or|xor|and)s+.*(=|<|>|'|")
、select.+(from|limit)
、(?:(union(.*?)select))
、(?:(?:current_)user|database|schema|connection_id)s*(
等等
参数过滤
将提交的敏感字符进行过滤,例如'
、"
、:
、、
;
等等
变量检查
确定变量的数据类型,例如对传入的id
检测为int
型,传入邮箱为严格的邮箱格式
隐藏错误
避免直接向用户显示数据库错误,攻击者可以使用这些错误消息来获取有关数据库的信息。
预编译语句集
采用预编译语句集,它内置了处理SQL
注入的能力,极大地提高了安全性
防火墙
对访问数据库的Web
应用程序使用Web
应用程序防火墙WAF
,它可以帮助识别SQL注入尝试
定期检查
定期测试与数据库交互的Web
应用程序,且将数据库更新为最新的可用修补程序,防止旧版本的漏洞利用
- hbase问题总结
- mysql DUPLICATE KEY UPDATE 问题
- mysql复制学习二 安装及首次复制配置
- 关于操作权限
- hadoop loadBalance源码分析
- writeup | 应该不是 XSS
- Hbase 源码分析之 Get 流程及rpc原理
- MOCTF WEB 题解
- HBase行锁与MVCC分析
- HBase行锁探索
- Spring Cloud构建微服务架构:分布式服务跟踪(抽样收集)【Dalston版】
- HBase client访问ZooKeeper获取root-region-server DeadLock问题(zookeeper.ClientCnxn Unable to get data of zn
- zookeeper学习系列:四、Paxos算法和zookeeper的关系
- 有了phonegap你还android吗?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在laravel5.2中实现点击用户头像更改头像的方法
- laravel 多图上传及图片的存储例子
- Laravel 添加多语言提示信息的方法
- Laravel框架表单验证操作实例分析
- Thinkphp5.0框架视图view的模板布局用法分析
- laravel5环境隐藏index.php后缀(apache)的方法
- php实现对文件压缩简单的方法
- laravel实现Auth认证,登录、注册后的页面回跳方法
- php 实现银联商务H5支付的示例代码
- Yii2.0框架behaviors方法使用实例分析
- laravel 去掉index.php伪静态的操作方法
- laravel 获取某个查询的查询SQL语句方法
- laravel dingo API返回自定义错误信息的实例
- Linux基于php-fpm模式的lamp搭建phpmyadmin的办法
- 基于laravel Request的所有方法详解