SQL Injection攻擊法與安全程式

SQL Injection攻擊法與安全程式

內政部警政署刑事警察局今(2002)年4月22日發佈一則「資料隱碼(SQL Injection)」攻擊法網路安全警訊指出:「國內八成以上的政府、電子商務網站安全面臨嚴重威脅」,引起各界的好奇與重視。本文簡述「SQL Injection」攻擊法及其防禦的原理,同時就「SQL Injection」攻擊法強調安全程式等的重要性。

壹、前言

內政部警政署刑事警察局今(2002)年4月22日首度仿效美國相關單位方式發佈網路安全警訊,指出國內八成以上的官方網站與民間網站,面臨「資料隱碼 (SQL Injection)」駭客攻擊手法的嚴重威脅,利用此方式,駭客可以化身合法使用者,輕易入侵網路伺服器,進而竊取各網站資料庫資訊。結構化查詢語言 (Structured Query Language,簡稱SQL)是關連式資料庫管理系統(Rational Database Management System,簡稱RDBMS)與C語言、COBOL語言等溝通的資料庫查詢語言標準,市面上常見的DB2、IBM Informix、Microsoft SQL、MySQL、Oracle、Sybase等均支援SQL。且不論「SQL Injection」攻擊法的威脅性是否如媒體所述[1~3],由於SQL的普及,已引起各界的好奇與重視。根基於此,在第二節與第三節我們分述「SQL Injection」攻擊法的防堵方法與應有之資料庫系統安全架構;最後,我們強調安全程式(Secure Programming)的重要性並代為結論。

貳、「SQL Injection」攻擊法的防堵方法

「SQL Injection」攻擊法比較貼切的中文名稱應為「SQL 指令植入式」攻擊法,主要是駭客利用釵h未做嚴謹之「Input Data Validation(輸入資料驗證)」之應用系統,將「資料處理程式碼(Data Manipulation Language,簡稱DML;又名SQL 指令)」當做一般資料交給伺服器處理,使得伺服器錯把駭客丟來的偽裝資料之「資料庫程式碼」當成正常的資料庫程式碼執行,藉而達成入侵的目的[4]。這類安全漏洞見諸駭客實現攻擊的文獻可以上溯至1997年,而其原理是使用資料驅動式(Data Driven)攻擊,這種攻擊方法與指令通道式(Command Channel)、命令列式(Command Line Bugs)等攻擊法不同,防火牆與入侵偵測系統等能做的事不多;撰寫應用程式的人員養成如同騎機車戴安全帽、開汽車繫安全帶之安全程式(Secure Programming)的撰寫習慣,方能對防堵及偵測「SQL Injection」等資料驅動式攻擊法有所幫助。舉例而言,此次業界盛傳於4月22日測試成奶妍磥漪Y知名機構網站,使用者於輸入身分證字號時,使用「SQL Injection」攻擊法即可獲得他人之敏感性資訊例;在身分證欄位之輸入資料驗證時,使用資料庫設計中定義域(Domain)的觀念,宣告第1碼僅能使用英文,第2碼僅能使用1或2,第3碼至第10碼僅能使用正整數,即可有效防護。報載自動化防範「SQL Injection」攻擊法的程式,其原理如同4月24日聯合報民意論壇台大湯耀中教授讀者投書所言將「‘ ,」等特殊符號之輸入資料摒除[5],但應無法保證SQL Injection攻擊法一定無法得逞,上述方式僅是資料庫設計定義域觀念的簡化。使用輸入資料驗證外,再使用「輸出資料驗證(Output Data Validation)」,除能落實輸入資料驗證外,尚可監控異常之輸出資料,應是預防「SQL Injection」攻擊法之工程面的解決方案之一。

攻擊手法日新月異,資訊系統的安全威脅亦與時推移,除了工程面的解決方案外,利用教育與訓練建立完整的資訊安全觀念與能力[6];同時,建立資訊安全風險管理、評鑑等之機制[7~8],並定期由專業人員進行滲透測試的檢驗應是比較完整的解決方案。

參、防禦資料趨動式攻擊法資料庫系統安全架構溛觯�

以「SQL Injection」攻擊法為例,在資訊庫系統安全框架中面對的是內部資料被不當揭露之資訊資產的威脅;換言之,應在每一個交易 (Transaction)中,保證外部輸入資料需求之合理性與輸出資料呈現之一致性。一般而言,如圖3.1所示之資訊庫系統安全架構,於縱深防禦中,終端使用者需連結到代理(Proxy)伺服器,經鑑別(Authentication)處理、存取控制、輸入資料驗證等處理後,再將訊息傳送到資料庫伺服器查詢資料,此架構可以隱藏資料庫伺服器之網址與確保輸入資料的合理性與輸出資料的一致性;於水平防禦中,每一筆資料均使用n中取k之秘密分享的機制 (Secret Sharing Scheme),亦即在n個資料庫中,任意k個資料庫中之同一筆資料的儲存值即可還原成原來的資料值,若僅有k-1個資料庫中之儲存值,則一定無法得到原來的資料值[9~10],上述之過程即為「n中取k加/去屏」處理程序,而資料庫中之資料均經加密處理,取用時再由資料庫伺服器解密,應用系統伺服器執行 n中取k去屏,增加駭客攻擊的困難度與資料回復的強健性。

防禦資料驅動式攻擊法資料庫系統安全架構示意

上圖所示之防禦資料驅動式攻擊法資料庫系統安全架構,在面對類似「SQL Injection」攻擊法之時[11],雖非固若金湯但應已能提供足夠之防衛。

肆、結論:

資料庫定義域的觀念,使用資料定義語言(Data Definition Language,簡稱DDL)實現,屬於安全程式的基礎內容之一,於1999年6月23日,筆者替行政院研究發展考核委員會撰寫之「資料庫安全設計與完整性」教材中已有述及,除了前述之圖3.1之安全架構等,尚包含統計資料庫安全等之更深入的議題[12]。此次新聞見諸媒體之當天,業界盛傳測試時超過 10家以上之金融、政府機構使用「SQL Injection」攻擊法均入侵成央C「以管窺陛v,我國安全程式[13~15]的普及尚在「長路漫漫路迢迢」的階段。鑑於兩岸情勢之特殊,我國若不儘速面對安全程式等教育訓練不足的問題,隨著電子化政府、電子商務的發展等的推動;資訊服務之日益普及,已指日可待;台灣海峽彼方的有心人士將可輕易獲取大量我方的敏感資料,4月22日,內政部刑事警察局偵察第九隊發佈之「SQL Injection」攻擊法新聞稿即為例證。如何強化面對資訊戰威脅的資料庫安全的發展趨勢[16],亦需投入應有的資源培育相關技術能力。

伍、關鍵詞

1.資料驅動式攻擊(Data Driven Attack)

2.輸入資料驗證(Input Data Validation)

3.輸出資料驗證(Output Data Validation)

4.安全程式(Secure Programming)

5.結構化查詢語言(Structured Query Language)

6.SQL指令植入式攻擊法(SQL Injection Attack)

(本文作者為交通大學資訊管理研究所樊國楨、方仁威、鈺松國際資訊股份有限公司林佶駿、蘇展志 )

漏洞名稱: SQL Injection

漏洞說明: SQL Injection是一種未做好輸入查驗(Input Validation)的問題,即在撰寫應用程式時,沒有對使用者的輸入做妥善的過濾與處理,便將其組合成SQL指令,傳送給SQL server執行。因而若使用者輸入之資料中含有某些對資料庫系統有特殊意義的符號或命令時,便可能讓使用者有機會對資料庫系統下達指令,而造成入侵所帶來的損失。事實上,這樣的疏漏並不是資料庫系統的錯誤,而是程式設計師或軟體開發者的疏忽所產生的。

影響平台: 使用網站系統:Apache、IIS、Domino、Netscape…

使用程式碼:ASP、PHP、JSP…

攻擊破壞SQL資料庫:包括 MS-SQL、MySQL、Oracle、Sybase、DB2 等等

影響狀況: .SQL Injection可能造成的危害:

透過SQL Injection操作資料庫,可以在未經授權的情況下查詢、新增、更動或刪除資料庫的資料,造成資料洩漏或是不正確;如果用於連接資料庫的使用者權限為資料庫系統管理者,那麼將可奪取資料庫的完整控制權;如果執行資料庫的使用者權限為作業系統管理者,且允陶z過SQL server執行作業系統的命令,那麼將可奪取作業系統的完整控制權。

.SQL Injection的影響範圍:
只要有使用或連結資料庫的軟體、網路服務都有可能面臨SQL Injection的威脅。乍聽之下影響範圍似乎很大,但是大多數的商用軟體並不會有這樣的問題;比較嚴重的可能是網路服務部分,由於網站程式開發者的素質良莠不齊,或是對於資料庫的指令操作與系統管理不熟悉,所以只要有提供表單(Form)輸入介面的網站,都有可能面臨威脅。

解決方案: .解決之道與預防方法:
1. 對於字串的輸入加以過濾,並限制長度。例如 ‘ 或 ” 這種單、雙引號都應該過濾掉,這樣可以避免輸入者利用 ‘ 或 ” 這種單、雙引號截斷原本的SQL指令再插入自己的指令。
過濾的方法依開發語言的不同而有不同的方法,以VB Script/ASP為例,過濾單引號的簡單方法為:
SafeString = Replace(InputString, “’”, “””)

2. 若輸入為數值資料則須確定其只輸入0~9之數字,若包含其他英文字母或符號則一律拒絕接受。
3. 對於前兩項的檢查必須寫在server端的程式上,如PHP、ASP及其他各種CGI程式,而不能將其寫於Java script或VB script等會於client端執行的程式上,因惡意使用者可將client端程式另存於本地端硬碟後,再將其修改以略過檢查。並且不要在server 上留有.bak或.old檔,若有.inc檔也不要取與主.asp相同或容易猜測之檔名,因為一般網頁伺服器會允陶o些檔案的下載。
4. 加強資料庫帳號與權限管理,讓網站或軟體不以系統管理者的帳號連結資料庫,而對每個資料庫設定一組個別的帳號與強健的密碼,限制這組帳號僅能對該資料庫有讀寫權限。當面臨SQL Injection的侵入時,分權管理能夠限制損害的範圍,減少因為疏忽造成的損失。
5. 做好正確錯誤處理,最理想狀態是所有使用者輸入皆在程式設計者預期之中;若萬一出現非預期的情形也要做好例外處理,勿讓使用者直接看到系統傳回的錯誤訊息,以免惡意使用者由系統錯誤訊息中獲取過多資訊。
6. 全面檢視軟體的程式碼。這在一般商用軟體或應用軟體不太可能做到,但是可以詢問軟體廠商這類問題,以確保他們有進行檢查;網站程式的部分,可以請開發的程式設計師做一次全面性的檢查。
7. 各資料庫系統安裝時通常會有一些預先定義的Table,若確定這些Table並不需要使用到,最好予以刪除,以免惡意使用者利用這些Table獲取過多資訊。
8. 做好軟體開發控管。針對每個資料欄位的Input,確實做好檢查的工作,以降低開發出面臨威脅的程式或軟體。

參考資料: .相關網址:
1. SQL Injection FAQ:
http://www.sqlsecurity.com/faq-inj.asp
2. Input Validation & SQL Injection:
http://www.owasp.org/asac/input_validation/sql.shtml
3. SQL Injection WhitePaper:
http://www.spidynamics.com/whitepapers/Whi…QLInjection.pdf
4. GSN-CERT/CC的安全通報:
http://www.gsn-cert.nat.gov.tw/news_conten…tml?news_id=231
5.Understanding and Preventing SQL Injection Attacks
http://www.siksoft.co.za/data/sqlinjectionattack.htm
6 『資料隱碼』SQL Injection的源由與防範之道
. http://www.microsoft.com/taiwan/sql/SQL_Injection.htm
7. SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上)
http://www.microsoft.com/taiwan/sql/SQL_In…njection_G1.htm
8. SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(下)
http://www.microsoft.com/taiwan/sql/SQL_In…tion_G2.htm.htm