# SQL注入 `SQL`注入即是指`web`应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在`web`应用程序中事先定义好的查询语句添加额外的`SQL`语句,从而实现非法操作,获取数据库数据,服务器提权等,很多机构将`SQL`注入作为第一危险的安全漏洞。 ## 原理 `SQL`注入攻击是通过操作输入来修改`SQL`语句,用以达到执行代码对`WEB`服务器进行攻击的方法。简单的说就是在`post/get`表单、输入域名或页面请求的查询字符串中插入`SQL`命令,最终使`web`服务器执行恶意命令的过程。 `SQL`注入语句一般都嵌入在普通的`HTTP`请求中,比较难过滤,攻击者可以不断调整攻击的参数,导致`SQL`注入变种极多,而且互联网上有很多`SQL`注入工具,不需要专业知识也能自如运用。 ## 简单实例 首先建立简单表,在`user_info`中写入账号`acc`与密码`pwd`,`qqq`表用来测试`drop`。 ```sql 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`。 ```sql SELECT count(*) FROM user_info WHERE account = 'acc' AND password = 'pwd' ``` 假如用户传入的账号为`'or 1=1#`,后端并未过滤特殊字符,那么这条查询就出现了问题,此结果明显也能查出`count(*)`结果为`1`,`or`操作的`1=1`永远为`true`,`#`后边的内容则被注释掉了。 ```sql SELECT count(*) FROM user_info WHERE account = ''or 1=1#' AND password = 'pwd' ``` 甚至我们可以通过注入来`drop`表,同样通过传入不正常的账号`';DROP TABLE qqq#`,执行后`qqq`表即被`drop`。 ```sql 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 ```