Bu1'Blog

如果能控制粗鄙的狂喜,就不会有深入骨髓的悲伤。

0%

第四周:数据库系统功能相关学习

任务标题: 数据库基础之数据库系统功能相关学习

1、学习数据库自带函数的功能与用法(思考在什么情况下可以执行命令)

2、将所有涉及的函数进行测试并举例说明其用法并形成报告

扩展学习:针对自己所选数据库,尝试执行系统命令,自己构造所需环境

具体解释

在 sql 注入时为了应对各种限制措施,利用数据库自带的一些系统函数经过各种变换之后可以绕过一些安全设备或者一些基础防御的措施,比如一些字符串转换的函数、截取字符串长度的函数等,参考学习:

> https://www.runoob.com/mysql/mysql-functions.html

应用的场景包括:通过注入获取数据、变换字符串绕过 WAF、盲注猜解字符数据等

我们经常在注入时候想要利用数据库来执行系统命令,不同的数据库可能使用不不同的方式,比如 Mysql 的 udf、Mssql 的 xp_cmdshell 等,这个在利用注入提权的时候非常有帮助,通过数据库执行系统命令所拥有的权限跟数据库的安装过程是有关系的,所以搞清楚这个关系也很重要,这样我们在安装配置数据库的时候可以尽量避免权限过高,造成安全隐患。

除了学习这些基础基础知识外,自己可以动手构造一些可以利用数据库执行命令的场景然后进行测试,完全理解这个提权的过程。

学习报告

MySQL常用内置函数

  • 数学函数

    abs(X)返回X的绝对值

img

​ mod(N,M)或%返回 N 被 M 除的余数

img

​ floor(X)返回不大于X的最大整数值。

img

​ ceiling(X)返回不小于X的最小整数值。

img

​ round(X)返回参数X的四舍五入的一个整数。

img

  • 字符串函数

    ascii(str)返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。

img

​ concat(str1,str2,…)返回来自于参数连结的字符串。如果任何参数是NULL,返回NULL。可以有超过2个 的参数。一个数字参数被变换为等价的字符串形式。

img

​ length(str)返回字符串str的长度。

img

​ locate(substr,str)返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0.

img

​ instr(str,substr)返回子串substr在字符串str中的第一个出现的位置。

img

​ left(str,len)返回字符串str的最左面len个字符。

img

​ right(str,len)返回字符串str的最右面len个字符。

img

​ substr(str,pos)从字符串str的起始位置pos返回一个子串,和substr()一样

img

​ trim(str)返回字符串str,所有前缀或后缀被删除了

img

​ ltrim(str)返回删除了其前置空格字符的字符串str

​ rtrim(str)返回删除了其拖后空格字符的字符串str。

img

​ replace(str,from_str,to_str)返回字符串str,其字符串from_str的所有出现由字符串to_str代替。

img

​ repeat(str,count)返回由重复count次的字符串str组成的一个字符串。如果count <= 0,返回一个空字符 串。如果str或count是NULL,返回NULL。

img

​ reverse(str)返回颠倒字符顺序的字符串str

img

​ insert(str,pos,len,newstr)返回字符串str,在位置pos起始的子串且len个字符长的子串由字符串newstr 代替。

img

​ substring_index(str,delim,count)从str中找到delim字符串按下标获取字符串

img

  • 日期和时间函数

​ WEEKDAY(date):返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。

img

​ DAYOFMONTH(date):返回date的月份中的日期,在1到31范围内.

img

​ DAYOFYEAR(date):返回date在一年中的日数, 在1到366范围内。

img

​ MONTH(date):返回date的月份,范围1到12.

img

​ DAYNAME(date):返回date的星期名字

img

​ MONTHNAME(date) :返回date的月份名字。

img

​ QUARTER(date):返回date一年中的季度,范围1到4。

img

​ WEEK(date,first):对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,范围在0到 52,2个参数形式WEEK()允许你指定星期是否开始于星期天或星期一。如果第二个参数是0,星期从星 期天开始,如果第二个参数是1,从星期一开始。

img

​ YEAR(date):返回date的年份,范围在1000到9999。

img

​ HOUR(time):返回time的小时,范围是0到23。

img

​ MINUTE(time):返回time的分钟,范围是0到59。

img

​ SECOND(time):回来time的秒数,范围是0到59。

img

​ DATE_ADD(date,INTERVAL expr type) ,进行日期增加的操作,可以精确到秒

img

​ DATE_SUB(date,INTERVAL expr type) ,进行日期减少的操作,可以精确到秒, 和上面相加用法一样

img

​ 时间格式化date_format()

img

  • 条件判断函数

    IF(expr1,expr2,expr3)如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2。否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

img

​ ifnull(expr1, expr2), 如果expr1为null, 则返回expr2

img

​ Strcmp(str1,str2):如果str1>str2返回1,str1=str2返回0,str1<str2返回-1)

img

  • 系统信息函数

    version()函数返回数据库的版本号

img

​ connection_id() 函数返回服务器的连接数,也就是到现在为止MySQL服务的连接次数

img

​ database()和schema() 返回当前数据库名

img

​ 获取用户名的函数(select user(), system_user(), session_user(), current_user();)

img

​ CHARSET(str)函数返回字符串str的字符集,一般情况这个字符集就是系统的默认字符集;

​ COLLATION(str)函数返回字符串str的字符排列方式。

img

​ LAST_INSERT_ID()函数返回最后生成的AUTO_INCREMENT值

img

  • 加密函数

    加密函数 md5(str)

img

​ 加密函数 encode(str,pswd_str)

img

​ 解密函数 decode(crypt_str,pswd_str)

img

  • 格式化函数

​ FORMAT(x,n)函数可以将数字x进行格式化,将x保留到小数点后n位。这个过程需要进行四舍五入。

img

数据库提权方式

  • Udf提权

    Udf全称为user defined function即‘用户自定义函数’。是通过添加新函数,对MYSQL的功能进行扩充,性质就象使用本地MYSQL函数如abs()或concat()。udf在mysql5.1以后的版本中,存在于‘mysql/lib/plugin’目录下,文件后缀为‘.dll’,常用c语言编写。

    一般步骤:

    a) 将udf文件放到指定位置(Mysql>5.1放在Mysql根目录的lib\plugin文件夹下)

    b) 从udf文件中引入自定义函数(user defined function)

    c) 执行自定义函数

  • xp_cmdshell提权

    xp_cmdshell是SQL server扩展功能,它可以将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出。

    a) 开启xp_cmdshell

img

​ b) 提权,添加管理账号

img

参考链接

https://blog.csdn.net/qq_34845394/article/details/90077070

https://blog.csdn.net/hellokandy/article/details/82964077

https://www.cnblogs.com/litlife/p/9030673.html

https://blog.csdn.net/qq_36119192/article/details/93213487

https://www.freebuf.com/articles/web/55577.html