sql注入补充——get注入

Sql注入

Mysql中的information_schema库

用于存储数据库元信息,包含了数据库、表、列、索引等结构化信息。

特点

只读性

标准化:它是sql标准的一部分,适用于多种数据库系统

动态生成:数据是动态生成的,实时反映数据库的状态

常用表

Tables:存储数据库中所有表的信息,表名、表类型

Columns:存储表中列的详细信息,列名、数据类型

Schemata:存储所有数据库的基本信息

Statistics:存储表的索引信息

Views:存储视图的定义和相关信息

Sql常用函数

CONCAT(s1,s2...sn)

无分隔号连接字符

CONCAT_WS(x, s1,s2...sn)

合并多个字符串,并添加分隔符x:

GROUP_CONCAT([DISTINCT] expr [,expr ...]

             [ORDER BY {unsigned_integer | col_name | expr}

                 [ASC | DESC] [,col_name ...]]

             [SEPARATOR str_val])

连接一个组的所有字符串,默认用逗号分隔,可以通过指定separator更改分隔符

SUBSTR(s, start, length)

从字符串 s 的 start 位置截取长度为 length 的子字符串,下标从1开始

MID(s,n,len)

从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len),下标从1开始。substr大多数数据库都支持mid主要在MySQL中使用

ASCII(s)

返回字符串 s 的第一个字符的 ASCII 码。

ORD(str)

如果字符串 str 的最左侧字符是多字节字符,则返回该字符的代码;

单字节字符:ASCII字符集中的字符,每个字符占用1个字节(8位)

多字节字符:需要2个或更多字节表示的字符,如中文、日文、韩文等

如果最左边的字符不是多字节字符,则 ORD() 返回与 ASCII() 函数相同的值

Sleep(duration)

休眠 (暂停) duration 参数给定的秒数(单位是秒,不是毫秒),然后返回 0。 持续时间可能具有小数部分。如果参数为 NULL 或负数,则 SLEEP() 在严格 SQL 模式下生成警告或错误。

BENCHMARK(count,expr)

BENCHMARK() 函数执行表达式 expr 重复计数count次的时间。它可用于对 MySQL 处理表达式的速度进行计时。结果值为 0,对于不适当的参数(如 NULL 或负重复计数),结果值为 NULL。预期用途是在 mysql 客户端中,该客户端报告查询执行时间

Union

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。它可以从多个表中选择数据,并将结果集组合成一个结果集。使用 UNION 时,每个 SELECT 语句必须具有相同数量的列,且对应列的数据类型必须相似

UNION 操作符默认会去除重复的记录,如果需要保留所有重复记录,可以使用 UNION ALL 操作符

当前一个select查询结果为空时,后面的select不会要求具有相同数量的列

判断数据库类型

Mysql5.0以上有information_schema

Access的msysobjects

Oracle的dual

注释

作用:

通过注释符屏蔽原始sql代码,确保注入的代码可以执行

规避对敏感关键字(union、select)的过滤

使注入sql语句符合数据库的语法要求,避免语法错误

Mysql注释符

寻找注入点

\

‘)

“)

And 1=1

And 1=2

注入点类型

字符型

Sql查询中的参数被当做字符串处理,通常参数被单引号或双引号包裹,注入时需要闭合引号

数字型

Sql查询中的参数被当做数字处理,参数不被单引号或双引号包裹

Tips:在 URL 中,+ 有时会被解释为 空格(尤其是在 application/x-www-form-urlencoded 格式的表单数据中)。https://example.com/search?q=1+2=3  # 服务器可能解析为 "1 2=3"

注入思路

1.寻找注入点

2.确定注入类型

3.猜当前页面查询的字段总数

order by n     逐渐加大n,直到报错

4.查询页面显示了哪几个字段

url后加 and 1=2 union select 1,2,3,4,5...n

页面中会显示相应字段出现的位置

5.查询当前数据库名称

url后加 and 1=2 union select 1,2,database(),4,5...n

3号位置显示数据库名称

6.查询数据库中所有表名(mysql)

url后加 and 1=2 union select 1,2,group_concat(table_name),4,5...n from information_schema.tables where table_schema = database()

7. 查询指定表中所有字段名称

   url后加and 1=2 union select 1,2,group_concat(column_name),4,5...n from information_schema.columns where table_name = '查询的表名'

8. 查询指定字段的值

   url后加 and 1=2 union select 1,2,字段名,字段名,4,5...n from '表名' limit 1,1

   limit N,M : 从第 N (从0开始)条记录开始, 返回 M 条记录。

注释符举例

Mysql报错内容是在两个单引号中间,以下图为例:

说明查询语句是用双引号闭合,且有括号,需要将括号闭合,再用--+注释掉后面。但是此处不能使用#注释,原因是在url中#有特殊含义,表示片段标识符,会用来页面锚点定位,浏览器不会将#及其后面的内容发送到服务器。

举例:

获取所有库名

获取指定库的所有表名

获取指定表的所有列名

获取指定表的指定列的值

普通注入

后台能提供有价值的错误信息,显示在页面

XPath报错注入

暴露了库名

主要利用了数据库处理XML数据时的XPath函数,如(extractValue()和updateXML())产生的错误信息来泄露敏感数据

XPath报错基本原理

ExtractValue(xml_fragment, xpath_expression):从xml片段中提取符合XPath表达式的值

updateXML(xml_target, xpath_expression, new_value):根据XPath表达式更新XML文档中的某个节点

当XPath表达式语法不正确时,mysql会抛出错误,并将部分错误信息返回给用户。可以利用这一点,在XPath表达式中嵌入查询语句,通过错误信息获取数据库信息。一次性最多输出32位报错信息,所以可以用substr按段输出信息。

~即0x7e会因此XPath报错

ExtractValue(1,XPath)

updateXML(1,XPath,1)

举例:

extractvalue(1,concat(0x7e,(select @@version),0x7e)) //mysql 对 xml数据进行查询和修改的 xpath 函数,xpath 语法错误

updatexml(1,concat(0x7e,(select @@version),0x7e),1)//mysql 对 xml 数据进行查询和修改的 xpath 函数,xpath 语法错误

获取当前数据库名

输出所有库名的60-90位

输出users表中的列名

输出列的值

floor报错注入

Floor报错基本原理

Group by在向临时表插入数据时,由于rand()多次计算导致插入临时表时主建重复,从而报错。又因为报错前concat()中利用group by 和 floor() 函数引发分组冲突,导致数据库抛出错误。

报错需要满足的条件

Floor()报错注入在mysql 8.0已失效,7.3.4nts也失效。

注入语句中,查询用到的表内数据必须>=2条

需要用到count(*),floor()或者ceil(),rand(),group by

堆叠注入

允许攻击者通过在单个查询中执行多条sql语句来实现更复杂的攻击。堆叠注入利用了某些数据库和编程语言支持的多语句执行功能,从而可以在一个请求中执行多个sql操作。

Select * from users where id=1; drop table users;

Select和drop是两条独立的sql语句,他们会依次执行。如果应用程序未对用户的输入进行严格的过滤或转义,并且底层数据库支持多语句执行,就可以注入额外的语句进行操作

核心:

多语句执行:通过分号分隔,执行多条sql语句

权限提升:可以执行任意sql操作(创建、删除、修改数据)

盲注

通过仅有的判断信息对表中字段进行探测

布尔型盲注

构造一个条件语句,使得数据库根据条件的真假返回不同的结果。通过观察应用程序的行为变化(如页面是否正常加载、某些内容是否显示等),推断条件是否成立,从而逐步提取目标数据。

注入流程
  1. 确定注入点

测试是否存在布尔型盲注漏洞,例如:

?id=1 and 1=1

?id=1 and 1=2

如果1=1页面正常,但1=2页面异常,则可能存在布尔型盲注漏洞。

  1. 推到目标数据

使用逐位比较的方法,结合substr()和ascii()函数,推导出目标数据的每一位。

?id=1 and ascii(substr(database(),1,1))=115

如果页面正常,说明数据库名的第一位是s

注意:

  1. 页面行为的稳定性

布尔型盲注依赖页面行为的变化,因此需要确保页面在不同条件下有明显差异。

如果页面行为不稳定(如缓存、随机内容等),可能导致误判。

  1. 数据长度限制

在推导数据时,需要事先知道目标数据的长度,或者通过二分法逐步试探

  1. 效率问题

布尔型盲注逐位推导效率低,尤其是在目标数据较长时,建议结合自动化工具

  1. 权限限制

布尔型盲注需要数据库用户具有执行相关函数的权限,如substr(),ascii()等

延时盲注

构造包含条件判断的sql语句,若条件成立则触发延迟函数(如sleep()),否则立即返回。

注入流程
  1. 确认注入点存在延时盲注:试探性playload(如’ and sleep(5)--),若页面响应延时5s,则存在盲注漏洞。
  2. 构造条件判断逻辑:通过if(),case when 等条件语句将数据提取与延时绑定。

If(ascii(substr((select database()),1,1))>100,sleep(5),0)

若当前数据库名的第一个字符ascii值大于100,则触发5s延时。

  1. 逐字符提取数据

Length(database() )=n确定数据库名长度

与其他盲注技术的对比:

布尔盲注:通过页面内容变化(如“存在/不存在”)判断条件真假,无需延时但依赖可见状态差异。

报错盲注:结合报错注入与条件判断,通过是否触发错误间接推断数据,需要目标返回错误详情。

页面始终显示you are in...... ,此时用尝试用延时注入,页面会延时加载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值