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
应用程序,且将数据库更新为最新的可用修补程序,防止旧版本的漏洞利用。
每日一题
https://github.com/WindrunnerMax/EveryDay