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异常信息

 

posted @ 2023-04-16 01:31  挖洞404  阅读(125)  评论(0编辑  收藏  举报