CTF常用sql注入(二)报错注入(普通以及双查询)

CTF常用sql注入(二)报错注入(普通以及双查询)0x05 报错注入
适用于页面无正常回显,但是有报错,那么就可以使用报错注入
基础函数
floor()
向下取整函数
返回小于或等于传入参数的最大整数。换

0x05 报错注入

它适用于无法正确显示但有错误的页面,并允许您使用错误注入。

基础函数

地面()

截断函数

返回小于或等于传递参数的最大整数。即,将数字向下舍入到最接近的整数值。

例子:

下限(3.7) 返回3

下限(-2.5) 返回-3

圆形的()

舍入函数

将传递的数字四舍五入为最接近的整数或指定的小数位数。

例子:

Round(3.7) 返回4

Round(3.14159, 2) 返回3.14(保留2 位小数)

天花板()

向上取整函数

返回大于或等于传递参数的最小整数。与Floor() 函数不同,它将数字向上舍入为大于指定数字的最小整数。

例子:

ceil(3.2) 返回4

ceil(-1.5) 返回-1

数数()

统计mysql中的行数

中()

用于拦截返回结果的函数

Mid((查询语句),1,32)下标截取从1开始的32个字符。

更新xml()

UPDATEXML(XML_文档,XPath_字符串,新值);

第一个参数:XML_document,字符串格式,是XML文档对象的名称。

第二个参数:XPath_string(Xpath格式字符串)。

第三个参数:new_value(字符串格式)替换找到的符合条件的数据。

返回:如果xpath正确,则返回修改后的对象名,否则返回xpath错误的内容。

所以如果你想注射它,你就无法正确地把它放回去。

updatexml(任意值,(查询语句),任意值)

提取值()

EXTRACTVALUE(XML_文档,XPath_字符串);

第一个参数:XML_document,字符串格式,是XML文档对象的名称。

第二个参数:XPath_string(Xpath格式字符串)。

返回:如果xpath正确则返回目标XML查询的结果,否则返回xpath错误的内容。

以完全相同的方式

使用限制

返回多列之一

例如

limit 0,1 返回第一列

limit 3,1 返回第4 列

正确的()

right(x,y) 截取x 字符串右侧的最后y 个字符。

使用适当的函数将截取字符串的右侧部分。

左边()

left(x,y) 从x 字符串的最左边字符截取y 个字符。

普通报错注入

可以直接通过上面的函数来实现

?sort=-1 或updatexml(1,concat(从0x3d 选择schema_name,(information_schema.schemata 限制5,1)),0x3d),3)–+

请尝试类比确认。

我检查了flag部分,发现没有完成。

中间函数

?sort=-1 或updatexml(1,concat(0x3d,mid((从ctfshow.flags 中选择group_concat(flag4s)),32,32),0x3d),3)–+

使用左函数和右函数

?sort=-1 或updatexml(1,concat(0x3d,(从ctfshow.flags 中选择left (flag4s,31)),0x3d),3)–+

?sort=-1 或updatexml(1,concat(0x3d,(从ctfshow.flags 中选择右侧(flag4s,14)),0x3d),3)–+

只需更改提取值

?sort=-1 或extractvalue(1,concat(0x3d,(从ctfshow.flags 中选择右侧(flag4s,14)),0x3d))–+

?sort=-1 或extractvalue(1,concat(0x3d,(从ctfshow.flags 中选择group_concat(flag4s)),0x3d))–+

双查询报错注入

知识补充

这里我们用group-by-injection进行一个重要的解释

rand() 函数

生成0 到1 之间的随机数

为每个用户名从用户组中选择count(*)、用户名。

选择用户名,每个用户名从用户组中计数(*)。

在这种情况下,group by 创建一个虚拟表,它是键的键值对。

大概就是这样

keycount(*)admin1admin21admin31flag1 之前的名称必须是在用户名列中找到的确切值。

在“用户名”中选择用户名和用户组的数量(*)。

您觉得这款手表怎么样?

键数(*) 用户名4

他直接输入用户名,而不是打开列并查找值。

由于版本问题,这里已经无法再隐藏了。

那么让我们回到主题

要实现双查询错误注入,必须使用联合注入(报错采用group by报错原则)。

现在,如果你看上面的句子,你已经可以看到我们写句子的方式大致遵循这个结构。

?id=select count(*),concat(0x3d,mid((select group_concat(table_name) from information_schema.schemata)1,32),0x3d,round(rand()*2))a from information_schema.schemata 按组–+

聚合函数可以组合注入语句来替换后面的内容(子查询中查询到的所有内容)。 A。

查询语句生成如下语句:

keycount(*)=erformance_schema,ctfshow_web=01=erformance_schema,ctfshow_web=11=erformance_schema,ctfshow_web=21

然后,生成这样的虚拟表,

引用我师父的话:

最终的错误报告是最重要的部分。重复的键值。

那么为什么键值会重复呢? concat 函数运行了两次,因此第二次运行时可能会出现与第一次重复的键值。这种情况下会报错。

那是:

聚合函数、使用group by 子句以及利用随机函数会在运行时导致错误,因为它们涉及随机函数和聚合函数的计算。

如果在聚合函数(例如count)后使用分组语句,则部分查询将以错误格式显示。这是因为concat 函数执行了两次(例如select database())。与后续的随机函数不同,它们链接在一起并随机重复,这可能会导致错误。

使用底层错误报告方法的数据部署的本质是每个语句的组错误报告。 group by语句报错的原因是floor(random(0)*2)可以为0或1(group by key背后的原理是循环遍历每一行数据并保存结果)。临时表当读取每一行的键时,如果临时表中存在该键,或者临时表中不存在该键,则更新临时表中的数据。 group by Floor(random(0)*2) 出现错误是因为在检查临时表中是否存在key 时,key 是一个随机数。对于表,floor(random(0)*2) 可以为0。如果临时表只有键为1的行而没有键为0的行,则数据库必须向临时表中插入一条记录。在这种情况下,floor(random(0)* 2)可能会导致1,从而导致插入上的冲突和错误。随机数计算两次:检测时和插入时。

结论是如果和临时表中的值不一样就会插入,但是插入的时候会重新计算,所以如果插入时计算的值和直接比较的值不一样,这将是一个错误。报告!

#CTF中常用的SQL注入(二) 以上关于错误注入(正则查询和双重查询)的相关内容仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92978.html

(0)
CSDN's avatarCSDN
上一篇 2024年7月4日 下午7:05
下一篇 2024年7月4日 下午7:23

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注