永不落幕的數據庫注入攻防戰
本文根據DBAplus社群第98期線上分享整理而成。講師介紹
主題簡介:
1、數據庫有什麼安全問題
2、何為數據庫注入
3、數據庫注入攻擊實戰
4、為什麼會發生數據庫注入
5、數據庫注入攻擊防禦
記得以前有人說過,對於一家軟件公司來說,最重要的不是它的辦公樓,也不是它的股票,而是代碼。代碼這東西,說到底就是一堆數據。這話不假,但是不僅僅這樣,對於一家企業來說,它的用戶數據也是最重要的幾個之一。在座各位想必多為DBA或者數據分析相關崗位的同學,關於數據對企業的重要性,應該理解很深刻了。
那麼,換一個角度,如果站在用戶角度,數據對他們而言,更是要害。從以前的“豔照門”、“電信詐騙”,到現在的“50億條公民信息泄露”,數據泄漏每天都在發生著。所以,不管是誰,不管站在企業還是用戶角度,保護數據安全是重中之重。今天的主題——數據庫注入攻防,就屬於數據安全這個領域的問題。
一、數據庫能有什麼安全問題?
1、那些年泄漏的數據
說起數據庫存在的安全問題,大家必定會想到很多答案,可能因暴露外網被攻擊,可能因架構或網絡原因破壞數據一致性,可能因備份還原機製不可用丟數據。
但對於企業、用戶來說,數據泄漏卻是一個特別突出的問題。這裏貼一張圖。如圖1,過去10年,中國互聯網泄漏了10億多條用戶信息,不過跟最新泄漏的“50億條公民信息”相比,簡直小巫見大巫。現在這些數據庫在互聯網上早就傳了一遍,網上很多“社工庫”的數據,如圖2,就是從這裏來的。但還有很多是不公開的,還在地下買賣,恐怕我們現在知道的數據泄漏隻是冰山一角。
圖1
圖2
2、泄漏的數據哪來的?
那麼,這些數據是怎麼泄漏的?根據搜狐網上的一些報道,我按類型整理了大概有6種途徑,分成用戶提供和不法分子利用2個大類,占比大概如圖3所示。
圖3
(1)用戶提供
首先,用戶隨意連接免費WIFI或者掃描二維碼會被盜取個人信息;此外,手機、電腦等終端感染病毒等惡意軟件,也會造成個人信息被竊取。但這些都是因為用戶自己的主動行為引起的。
(2)不法分子利用
-
這種主要是包括黑客在內的不法分子主動獲取造成。比如:掌握了信息的公司、機構員工主動倒賣信息;
-
黑客利用網站漏洞入侵數據庫,換句話說,這就是數據庫注入引發的一個個血案;
-
用戶密碼簡單,“一套密碼走天下”,結果黑客通過“撞庫”等間接方式也獲取了用戶帳號密碼;
-
個人身份信息保管不當被利用,比如身份證複印件亂丟,輕易相信網購優惠填寫身份證、銀行卡信息,從而造成信息泄漏。
今天,我們將從原理、攻防等方麵去剖析數據庫注入。
二、何為數據庫注入
1、原理
通過把惡意 SQL命令插入到Web表單提交或輸入域名或頁麵請求的查詢字符串,從而欺騙服務器執行惡意的SQL命令,而不是按照設計者意圖去執行SQL語句。從圖4可以看到,正常用戶輸入的是自己的賬號密碼,但攻擊者不會按開發者想法來,他會用各種畸形輸入來測試。比如圖4就是傳說中的“萬能密碼”,10年前,很多網站倒在它麵前,就是因為完全信任用戶輸入。
圖4
2、有什麼危害
-
非法讀取、篡改、添加、刪除數據庫中的數據
-
盜取用戶的各類敏感信息,獲取利益
-
通過修改數據庫來修改網頁上的內容
-
私自添加或刪除賬號
-
注入木馬等等
看起來數據庫注入的危害可不止信息泄漏,破壞數據庫數據和進一步入侵也是入侵題中的應有之義。
跟其他的Web攻擊如XSS/CSRF/SSRF之類比有什麼不同?
危害最大。根據OWASP(Open Web Application Security Project)2013年安全報告,如圖5,數據庫注入是最嚴重的Web安全問題。
圖5
直接攻擊數據庫,而數據是最敏感的。容易被深度利用,造成威脅擴散。剛才上麵也提到,數據庫注入可以用來傳播木馬,甚至控製服務器,想象空間很大。
三、數據庫注入攻擊實戰
在網絡安全行業有一句話,“未知攻,焉知防”。所以我們要理解數據庫注入,想做好防禦措施,必須先看看它是怎麼攻擊數據庫的。
1、利用思路
攻擊一般可以采用手工和自動化工具兩種方式,各有千秋。
手工:
繁瑣、效率低;靈活、能夠根據站點防護措施隨時調整攻擊思路。
工具:
效率高、批量自動挖掘;但是容易被WAF(Web防火牆)識別、模式相對單一,不夠靈活。但還是事在人為,工具可以跟人一樣聰明,下麵我們就利用神器讓注入“飛起來”吧。
主要會用到下麵幾款工具。
-
Nmap:社區最著名端口掃描工具。
-
AWVS:商業級Web漏洞掃描工具,準確率和效率名列漏掃工具Top3。
-
sqlmap.py:全自動SQL注入工具,神器之“神”。
-
NoSQLMap.py:sqlmap的NoSQL版本,支持MongoDB等。
-
webshell:Web木馬,攻城掠地不可或缺。
2、滲透測試環境
要知道,在歐美,掃描別人網站可能違法,更別說入侵網站了。同理,我們的測試,也僅使用模擬環境。下麵有很多Web滲透的模擬環境,部署起來非常簡單。
https://github.com/ethicalhack3r/DVWA
https://github.com/WebGoat/WebGoat
https://github.com/Audi-1/sqli-labs
https://github.com/davevs/dvxte
https://github.com/rapid7/metasploitable3
3、全景圖
在開始測試前,先整理一遍思路。通常滲透測試會遵循:信息采集、入口發現、入口測試、獲取webshell、提權等步驟。下麵大概介紹下每個環節需要做的事情。
-
收集信息:通過端口掃描工具、搜索引擎或者目錄爆破工具收集敏感信息或者端口開放信息,以便作為測試入口。
-
注入:一般說是入口發現,我們這次是Web站點存在SQL注入,然後通過手工嚐試PoC(漏洞驗證payload)或者自動化工具測試,一旦發現SQL注入點,立馬開始遍曆數據庫,俗稱“脫庫”。但是,別忘了世紀佳緣白帽子事件,殷鑒不遠啊。
-
Getshell:基於SQL注入上傳木馬,獲取服務器控製權限。
-
提權:基於已有的普通用戶權限,利用係統內核漏洞或者應用漏洞,將自己升級到root用戶。
-
進階:思路足夠廣,要多深入就有多深入。
4、發現漏洞
nmap -p1-65535 192.168.115.131
發現開放tcp/80端口,為Web服務,手工驗證注入入口。
發現https://192.168.115.181/cat.php?id=1存在SQL注入。使用AWVS進行進一步驗證,如圖6。
圖6
5、脫庫
使用sqlmap全自動脫庫,掃出數據庫、表名、列等信息。
圖7
6、Getshell
也是使用sqlmap直接在SQL Shell裏寫文件,當然也可以切換到--os-shell獲取操作係統shell直接執行係統命令,如圖8。
圖8
這裏科普一下傳說中的“一句話木馬”、“小馬”、“大馬”。“一句話木馬”就是將接收任意字符進行執行的PHP/ASP/JSP文件,通常隻有幾行,甚至隻有一行;“小馬”就是“一句話木馬”或者功能比較簡單的Web木馬,“大馬”就是功能齊全的Web木馬,比如圖8所示,可以管理文件、數據庫、執行係統命令、端口掃描甚至端口轉發。
7、提權
從普通用戶變成root用戶。這個需要利用操作係統內核版本漏洞,所幸該內核版本(圖9)很低,真找到了內核exp(圖10),順利提權。
圖9
圖10
8、進階利用
提完權就算了?沒這麼簡單,如果處於攻擊目的,實際上可做的事情太多了。
-
內網漫遊:一般數據庫都放在內網,我們都知道企業內網很多“寶藏”,各種空口令、弱密碼、目錄遍曆,隨便掃一下就大豐收了,如圖11。
-
流量劫持:ARP攻擊、SSL流量劫持、抓包上傳甚至攻擊域控服務器等等,都深入到這程度,真沒什麼做不到的。
-
DDoS肉雞:控製被入侵機器去攻擊別人,當你發現某台服務器出向流量異常高就該擔心了,如圖12。
-
遠控:監控機器,比如鍵盤記錄、用戶命令記錄等等。
圖11
圖12
剛才完整介紹了一個自動SQL注入攻擊的過程,可能大家覺得還是不夠過癮,因為一路隻看我在使用工具,連畸形SQL語句都沒看到,所以下麵大概介紹一下針對MySQL、msSQL、Oracle等主流關係型數據庫的手工注入。
MySQL
圖13
https://192.168.115.131/cat.php?id=1'
直接在參數後麵跟上’,或者\,如果沒有合理過濾,是會報語法錯誤的,不信你看看圖13。
https://192.168.115.131/cat.php?id=1%20and%201=2%20union%20select%201,user(),3,4
然後開始試探數據庫字段數、當前用戶,如圖14。
圖14
https://192.168.115.131/cat.php?id=1 and (select * from (select(sleep(5)))lsrk)
https://192.168.115.131/cat.php?id=1%20UNION%20
SELECT%201,concat(login,%27:%27,password),3,4%20FROM%20users;’
接下來是用來測試是否存在基於時間的盲注和查詢數據庫管理員帳號密碼的,拿到root賬號後可以去網上破解。
msSQL
這個思路跟MySQL一樣,隻是需要msSQL的注釋符和MySQL有所不同,前者支持--,後者支持#,如圖15。
https://www.aquaservices.co.in/authorprofile.asp?id=13 order by 100--
Here comes the error : The order by position number 100 is out of range of the number of items
圖15
https://www.aquaservices.co.in/authorprofile.asp?id=13 and 0=1 Union All Select 1,@@version,3,4,5,6,db_name(),8--
https://www.aquaservices.co.in/authorprofile.asp?id=13;exec master.dbo.sp_password null,password,username;–
這裏還可以執行存儲過程master.dbo.sp_password直接修改數據庫賬號密碼呢。
Oracle
思路也差不多,不過語法上稍微複雜點,如果語法不太熟,有個技巧,可以用sqlmap去跑PoC,如圖16,按照提醒去構造畸形輸入。
獲取數據庫版本信息
and 1=2 union select null,null,(select banner from sys.v_$version where rownum=1) from dual
開始爆庫
and 1=2 union select null,null,(select owner from all_tables where rownum=1) from dual
and 1=2 union select null,null,(select owner from all_table where rownum=1 and owner<>'第
一個庫名') from dual
and 1=2 union select null,null,(select table_name from user_tables where rownum=1) from
Dual
圖16
MongoDB
上麵講的都是關係型數據庫,非關係型數據庫MongoDB這些是不是就安全了?不是的,如圖17,密碼還是明文保存的呢。
圖17
四、為什麼會發生數據庫注入
經過上麵數據庫注入的攻擊測試,相信大家再也不會心懷僥幸了,因為攻擊成本很低,不是嗎?那麼,總結一下我們看到的,數據庫注入發生的原因是什麼?
1、透過現象看本質
SQL注入可以分為平台層注入和代碼層注入。
前者由不安全的數據庫配置或數據庫平台的漏洞所致;
①不安全的數據庫配置;②數據庫平台存在漏洞;
後者由於開發對輸入未進行細致過濾,從而執行非法數據查詢。
①不當的類型處理;
②不合理的查詢集處理;③不當的錯誤處理;
④轉義字符處理不合適;⑤多個提交處理不當。
2、代碼
首先,“信任,過猶不及”。很多時候,我們一直強調,站在開發者角度,用戶是不可信任的,未過濾或驗證用戶輸入以及輸出數據,就是給自己挖坑。比如下麵這個:
$username = "aaa";
$pwd = "fdsafda' or '1'='1";
$sql = "SELECT * FROM table WHERE username = '{$username}' AND pwd = '{$pwd}'";
echo $sql; //輸出 SELECT * FROM table WHERE username = 'aaa' AND pwd = 'fdsafda' or '1'='1'
?>
傳說中的“萬能密碼”利用的後台代碼差不多就是這個渣樣。當然,現在幾乎不可能存在了,因為人總是會吸取教訓的,各種安全開發的理念還是逐漸深入人心了。
3、數據庫
站在運維角度,數據庫注入中的運維“三宗罪”分別是:
(1)空密碼/弱密碼。“空,那麼空”,我耳朵裏突然想起來金誌文的《空城》。
mysql> select user,host,password from mysql.user;
+------+-----------+----------+
| user | host | password |
+------+-----------+----------+
| root | localhost | |
| root | 127.0.0.1 | |
| root | ::1 | |
(2)外網開放。數據庫開放外網,還不改端口(改了也沒用,因為現在都是全端口掃描的),這不是找抽嗎?
iptables-save | grep 3306
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
(3)用戶權限控製不當。按照最小權限原則,隻給賬號需要的最小權限即可。
mysql> show grants for gs@101.101.101.101;
+-----------------------------------------------+
| Grants for gs@101.101.101.101;
+-----------------------------------------------+
| GRANT ALL PRIVILEGES ON `gameserver`.* TO 'wscs_gs'@'101.101.101.101'
五、數據庫注入攻擊防禦
上文已介紹了數據庫注入的原因和形式,下文將從代碼、數據庫、Web Server和數據分析四個層麵介紹如何防禦數據庫注入攻擊。
1、代碼
SDL(Security Develop Lifecircle):軟件開發應當遵循“安全開發生命周期”,軟件測試需要增加安全測試的白盒與黑盒測試。
用戶是不可信的:輸入輸出都應當被過濾,至少應滿足以下4個編碼規則。
-
對用戶的輸入進行校驗,可以通過正則表達式,或限製長度;對單引號和 雙"-"進行轉換等。
-
不要使用動態拚裝SQL,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
-
不要把機密信息明文存放,加密或者hash掉密碼和敏感的信息。
-
應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行封裝。
下麵我針對PHP和Pyth的反SQL注入講2個例子,因為平時用的比較多的是ThinkPHP和Flask這2個Web框架。
PHP
where方法使用字符串條件的時候,支持預處理(安全過濾)。
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
模型的Query和execute方法 同樣支持預處理機製,例如:
$model->query('select * from user where id=%d and status=%d',$id,$status);
Python
cur=db.cursor()
sql = "INSERT INTO test2(cid, author, content) VALUES (%s, %s, %s)" #使用%s而不是'%s'
sql=sql%('2','2','bb')
cur.execute(sql,())
2、數據庫
從架構和運維兩方麵談談如何在數據庫層麵進行防禦。
(1)架構
首先是架構層麵,處於性能和安全考慮,可以在數據庫集群與Web Server等前端中間增加DBProxy的中間件,比如Batis或者MyCat。
DB-Proxy Batis MyCat
如圖18所示,MyCat中實現了MySQL的預處理協議,可以接收預處理命令的處理。當使用預處理查詢,也可以返回正確的二進製結果集包,通過這個預處理,可以實現對SQL注入的過濾和攔截。
圖18
開源SQL檢測、阻斷係統 Druid-SQL-Wall
Druid提供了WallFilter,基於SQL語義分析來實現防禦SQL注入攻擊。
(2)運維
然後是運維層麵,可以在進程管理、用戶授權、端口開放等方麵進行攻擊緩解甚至遏製。
進程啟動用戶
mysql 23400 22671 0 Mar19 ? 00:13:25 /usr/sbin/mysqld --basedir=/home/mysql --datadir=/home/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --open-files-limit=8192 --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
數據庫用戶授權
mysql> show grants for gs@101.101.101.101;
| GRANT SELECT,INSERT,DELETE,UPDATE,USAGE PRIVILEGES ON `gameserver`.* TO 'gs'@'10.10.10.10' BY PASSWORD '*89DCA7B59FD064E3A478xxxxxxxxxF272E7E'
iptables
-A INPUT -p tcp -m tcp --dport 3306 -j MYSQL
-A MYSQL -p tcp -m tcp --dport 3306 -j REJECT --reject-with icmp-port-unreachable
3、Web Server
接下來,除了前麵講的代碼、數據庫層麵進行數據庫注入的防禦,其實如果有Web前端,一般還是可以在Web Server層麵進行攔截,實現一個多層次的、立體的防護體係。
下麵將介紹Web Server配置、Web防火牆兩方麵的防禦思路。
配置,配置,還是配置
在Web Server的vhost設置查詢字符串過濾,一旦用戶提交的字符串存在安全隱患,就會直接進行攔截。由於這個匹配度很高,誤殺可能性很低,不過在業務量比較大的情況下,會損耗Web Server一定性能。
server {
set $block_sql_injections 0;
if ($query_string ~ “union.*select.*(“) {
set $block_sql_injections 1;
}
if ($query_string ~ “union.*all.*select.*”) {
set $block_sql_injections 1;
}
if ($query_string ~ “concat.*(“) {
set $block_sql_injections 1;
}
if ($block_sql_injections = 1) {
return 444;
}
WAF
全稱是Web Application Firewall,跟Web Server耦合度很高,一般是作為Web Server的插件編譯安裝進去,常見的方案有下麵幾種:
-
tengine_waf:基於Nginx二次開發的Tengine的WAF模塊。
-
Nginx+Sysguard:Nginx定製版WAF
-
Nginx+HTTPGuard:Nginx定製版WAF
-
Apache+Mod_security:Mod_security其實支持Apache和Nginx,原生的支持Apache,是很通用的一種方案。
一般WAF支持的功能是在以下層麵進行匹配、過濾。
-
user-agent 匹配攔截惡意的user-agent
-
url 匹配攔截惡意的網頁路徑
-
args 匹配攔截惡意的GET請求參數
-
POST 匹配攔截惡意的POST請求參數
-
Cookie 匹配攔截惡意的Cookie 請求
-
whitetip IP白名單
-
whiteurl 網頁路徑白名單
-
blockip IP黑名單
4、日誌分析
在海量的Web Server access.log中分析匹配攻擊模型,從中發現SQL注入或者GetShell的敏感語句。
比如下麵這個wordpress的攻擊日誌,通過報錯或者’\’敏感字符發現報警:
[07-Dec-2016 02:40:49] WordPress database error You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = -1\'' at line 1 for query SELECT text, author_id, date FROM WHERE id = -1\'
現在通過日誌大數據做安全防禦的方案有這麼幾種:
-
實時檢索:ELK,實時查詢性能很好,也有自己的訪問控製機製,需要定製。
-
離線分析:Hadoop,利用MapReduce等算法進行模型定製、分析、輸出報告,方案參考。
-
流處理:Storm+Spark,實時性能好,可以用作實時風控係統。
圖19
總結
數據庫注入其實隻是安全攻防的一個小小的領域,但因為涉及到企業、用戶數據,所以需要列入重點關注。但我們知道,道高一尺魔高一丈,在利益的驅使下攻擊不會停止,我們的防護也不會停止,這場攻防之戰永不落幕。
參考資料
-
個人信息泄漏源
-
SQL注入基礎
-
SQL注入原理
https://blog.csdn.net/stilling2006/article/details/8526458/
Q&A
Q1:開發學這個sqlmap,使用上有哪些難點?手冊中文版的麼?
A1:如果不是基於sqlmap做二次開發,sqlmap學習門檻很低,隻需要對照官方手冊(有中文版,安裝包的doc/translations/README-zh-CN.md)操作即可,就跟學習普通的Linux係統命令一樣簡單。如果開發同學想基於sqlmap做二次開發,難點主要在理解Sqlmap的整體框架,它在軟件工程上被推崇備至,就是因為在設計思想、性能處理上非常值得學習。此外,還可以自定義一些Tamper文件用於繞過服務端過濾,這個比較簡單,主要是字符轉換。sqlmap的學習手冊可以參考:https://www.secbox.cn/hacker/6311.html。
Q2:攻擊工具常用的有哪些?
A2:不同類型的攻擊常用工具都不同,這個回答起來太泛了。這裏我們單純講數據庫注入需要用到的,信息收集通常使用nmap掃描開放端口、禦劍掃描網站目錄,漏洞發現通常基於信息收集使用AWVS或者OpenVas進行Web或係統漏洞掃描,如果發現SQL注入,則分別使用sqlmap、Pangolin(穿山甲)等工具進行自動滲透,然後再基於漏洞點的權限決定是通過後台上傳還是直接寫一句話使木馬到站點,之後,使用中國菜刀(一句話木馬連接工具)連接,再往後的攻擊主要靠思路,沒什麼現成工具。
Q3:WAF可以檢測到SQL注入的行為嗎?
A3:可以。像HTTPGuard或者tengine_waf都支持SQL注入行為發現,主要原理也是依據正則表達式匹配,然後通過輸出的log來報警。
Q4:請問有什麼好的相關書籍或者資料推薦,係統學習安全方麵的知識
A4:1.建議先從Web安全入門,推薦《白帽子講Web安全》,同時學習Linux係統基礎知識,推薦《跟阿銘學linux》。2.學習係統安全相關知識。資料可以參考別人整理的Github上安全知識倉庫:https://www.uedbox.com/github-security-repo-collection/;以及知乎上麵的專欄文章:https://zhuanlan.zhihu.com/p/25661457。
Q5:市場上有什麼防數據庫注入的解決方案嗎?
A5:沒有單獨的防數據庫注入的產品或者商業方案,一般作為入侵檢測係統的子功能,或者Web站點安全防護解決方案的一部分。傳統安全廠商啟明星辰、綠盟都有入侵檢測產品,Web方麵的360和安全狗用的比較多。如果是自己實現,就是本次分享提到的代碼、數據庫、Web Server、日誌分析等幾個層麵的方案。
Q6:科普下肉雞是什麼?
A6:肉雞也稱傀儡機,是指可以被黑客遠程控製的機器。受害者被誘導點擊或者機器被黑客攻破或機器有漏洞被種植了木馬,黑客借此隨意操縱服機器並利用它做任何事情,比如DDoS。
Q7:可以用admin權限,上傳一個1像素的木馬到主頁上抓肉雞,不是更好嗎?
A7:你這裏說的應該是網頁掛馬,也是抓肉雞的一種方式。但是要獲取admin權限,作為非法用戶,本身就要通過入侵去實現的。
Q8:那些搞破解的是不是專做這些事?
A8:數據庫注入跟破解其實不是一個領域的問題,破解更多的是應用程序的逆向,比如破解商業軟件的License之類的。
原文發布時間為:2017-04-05
本文來自雲棲社區合作夥伴DBAplus
最後更新:2017-05-16 12:01:20