sql注入
1、定义
sql注入,是用户提交的数据,服务端接收后未经过严格检查,将其直接拼接到sql语句中,交给sql应用执行,超出了开发者预期的sql语句结构,从而造成危害。
与xss需要用户参与不同,sql注入攻击者可以直接实现。
(1)提交数据
- 并不局限请求方法,get/post/put/delete均可,关键看服务端的接收实现
- 数据可能在url的路径参数或直接参数中,也可能在请求头部字段中(referer、origin、cookie、user-agent等),还可能是请求体部中
(2)拼接
一般来说,编程语言提供的预编译机制可以几乎完全避免sql注入
(3)sql应用
绝大部分sql应用都有可能因为网站业务程序开发的问题,而发生sql注入漏洞。
比如mysql、oracle、sql server等,一般讨论的是mysql。
(4)危害
- 基于select、update、delete的超范围执行
- 基于四种语句结构的查询,查询本表数据,查询其他数据库和数据表数据,查询函数
- 任意sql语句执行,基于堆栈注入,比如可以删除数据库,添加数据库用户等
- 系统命令执行和文件读写
2、增删改查
在网站与数据库相关的业务中,基本可以归纳为增删改查语句,而其都存在sql注入的可能。
所有受用户控制的参数都有可能存在注入,实际过程中主要将字段值作为测试参数,而忽略数据表名、字段名和方法等。
2.1 增insert
(1)作为插入的值,可能存在注入
- 如果insert中使用的是values而非value,那么可以考虑构造同时插入多行数据
- 如果存在注入的并非最后一个参数值,可以对其后的参数进行注释,而在注释前构造想要补充的数据,同时满足列数
- 如果存在多个注入点,可以通过引号,使两个注入点的中间部分作为一个参数,然后前后补齐结构,并构造想要补充的数据,同时满足列数
(2)从效果上来说
- 一次性添加多条数据,一般多余的数据是未经过检查的。可以一次充值增加两条记录,注册其他用户所用账号
- 一次性添加一条数据,但部分字段可以自定义。
- 从而可以查询函数信息或者数据表数据,写入到该按行中,攻击者可以请求查看
- 自定义一些关键字段,比如账号权限、账号余额等
2.2 删delete
(1)作为where条件的判断值可能存在注入
(2)从效果上来说
- 可能超权限、超范围进行删除,甚至进行删库
- 时间盲注或布尔盲注获取信息
2.3 改update
(1)作为更新的值可能存在注入
(2)作为where条件的判断值可能存在注入
(3)从效果上来说
- 可能超权限、超范围进行删除,甚至进行整体覆写
- 时间盲注或布尔盲注获取信息
- 可以查询,将查询的信息写入更新字段中,攻击者可以请求查看
2.4 查select
(1)作为where条件的判断值可能存在注入
(2)作为order by的参数可能存在注入
(3)作为limit的参数可能存在注入
(4)从效果上来说
- 查询,时间盲注或布尔盲注,联合查询
- 可能超权限、超范围进行删除,甚至进行脱库
补充:这四种sql语句都可能存在堆栈注入,以及除了insert外的三种类型的where条件都可能存在错误注入。
3、防护
(1)预编译
(2)作为补充,进行输入的敏感字符过滤、字符长度限制、关键词过滤
禁止直接输出sql异常信息