报错注入小结

报错注入

COUNT() 函数返回匹配指定条件的行数。
COUNT(*) 函数返回表中的记录数:
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:

一个报错语句;

select count(*),(concat(floor(rand()2),(select version())))x from users group by x
count():是一个计数的函数,count(
)表示所有表记录数量
1.floor()函数是用来向下取整呢个的,相当于去掉小数部分
2.rand()是随机取(0,1)中的一个数,但是给它一个参数后0,即rand(0),
2.
3.并且传如floor()后,即:floor(rand(0)*2)它就不再是随机了,序列0110110
floor rand group by 缺一不可
报错原理 floor(rand(0)*2)x 中floor负责把生成的随机数的小数去掉
但是(0)*2严格来说不算随机数 他的生成形式基本为011
所以能肯定导致报错 如果是rand()*2就会不可控
我是这么理解的:它一共有五次操作 如下:
由011011的这种形式 第一个生成的数字是0 他会检查有没有为0的键名(key) 结果当然是没有(第一次操作) 所以会插入一个虚拟表
但是在插入过程中要再取一次group by 后面的值 即再进行一次运算(第二个生成的数字是1) 所以输入的数据 key=1 value=1(第二次运算)
第三个生成的数字是1(第三次运算) 但是检查处key=1已经有了怎么办? 那就用count的方法把value+1=2 即key=1 value=2(第四次运算)

不要被上面搞晕了 一次语句执行相当于两次运算 第一次结果 1,1 第二次结果1,2
最后是第五步运算了 也就是关键所在 这时相当于一个循环了 又从头开始执行 但是结果也是1,1 已经有了重复了怎么办?所以就出错了

此时就会抛出主键冗余的异常,也就是所谓的floor报错
就是说group by是建立一个虚拟表单插入数据,插入数据在两个方向,一个key,一个value,分别从key开始输入数据,因为输入数据在第三次的时候开始重复,所以count开始加value,但到了第五次运算没有什么办法,就会产生报错了,这时候
由于updatexml的第二个参数需要Xpath格式的字符串,以~开头的内容不是xml格式的语法,concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了。
concat(字符串1,字符串2):把字符串连接起来
concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了。

报错的时候会把数据库名给爆出来。
x就是相当于 as x,设一个别名
原理:group by 查询时,先建立一个空表,用来临时存储数据,
开始查询,group by x,序列一开始为0,临时空表里不存在就填入,之后 select 中也有rand(),值为1,插入1;
查询第二条,值为1,原有值加1
查第三条,值为0,则插入select的值,为1,与原有值冲突报错。
以上原理讲得不是很透彻,直接看题目
还是根据mysql自带的数据库information_schema: 得数据库名,再得表名,列名,最后查flag

UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
示例语句;
and updataxml(1,concat(0x7e,select(user ()),0x7e),1)1
选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符 描述

  • 匹配任何元素节点。
    @* 匹配任何属性节点。
    node() 匹配任何类型的节点。
    实例
    在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
    路径表达式 结果
    /bookstore/* 选取 bookstore 元素的所有子元素。
    //* 选取文档中的所有元素。
    //title[@*] 选取所有带有属性的 title 元素。

第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
1
1 Union select count(*),concat(database(),0x26,floor(rand(0)*2))x from information_schema.columns group by x;

那么concat(user(),database(),floor(rand(0)*2))的意思就是把登录用户和数据库名以及一个不随机的随机数连起来。

第一个语句通过union注入子句和count(*)来爆出数据,下面的concat(x,x,x)和group通过临时数据表的建立重复出错来使语句报错,而concat错误的连接语句就会让错误信息error出来,我们就能知道库名了,这里我们报错的是database()的信息,下面修改database()位置的语句就能查询到该查询到库下面的表名,在进一步查询到列名,最后直接查询列知道列所关联的要查询的数据。

上方第一个语句直接报错出来数据库的名称,第二个直接通过改变语句来查找到数据库下的表的名称,这个地方的数据应该是可以替换的通过group_concat(schema_name)from information_schema.schema来查询数据库的名称,下面的也一样,我们要查询数据库下面表的名称就查table_name,在table里面。具体要看哪个数据的信息表的schema里面看(table)用where,其实除了用上面说的标错方法来说,具体思路都是一样的,注意要查询具体数据的时候,我们要查的都是在column里面
;;;;;;;全部数据库》》下属数据库中表》》下属表字段》》指定字段信息

**

常用报错注入函数

**

1.extractvalue()
应该就是由,分割当成from
extractvalue(xml_frag,xpath_expr)函数接受两个参数,第一个为XML标记内容,也就是查询的内容,第二个为XPATH路径,也就是查询的路径。如果没有匹配内容,不管出于何种原因,只要 xpath_expr有效,并且 xml_frag由正确嵌套和关闭的元素组成 - 返回空字符串。不区分空元素的匹配和无匹配。但是如果XPATH写入错误格式,就会报错,并且返回我们写入的非法内容

2.updatexml()
and updatexml(1,concat(0x7e,(select user()),0x7e),1)–+
这个的注入点就是concat所在的第二个函数了
0x7e就是ASCLL编码的~~~,
最常用的函数,而且比较好记,updatexml(xml_target,xpath_expr,new_xml)接受三个参数,此函数将XML标记的给定片段的单个部分替换为xml_target新的XML片段new_xml,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。如果未xpath_expr找到表达式匹配 ,或者找到多个匹配项,则该函数返回原始 xml_targetXML片段。所有三个参数都应该是字符串。与extractvalue()类似,如果XPATH写入错误格式,就会报错,并且返回我们写入的非法内容。所以这里就是注入点

以最常用的updatexml()函数来举例
公式?id=1 and updatexml(1,concat(0x7e,(查询的内容),0x7e),1)
提交内容?id=1’ and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+

简要说明这条公式的含义
?id=1 是可能存在URL的参数
and 是拼接符
updataxml()是函数
括号里面的concat是用于连接两个或多个数组,将其以拼接的方式输出到前端页面
0x7e是一个特殊符号 ~ 这是为了区分报错注入后的有用信息,因为页面报错包含太多没用信息
————————————————
以上函数对mysql版本有要求,Mysql版本要大于5.0 以上才能使用

3.floor

floor(x),返回小于或等于x的最大整数

select count(*),(concat(floor(rand()*2),(select version())))x from users group by x

1 Union select count(*),concat(database(),0x26,floor(rand(0)*2))x from information_schema.columns group by x;

这个就应该是floor的一个应用模式。

在对waf进行绕过时,我们首先需要知道waf到底过滤了什么,只有摸清楚WAF是如何工作的,才能更好的进行绕过,比如是白名单和黑名单,还是只拦截关键字,或是直接进行过滤去除,我们要根据页面或者URL栏给出的反馈信息,在脑海中构建好攻击绕过思路,唯有如此,我们才能更有效率的进行渗透测试
以sqli-labs靶场为例,我们可以先用常用的sql注入语句,比如:http://127.0.0.1/sqli-labs/Less-25a/?id=1’ and 1=updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) --+ ,通过页面的回显,我们可以的知后台过滤了and关键字,既然我们知道它过滤了什么,那么我们就可以针对过滤的内容去构建合适的sql语句去绕过了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值