SQL Injection Functions
2024-04-21 01:07:23

version():mysql版本
user():用户名
database():数据库名
@@datadir:读取数据库路径
@@version_compile_os:操作系统版本
concat(str1,str2,…):没有分割符地连接字符串,显示数据(数据合并)
group_concat(str1,str2,…):连接一个组的所有字符串,并以逗号分割每一条数据,显示数据
into outfile:写文件{select ‘需要写的文件’ into outfile ‘目录下’}
select ‘123123’ into outfile ‘d://study/1.txt’;(将123123添加至d盘study中新建1.txt文件中)
group_concat(列名):会把这一列中所有的内容在一行中以,隔开输出
select load_file(读文件路径);
length() =>计算字符串长度
hex() =>字符转换为16进制
@@basedir MYSQL获取安装路径

概览

group_concat(str1,str2,…):连接一个组的所有字符串,并以逗号分割每一条数据,显示数据
mid()函数:从一个字符串中截取出指定数量的字符
mid(string,start,length)
string(必需)规定要返回其中一部分的字符串。
start(必需)规定开始位置(起始值是 1)。
length(可选)要返回的字符数。如果省略,则 mid() 函数返回剩余文本。
substr()函数:函数返回字符串的一部分。
substr(string,start,length)
string(必需)规定要返回其中一部分的字符串。
start(必需)规定在字符串的何处开始。
length(可选)规定被返回字符串的长度。
left()函数:取字符的多少位字符
left(string,length)
string(必需)规定要返回其中一部分的字符串
length(可选)规定被返回字符串的前length长度的字符
load_file()函数:导出文件
Load_file(file_name):读取文件并返回该文件的内容作为一个字符串。
substr(str, pos, len):将str从pos位置开始截取len长度的字符进行返回。*注意:这里的pos位置 是从1开始的,不是数组的0开始
ascii(str):返回字符串str的最左面字符的ASCII代码值。
ord(str):同上,返回ascii码
if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0
concat:用于将两个字符串连接起来,形成一个单一的字符串。返回结果为连接参数产生的字符串。

详解

UPDATEXML

UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,了解Xpath语法
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
改变XML_document中符合XPATH_string的值
而我们的注入语句为:
updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出
ERROR 1105 (HY000): XPATH syntax error: ‘:root@localhost’

extractvalue()

extractvalue():从目标XML中返回包含所查询值的字符串
extractvalue (XML_document, XPath_string)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串)
payloaod:
  and extractvalue(null,concat(0x7e,(select @@datadir),0x7e));
extractvalue注入的原理:依旧如同updatexml一样,extract的第二个参数要求是xpath格式字符串,而我们输入的并不是。所以报错。

ASCII(s)

ASCII(s)
返回字符串 s 的第一个字符的 ASCII 码。
返回 CustomerName 字段第一个字母的 ASCII 码:
SELECT ASCII(CustomerName) AS NumCodeOfFirstChar FROM Customers;

CHAR_LENGTH(s)

CHAR_LENGTH(s)
返回字符串 s 的字符数
返回字符串 RUNOOB 的字符数
SELECT CHAR_LENGTH(“RUNOOB”) AS LengthOfString;

CHARACTER_LENGTH(s)

CHARACTER_LENGTH(s)
返回字符串 s 的字符数
返回字符串 RUNOOB 的字符数
SELECT CHARACTER_LENGTH(“RUNOOB”) AS LengthOfString;

CONCAT(s1,s2…sn)

CONCAT(s1,s2…sn)
字符串 s1,s2 等多个字符串合并为一个字符串
合并多个字符串
SELECT CONCAT(“SQL “, “Runoob “, “Gooogle “, “Facebook”) AS ConcatenatedString;

CONCAT_WS(x, s1,s2…sn)

CONCAT_WS(x, s1,s2…sn)
同 CONCAT(s1,s2,…) 函数,但是每个字符串直接要加上 x,x 可以是分隔符
合并多个字符串,并添加分隔符:
SELECT CONCAT_WS(“-“, “SQL”, “Tutorial”, “is”, “fun!”)AS ConcatenatedString;

FIELD(s,s1,s2…)

FIELD(s,s1,s2…)
返回第一个字符串 s 在字符串列表(s1,s2…)中的位置
返回字符串 c 在列表值中的位置:
SELECT FIELD(“c”, “a”, “b”, “c”, “d”, “e”);

FIND_IN_SET(s1,s2)

FIND_IN_SET(s1,s2)
返回在字符串s2中与s1匹配的字符串的位置
返回字符串 c 在指定字符串中的位置:
SELECT FIND_IN_SET(“c”, “a,b,c,d,e”);

FORMAT(x,n)

FORMAT(x,n)
函数可以将数字 x 进行格式化 “#,###.##”, 将 x 保留到小数点后 n 位,最后一位四舍五入。
格式化数字 “#,###.##” 形式:
SELECT FORMAT(250500.5634, 2); – 输出 250,500.56

INSERT(s1,x,len,s2)

INSERT(s1,x,len,s2)
字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串
从字符串第一个位置开始的 6 个字符替换为 baiduu:
SELECT INSERT(“google.com”, 1, 6, “baidu”); – 输出:baiduu.com

LOCATE(s1,s)

LOCATE(s1,s)
从字符串 s 中获取 s1 的开始位置
获取 b 在字符串 abc 中的位置:
SELECT LOCATE(‘st’,’myteststring’); – 5

LEFT(s,n)

LEFT(s,n) 返回字符串 s 的前 n 个字符
返回字符串hello 中的前两个字符
SELECT LEFT(‘hello’,2) – he

LEFT(s,n)

LEFT(s,n)
返回字符串 s 的前 n 个字符
返回字符串 abcde 的前两个字符:
SELECT LEFT(‘abcde’,2) – ab

LOCATE(s1,s)

LOCATE(s1,s)
从字符串 s 中获取 s1 的开始位置
返回字符串 abc 中 b 的位置:
SELECT LOCATE(‘b’, ‘abc’) – 2

LPAD(s1,len,s2)

LPAD(s1,len,s2)
在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len
将字符串 xx 填充到 abc 字符串的开始处:
SELECT LPAD(‘abc’,5,’xx’) – xxabc

MID(s,n,len)

MID(s,n,len)
从字符串 s 的 start 位置截取长度为 length 的子字符串,同 SUBSTRING(s,n,len)
从字符串 HELLO 中的第 2 个位置截取 3个 字符:
SELECT MID(“HELLO”, 2, 3) AS ExtractString; –ELL

POSITION(s1 IN s)

POSITION(s1 IN s)
从字符串 s 中获取 s1 的开始位置
返回字符串 abc 中 b 的位置:
SELECT POSITION(‘b’ in ‘abc’) – 2

REPEAT(s,n)

REPEAT(s,n) 将字符串 s 重复 n 次
将字符串HELLO重复三次:
SELECT REPEAT(‘HELLO’,3)

REPLACE(s,s1,s2)

REPLACE(s,s1,s2)
将字符串 s2 替代字符串 s 中的字符串 s1
将字符串 abc 中的字符 a 替换为字符 x:
SELECT REPLACE(‘abc’,’a’,’x’) –xbc

REVERSE(s)

REVERSE(s)
将字符串s的顺序反过来
将字符串 abc 的顺序反过来
SELECT REVERSE(‘abc’) – cba

RIGHT(s,n)

RIGHT(s,n)
返回字符串 s 的后 n 个字符
返回字符串 HELLO 的后两个字符:
SELECT RIGHT(‘HELLO’,2)

RPAD(s1,len,s2)

RPAD(s1,len,s2)
在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len
将字符串 xx 填充到 abc 字符串的结尾处:
SELECT RPAD(‘abc’,5,’xx’) – abcxx

STRCMP(s1,s2)

STRCMP(s1,s2)
比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1
比较字符串:
SELECT STRCMP(“A”, “A”); – 0

SUBSTR(s, start, length)

SUBSTR(s, start, length)
从字符串 s 的 start 位置截取长度为 length 的子字符串
从字符串 ASDF 中的第 2 个位置截取 3个 字符:
SELECT SUBSTR(“ASDF”, 2, 3) AS ExtractString; – SDF

SUBSTRING(s, start, length)

SUBSTRING(s, start, length)
从字符串 s 的 start 位置截取长度为 length 的子字符串
从字符串 ASDF 中的第 2 个位置截取 3个 字符:
SELECT SUBSTRING(“ASDF”, 2, 3) AS ExtractString; – SDF

SUBSTRING_INDEX(s, delimiter, number)

SUBSTRING_INDEX(s, delimiter, number)
返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。
如果 number 是正数,返回第 number 个字符左边的字符串。
如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。
SELECT SUBSTRING_INDEX(‘ab’,’‘,1) – a
SELECT SUBSTRING_INDEX(‘ab’,’‘,-1) – b
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(‘abcde’,’‘,3),’‘,-1) – c

AVG(expression)

AVG(expression)
返回一个表达式的平均值,expression 是一个字段
返回 Products 表中Price 字段的平均值:
SELECT AVG(Price) AS AveragePrice FROM Products;

CEIL(x)

CEIL(x) | 返回大于或等于 x 的最小整数
SELECT CEIL(1.5) – 返回2

CEILING(x)

CEILING(x) | 返回大于或等于 x 的最小整数 
SELECT CEIL(1.5) – 返回2

COUNT(expression)

COUNT(expression)
返回查询的记录总数,expression 参数是一个字段或者 * 号
返回 Products 表中 products 字段总共有多少条记录:
SELECT COUNT(ProductID) AS NumberOfProducts FROM Products;

FLOOR(x)

FLOOR(x) | 返回小于或等于 x 的最大整数
小于或等于 1.5 的整数:
SELECT FLOOR(1.5) – 返回1

几个关于floor报错原理的解释