1. 漏洞简介

1.1 什么是 SQL 注入漏洞

SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序。 在应用程序中,如果没有做恰当的过滤,则可能使得恶意的SQL语句被插入输入字段中执行(例如将数据库内容转储给攻击者)。

1.2 SQL 注入分类

1.2.1 依据注入点类型分类

数字类型的注入
字符串类型的注入
搜索型注入

1.2.2 依据提交方式分类

GET注入
POST注入
COOKIE注入
HTTP头注入(XFF注入、UA注入、REFERER注入)

1.2.3 依据获取信息的方式分类

基于布尔的盲注
基于时间的盲注
基于报错的注入
联合查询注入
堆查询注入 (可同时执行多条语句)

1.3 SQL注入的危害

成功的 SQL 注入攻击可能导致对敏感数据(如密码、信用卡详细信息或个人用户信息)进行未经授权的访问。近年来,许多备受瞩目的数据泄露事件都是SQL注入攻击的结果,导致声誉受损和监管罚款。在某些情况下,攻击者可以获得进入组织系统的持久后门,从而导致长期危害,可能会在很长一段时间内被忽视。

2. SQL 注入漏洞预防

要使参数化查询有效防止 SQL 注入,查询中使用的字符串必须始终是硬编码常量,并且绝不能包含来自任何源的任何变量数据。不要试图逐案决定某个数据项是否受信任

2.1 预编译

原理:SQL注入只对SQL语句的编译过程有破坏作用,而PreparedStatement已经预编译好了,执行阶段只是把输入串作为数据处理。而不再对SQL语句进行解析。因此也就避免了sql注入问题。

2.2 PDO

实例化PDO对象之后,首先是对请求SQL语句做预编译处理。在这里,我们使用了占位符的方式,将该SQL传入prepare函数后,预处理函数就会得到本次查询语句的SQL模板类,并将这个模板类返回,模板可以防止传那些危险变量改变本身查询语句的语义。然后使用 bindParam()函数对用户输入的数据和参数id进行绑定,最后再执行。

2.3 权限设置

  • Web 应用中用于连接数据库的用户与数据库的系统管理员用户的权限有严格的区分(如不能执行 drop 等)
  • 设置 Web 应用中用于连接数据库的用户不允许操作其他数据库。
  • 设置 Web 应用中用于连接数据库的用户对 Web 目录不允许有写权限。

2.4 其它

  • 严格限定参数类型和格式,明确参数检验的边界,必须在服务端正式处理之前对提交的数据的合法性进行检查。
  • 使用 Web 应用防火墙。

3. 注入方式

3.1. 联合查询注入

💡
满足查询信息前段有回显,有回显位
  1. 注入首先需要判断该表的字段数,联合注入前后查询字段数保持一样,判断字段数可以利用 order by 关键字,如 select * form table order by n 当 n 大于该表字段时候报错
  1. 根据字段数和回显点进行联合查询注入,通过查询语句判断回显位置,如
notion image
通过 select 1,2,3 判断回显,由于数据库存在 id='1' 的数据,所以选择 id='0' 即可
notion image
通过在回显位输入重要函数,则可以得出数据库信息
还有许多函数
  1. 通过元数据库 information_schema
notion image
字段名
notion image
字段值
notion image
总结:
只要语句闭合,利用注释便可以,联合查询主要要有回显位

3.2 盲注

也称为布尔注入,主要用于存在SQL漏洞但不能直接查询内容的地方,主要依靠逻辑的真假来实现爆出数据。
主要分为:
  • 普通型:通过逻辑真假返回页面不同
  • 时间盲注(延时):没有任何数据返回且逻辑不管真假前端页面也无不同

3.2.1 普通盲注

💡
原理:页面根据SQL语句的真假返回不同的页面或信息,尽量用and而不是or
sqli-labs第八关
notion image
而再将id改为0时候
notion image
出现了区别,由此判断是否存在盲注
而再通过
notion image
notion image
substr() 函数是将数据库的第一个字符开始的第一位
由此判断数据库的名字的第一个字符为 s
或者使用brup的intruder模块,或使用脚本

3.2.2 时间注入(延时注入)

通过使用
可以通过 ?id=1' and sleep(5) --+ 判断是否存在延时注入
192.168.31.140/sqli-labs/Less-9/?id=1' and if(substr(database(),1,1)='a',sleep(5),1) --+ 当出现延时效果则表示数据库的第一个字符是 a
也可以编写脚本
 
总结:
盲注和基础注入差别不大,盲注主要的是通过判断页面是否显示和是否存在延时显示判断是否存在注入点,然后其余和普通注入差别不大

3.3 显错注入

💡
存在SQL注入漏洞,前端页面有返回错误内容,即error信息
  • 可以利用的SQL注入函数
  1. floor()
作用:返回小于目标值的最大整数
通过搭配rand() 使用,通过 select count(*),floor(rand(0)*2) x from czs group by xcount(*)group by x同时执行时,就会爆出duplicate entry错误,原因是通过rand() 提供了一个随机的key,那么可以利用此进行注入,如dvwa:
 
  1. updatexml(XML_document,XPath_string,new_value)
作用:替换目标xml快,改变符合节点的值
参数:
  • xml文档对象名称,string格式
  • xpath路径,xpath格式
  • 替换符合条件的数据,string格式
使用时,当XPath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
例如: select * from test where ide = 1 and (updatexml(1,0x7e,3)) 由于0x7e~,不属于xpath语法格式,因此报出xpath语法错误。因此可以利用来提取信息。如:sqli-labs第四关:
 
  1. extractvalue(XML_document,xpath_string)
作用:从目标XML中返回包含所查询值的字符串
参数:
  • xml文档名称,string格式
  • xpath路径,xpath格式
updatexml()xpath_string 输入格式不正确时候出现语法错误,如selectbeijing
总结
显错注入的原理其实就是将需要的信息SQL的报错错误信息一起输出
然后通过各个函数如何出现报错,如 updatexml() 是第二个参数不使用xpath格式则出错,会输出第二个参数信息,此类将信息输出。

3.4 堆叠注入

💡
可以同时运行多条SQL语句,一般不成功
但可以进行堆叠注入的时候,而只能输入一句时,后一句可以使用时间盲注,如

3.5 Header注入

请求头参数
notion image
notion image
notion image

3.5.1 注入原理

当数据库服务器中保存了这些请求头数据,攻击者通过在请求头中构造非法的语句,语句就会在数据库服务器中执行某些操作,达到攻击者的目的。
常用的header注入有cookie注入,U-A头注入,XFF头注入等
  • 通过尝试发现是否存在

3.6 带外注入

带外通道技术(OOB)让攻击者能够通过另一种方式来确认和利用没有直接回显的漏洞。
这一类漏洞中,攻击者无法通过恶意请求直接在响应包中看到漏洞的输出结果。
带外通道技术通常需要利用漏洞来生成带外的TCP/UDP/ICMP请求,然后,攻击者可以通过这个请求来提取数据。

3.7 宽字节注入

开发人员对为了防止注入会选择转义掉'字符,使其失去控制效果。在注入点输入(')会被转义为(\')编码后为(%5c%27)
在GBK编码下,%DF%5C正好组成(運),所以会把\"吃掉",使(')逃逸

3.8 二次注入

来自数据库的内容有时候也是不可靠的。
当注册账号为:admin’#。如果前端做了转义处理,在接收到数据时为:admin\’#,前端不会产生SQL注入。
该用户修改密码的情况下,更新语句条件会变为:where user=‘a

4. 靶场练习

4.1 Burpsuite官方

不同的数据库类型查找元数据的方式不一样

参考文章

 
💡
本文章仅提供学习使用,有任何问题,欢迎您在底部评论区留言,一起交流~
 
 
XSS跨站脚本攻击业务逻辑漏洞