由于之前的博客应付差事,在此做出深刻检讨并进行一些函数说明上的补充(重新做人就在今天-.-)
首先这里先普及三个基本的函数
version() 返回当前数据库的版本
database() 返回当前连接的数据库名
user() 返回当前连接的用户(是当前的用户不是当前的数据表)
@@datadir 读取数据库路径
@@basedir MYSQL获取安装路径
然后下面说一些数据库中的表
在这之前先说一下 information_schema 这是系统数据库,记录了当前数据库所有的库,表,用户,权限等信息
schemata 表:记录了数据库所有的库名,编码路径等;
tables表:记录了所有的表名,和表的基本信息等;
columns表:记录的所有的字段名(列名),和列的基本信息等;
接下来再讲三个函数:
concat(str1,str2,...) 连接两个或多个数组
例如:concat('Hop','scot','ch') 将会返回Hopscotch
注:若 concat() 中有一个参数为null,则结果会返回null
concat_ws(str1,str2,str3,...) 在我的理解来看是上面 concat() 函数的升级版,它的作用是用str1将str2和str3等数组连接起来
例如:concat(‘_’,'Hop','scot','ch') 将会返回Hop_scot_ch
注:若 concat_ws() 中分隔符为null,则结果会返回null。并且函数会忽略任何分隔符后的null值
例如 concat_ws(null,'Hop','scot','ch') 将会返回null
concat_ws('_','Hop','scot',null,'ch') 将会返回Hop_scot_ch
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
默认用逗号分隔,这里不给出例子了
若需详细了解请看:https://www.cnblogs.com/yingmo/p/6148360.html
下面简单说两个个查询语句:
order by 本人的理解就是按字段进行排序,后面用于指定排序的依据可以是字段名也可以是字段别名
group by 按一定的依据进行分组,一般与上面的聚合函数一起使用
接着说一下floor报错注入
在此之前还要普及几个函数
rand() 随机数函数,返回一个0~1之间的随机值
rand(x): 每个x对应一个固定的值,但是如果连续执行多次值会变化,不过也是可预测的
floor(x) 取整函数,返回不大于x的整数
接着给一个payload进行理解
这里出现了 floor(rand(0)*2) ,结合上面对这些函数的介绍,这个整体随机返回0或1,并且有规律可循(011011...)
数据库会先建立一张虚表,floor(rand(0)*2)第一次计算,返回0,在虚表中未找到等于0的数据,插入,插入过程中进行第二次计算,返回1,将数据1插入虚表,然后floor(rand(0)*2)进行第三次计算,结果为1,由于表中已有等于1的数据,所以只对数据个数加1,接着进行第四次floor(rand(0)*2)的计算,返回0,表中没有为0的数据,进行插入,插入过程中会进行第五次floor(rand(0)*2)的运算,返回1,将1插入数据表--------这时就出现问题了,之前已经插入了值为1的数据,这里又插入了一次,就会出现主键沉余的错误,这便是floor报错注入的原理了
接着继续介绍函数:
length(str) 返回str的长度;
例如 length(Hopscotch) 返回9
substr(str,num1,num2) 从num1位置开始截取str,截取num2个字符;
例如substr(++Hopscotch,3,9) 返回Hopscotch
mid(str,num1,num2)与substr(str,num1,num2)用法一样;
ascii(str) 返回第一个字符的ascii值;
例如:ascii('Hopscotch') 返回72
ord(str)与ascii(str)用法相同;
然后介绍一个语句
if(a,b,c) 当a为真时,返回b,当a为假时,返回c;
例如:if(1>2,'ture','flase') 返回flase
sleep(x) 将进程挂起x秒时间,也就是x秒之后再运行;
下面说一下updatexml报错注入原理
先来了解一下 updatexml() 函数的作用
updatexml(XML_document, XPath_string, new_value)
第一个参数 XML_document:string格式,为XML文档对象的名称;
第二个参数 XPath_string:Xpath格式的字符串,为XML文档对象的路径;
第三个参数 new_value:string格式,为更新的语句;
这里给出一个payload:select username from security.user where id=1 and (updatexml(‘anything’,’/xx/xx’,’anything’))
通过分析,这里面updatexml函数第二个参数的格式为一个普通的string格式,不满足要求,必然报错;
extractvalue报错注入也是相同的原理,这里就不多做说明了;