ABAP程序中的七大危险漏洞
SAP的企業(yè)資源規(guī)劃(ERP)系統(tǒng)已成為企業(yè)各項關(guān)鍵業(yè)務(wù):財務(wù)管理、薪資管理、人力資源管理、供應(yīng)鏈管理、客戶關(guān)系管理等的基礎(chǔ)平臺。然而,在每個SAP的安裝實施過程中,都會基于客戶的需求進(jìn)行不同程度的客戶化。通常使用ABAP程序來調(diào)整SAP系統(tǒng)以滿足客戶的需求,而且還能更好的定制SAP的實施及應(yīng)用。然而,有缺陷的ABAP代碼卻有可能給開發(fā)人員非法訪問SAP系統(tǒng)關(guān)鍵資源的機會。ABAP程序的安全漏洞,如果沒有被很好的控制,將會造成關(guān)鍵數(shù)據(jù)丟失、經(jīng)濟損失等嚴(yán)重后果,甚至需要承擔(dān)法律責(zé)任,因為這些代碼漏洞違反了法律規(guī)定。
簡介
??SAP的企業(yè)資源規(guī)劃(ERP)系統(tǒng)被全球大部分的企業(yè)級公司所采用。在這樣的企業(yè)級環(huán)境中,加強SAP應(yīng)用的安全性有著很重要的意義。SAP系統(tǒng)是企業(yè)各項關(guān)鍵業(yè)務(wù):財務(wù)管理、薪資管理、人力資源管理、供應(yīng)鏈管理、客戶關(guān)系管理等的基礎(chǔ)平臺,因此SAP安全也尤為重要。任何未知的缺陷或漏洞都會導(dǎo)致災(zāi)難性的后果,并會為之付出昂貴的代價。
??SAP安全主要包括SAP授權(quán)、密碼策略、角色分配不當(dāng)或權(quán)限過大、安全策略失效等方面。如果能對解決上述方面的問題并對其進(jìn)行監(jiān)控,就能保障企業(yè)的相對安全。但是,這些漏洞卻往往會被忽視而且很少受到仔細(xì)的檢查。那些運行在公司服務(wù)器上的,由公司內(nèi)部和外部人員開發(fā)的代碼就存在這樣的情況。
??在每個SAP的安裝實施過程中,都會基于客戶的需求進(jìn)行不同程度的客戶化。除調(diào)整基礎(chǔ)的SAP系統(tǒng)以滿足客戶的規(guī)范要求外, 公司的開發(fā)人員還會編寫一些功能程序來定制SAP的安裝,而他們使用的編程語言是ABAP —— SAP的主要的,并且在不斷發(fā)展的編程語言。
??雖然公司可能會遵循嚴(yán)格的軟件開發(fā)流程,還會有測試和質(zhì)量保證等階段,但ABAP代碼卻很少會被開發(fā)者之外的其他人進(jìn)行逐行的代碼審查。所以,無論對ABAP程序進(jìn)行多少測試,實際上只有開發(fā)者自己才知道這些代碼到底有多安全。如果不對代碼進(jìn)行嚴(yán)格仔細(xì)的審查,有缺陷的ABAP代碼就很可能給開發(fā)人員非法訪問SAP系統(tǒng)關(guān)鍵機密資源的機會。ABAP程序的安全漏洞,如果沒有被正確的處理,將會造成關(guān)鍵數(shù)據(jù)丟失、經(jīng)濟損失等嚴(yán)重后果,甚至需要承擔(dān)法律責(zé)任,因為這些代碼漏洞違反了法律規(guī)定
常見的ABAP漏洞
??ABAP程序的漏洞很難被標(biāo)準(zhǔn)編譯器或代碼分析器檢測到,因為這些漏洞并不是因語法錯誤產(chǎn)生的,它們更像是普通的編程步驟或一些預(yù)置程序,這些預(yù)置可能是開發(fā)者的疏忽,也可能是開發(fā)者故意留在系統(tǒng)中以備以后利用。我們一起來看看這些常見ABAP程序漏洞:
SQL Injection
定義
??SQL注入是一種攻擊應(yīng)用服務(wù)器或web網(wǎng)站的方式,是通過嘗試在普通用戶的輸入內(nèi)容中嵌入SQL語句,來操縱Open SQL語句的執(zhí)行內(nèi)容。下面的例子演示了一個普通的SQL語句是如何被用于進(jìn)行SQL注入攻擊的:
正常SQL語句
SELECT * FROM table WHERE name = 'userinput'.
被攻擊者用SQL注入修改后的語句
SELECT * FROM table
WHERE name = ' a'; DROP TABLE users;
? ?? ?? ?? ? SELECT *
? ?? ?? ?? ?? ?FROM??table1
? ?? ?? ?? ? WHERE name = '%''.
上面的示例中,攻擊者沒有輸入應(yīng)用或web網(wǎng)站的用戶名,而是使用了SQL注入攻擊,用紅色部分嵌入SQL的文本替換了用戶名。這樣,SQL語句的查詢結(jié)果就從簡單的讀取用戶名與用戶輸入相匹配的數(shù)據(jù),變成了先讀取用戶名是’a’的數(shù)據(jù),然后再刪除用戶表,最后再讀取表’table1’中的所有數(shù)據(jù)。攻擊者已經(jīng)很輕松地獲取到了未授權(quán)的特定表的數(shù)據(jù),還刪除了包含所有用戶信息的表。
對業(yè)務(wù)有何影響?
此漏洞會導(dǎo)致數(shù)據(jù)被破壞或SAP數(shù)據(jù)庫中的數(shù)據(jù)被惡意篡改。這也會使公司信譽受損,并因此影響公司收益。舉例說明SQL注入攻擊者會做些什么事情:
攻擊者使用你們公司的在線商店來購買產(chǎn)品。如果在付款流程中的某個web頁面不夠安全,攻擊者用下面的語句來替換他的用戶名:
a'; SELECT *
? ?? ?FROM??CreditCardInfo
? ?? ?WHERE name = '%'
這樣,攻擊者就能成功地獲取了您公司所有注冊用戶的信用卡信息。
如何修復(fù)漏洞?
在ABAP代碼中,用戶輸入的所有內(nèi)容都應(yīng)該在插入于SQL語句前進(jìn)行驗證和清理,以便移除偽裝成用戶輸入的各種惡意代碼和命令。
未進(jìn)行授權(quán)檢查
定義
??在ABAP程序或報表程序中,能夠調(diào)用SAP事務(wù)處理命令。通常,這些事務(wù)處理命令是在SAP GUI客戶端中被調(diào)用的,而且需要用戶擁有執(zhí)行命令所必需的權(quán)限。但是,在ABAP代碼中,如果開發(fā)者在調(diào)用前沒有明確的進(jìn)行權(quán)限檢查,那么無論當(dāng)前用戶是否有執(zhí)行權(quán)限,上面的SAP事務(wù)處理命令都會被執(zhí)行。下面的例子演示了調(diào)用SAP事物處理命令而沒有進(jìn)行權(quán)限檢查:
? ? CALL TRANSACTION ‘SU10’.
上面這行ABAP代碼調(diào)用了SAP事務(wù)處理命令’SU01’——用來集中管理維護(hù)用戶的命令,卻沒有對當(dāng)前用戶是否有權(quán)執(zhí)行進(jìn)行檢查。
對業(yè)務(wù)有何影響?
這一漏洞將導(dǎo)致未經(jīng)授權(quán)地執(zhí)行SAP事務(wù)處理命令,進(jìn)而非法的訪問SAP數(shù)據(jù),甚至篡改數(shù)據(jù)。而且,機密數(shù)據(jù)丟失或公司系統(tǒng)被滲透,將導(dǎo)致客戶信心下降??蛻粜判膭訐u又將會長期影響公司收益。在大部分這樣的案例中,這樣操作還是違反法律規(guī)定的。下面這個例子說明未進(jìn)行授權(quán)檢查會怎樣:
一個普通用戶執(zhí)行上面的ABAP 程序,到了運行事務(wù)代碼’SU01’那一步,這個用戶本身是沒有權(quán)限執(zhí)行’SU01’的,但是因為這個ABAP代碼沒有授權(quán)檢查,他現(xiàn)在卻獲得了這種權(quán)限,這樣做是絕對違反法律規(guī)定的。
如何修復(fù)漏洞?
??在ABAP代碼中所有調(diào)用SAP事務(wù)處理命令的地方,都需要事先進(jìn)行詳細(xì)的授權(quán)檢查,以確認(rèn)當(dāng)前用戶是否擁有執(zhí)行此命令所必須的權(quán)限。這個修復(fù)上面ABAP代碼的簡單方法是,在原來的代碼:
? ? ? ? CALL TRANSACTION ‘SU10’.
增加一段AUTHORITY-CHECK代碼:
? ? ? ? AUTHORITY-CHECK OBJECT 'S_TCODE
? ?? ?? ?? ?? ?ID 'TCD'
? ?? ?? ?? ?? ?FIELD 'SU10'.
IF sy-subrc = 0.
CALL TRANSACTION 'SU10'.
ENDIF.
這樣就可以在調(diào)用前確定當(dāng)前用戶是否有權(quán)執(zhí)行。
硬編碼的用戶憑證
定義
? ? 在ABAP代碼中,用戶安全憑證不是動態(tài)檢查的而是硬編碼寫死在程序中的。例如:
IF sy-uname = 'JOHNSMITH'.
? ? ? ? CALL TRANSACTION ‘SU01’.
ENDIF.
對業(yè)務(wù)有何影響?
這將會允許用戶輕松地通過檢查,而不是真正的使用用戶自己的身份進(jìn)行認(rèn)證和檢驗。在這樣的例子中,很可能導(dǎo)致某個用戶獲取到SAP數(shù)據(jù)庫中未被授權(quán)訪問的數(shù)據(jù)。這樣的非法訪問數(shù)據(jù)會使公司蒙受經(jīng)濟損失,動搖客戶信心,也同樣違反了法律規(guī)定。舉例說明:
??John Smith是一家ABAP軟件開發(fā)公司的開發(fā)人員,您將您公司ABAP開發(fā)外包給了這家公司。John 恰好在您公司的這個項目中工作。John在他編寫的一個偶爾會用到的、用于記錄他在此項目工作時間的普通程序中,包裝了一段’SU01’調(diào)用的代碼。通過上面的硬編碼,使得只在他登錄時,程序在會調(diào)用’SU01’命令。而后,John Smith 使用這個程序時就不僅是用它記錄工作時間了,還進(jìn)入了您公司的SAP系統(tǒng)’SU01’命令,他就可以創(chuàng)建新用戶或修改您公司的用戶數(shù)據(jù)。這當(dāng)然也絕對是違反了法律規(guī)定的。
如何修復(fù)漏洞?
所有的硬編碼的用戶憑證都必須用對當(dāng)前用戶的動態(tài)檢查來替換。這樣才能使授權(quán)檢查真正地起到安全保護(hù)作用,而不僅僅是一個假象
跨站腳本
定義
??跨站腳本是一種攻擊方式,它通過在Web頁面的用戶輸入內(nèi)容中嵌入惡意腳本來進(jìn)行攻擊。一旦這樣的頁面被加載,惡意代碼將會在用戶的瀏覽器中執(zhí)行。這些腳本利用了web應(yīng)用的安全漏洞,繞過常規(guī)的瀏覽器強制加載的安全機制,來進(jìn)行惡意攻擊。
對業(yè)務(wù)有何影響?
??如果通過跨站腳本攻擊成功地嵌入的惡意腳本被執(zhí)行了,那攻擊者就能獲取到存儲于瀏覽器會話中的用戶或應(yīng)用的機密信息。這將會導(dǎo)致用戶身份被盜用或數(shù)據(jù)被破壞,以致造成經(jīng)濟損失、法律責(zé)任甚至失去品牌價值等嚴(yán)重后果。下面示例說明這一漏洞的嚴(yán)重性:
??一個黑客來到您公司的在線商店中,想要在付款頁面嵌入一些惡意腳本。通過跨站腳本這種方式,他成功的將惡意代碼嵌入其中。從這以后,每當(dāng)有客戶在您公司的在線商店購買商品時,客戶的所有訂單信息包括信用卡信息都被發(fā)送到黑客的服務(wù)器上,而不是您公司的服務(wù)器上了。
如何修復(fù)漏洞?
??跨站腳本攻擊也是一種代碼注入攻擊方式,所以應(yīng)該在ABAP程序使用用戶輸入內(nèi)容前,對其進(jìn)行的嚴(yán)格檢查和清理,這樣才能去除嵌入其中的危險代碼
定義
??一些ABAP命令允許訪問文件系統(tǒng)或執(zhí)行底層操作系統(tǒng)命令。這就會有潛在危險,所以它們是不應(yīng)該出現(xiàn)在ABAP代碼中。
對業(yè)務(wù)有何影響?
??如果不仔細(xì)檢查,這樣的ABAP命令會變的非常危險,它們可能會被用來刪除或修改操作系統(tǒng)文件或者SAP數(shù)據(jù)。這將會危害整個公司和公司的各種寶貴數(shù)據(jù)的安全,并因此會損害公司在客戶中的聲譽,減少預(yù)期收益。下面的例子演示這一漏洞的危害:
??一名您公司ABAP外包項目的開發(fā)人員,在他編寫的一個簡單的ABAP程序中,包含了一個’DELETE DATASET’的命令,而這個程序卻是您公司員工經(jīng)常使用的程序。這個程序僅僅被這個開發(fā)人員更新了一下就發(fā)送給您公司來使用。當(dāng)公司內(nèi)的員工使用新更新的程序時,像刪除這樣的攻擊會不知不覺的發(fā)生。
如何修復(fù)這樣的漏洞?
應(yīng)該盡量少使用這些命令,并仔細(xì)的審查代碼,以保證這些命令不會被惡意使用
生成Open SQL
定義
??Open SQL允許用戶使用可動態(tài)生成的SQL語句,以便在運行時完成裝配,而不是編譯時生成。如果用戶輸入的內(nèi)容恰好是生成的SQL語句的一部分,并且沒有被很好的檢查和清理,就會導(dǎo)致用戶讀取或修改SAP數(shù)據(jù)中的關(guān)鍵數(shù)據(jù),甚至?xí)谄渲胁迦胍恍┘贁?shù)據(jù)。這有一個動態(tài)生成Open SQL語句的例子:
SELECT * FROM (mytable) WHERE NAME = (username).
對業(yè)務(wù)有何影響?
如果通過用戶輸入能修改后臺Open SQL語句,就會導(dǎo)致關(guān)鍵業(yè)務(wù)數(shù)據(jù)被盜、被修改甚至被刪除。SQL注入攻擊是這種利用SQL語句使用不當(dāng)來進(jìn)行攻擊的一個通用模式。同樣的,這種數(shù)據(jù)被非法訪問的事情將損害公司在客戶中的聲譽,給公司造成經(jīng)濟損失,還可能承擔(dān)法律責(zé)任。舉例說明:
在你的ABAP程序中有如下的Open SQL語句:
SELECT * FROM SSNDETAILS WHERE NAME = (usernameval).
變量’usernameval’原本是取自用戶輸入內(nèi)容的。一個心懷不滿的員工,沒有輸入他的用戶名,而是輸入了一段惡意字符,使上面的語句變成了這樣:
SELECT * FROM SSNDETAILS WHERE NAME = ‘%’.
這樣他獲得了所有員工的社保信息,而不只是他自己的信息。
如何修復(fù)漏洞?
??應(yīng)該盡量少使用動態(tài)生成的Open SQL語句,如果必須使用,則應(yīng)該在使用前對用戶輸入的內(nèi)容進(jìn)行嚴(yán)格檢查和清理。
ABAP命令注入(程序)
定義
動態(tài)ABAP命令像:POOL, PERFORM 和 GENERATE SUBROUTINE,通常被用來在運行時生成并執(zhí)行ABAP代碼。如果這樣的命令和用戶的輸入一起使用,將是非常危險的事情。
對業(yè)務(wù)有何影響?
??如果用戶的輸入內(nèi)容和這些動態(tài)的ABAP命令一起使用,而用戶輸入內(nèi)容又沒有任何的后期處理流程或清理,就會導(dǎo)致SAP數(shù)據(jù)庫數(shù)據(jù)被非法讀寫,甚至?xí)S機執(zhí)行一些危險SAP系統(tǒng)命令。未經(jīng)批準(zhǔn)地訪問數(shù)據(jù)可能會使公司在客戶中信譽掃地,即使沒有也會嚴(yán)重?fù)p害公司的信譽。還會給公司還來經(jīng)濟損失,而且大多數(shù)還會承擔(dān)法律責(zé)任。舉例說明:
??一個心懷不滿的員工在一個經(jīng)常使用的ABAP程序中嵌入了一個動態(tài)命令,這個程序?qū)谀硞€特殊時間(比如當(dāng)他被解雇的時候),刪除關(guān)鍵的系統(tǒng)數(shù)據(jù)。而當(dāng)這災(zāi)難性的毀滅發(fā)生或漏洞被發(fā)現(xiàn)時,他已經(jīng)遠(yuǎn)走高飛了。
如何修復(fù)漏洞?
??使用動態(tài)ABAP命令的地方應(yīng)該被控制在盡可能少的情況中,而且無論什么時候使用,都應(yīng)該對用戶輸入的內(nèi)容進(jìn)行嚴(yán)格檢查以保證里面不會有潛在的惡意命令。
ABAP命令注入(報告)
定義
??和在ABAP程序中使用動態(tài)ABAP命令一樣,有一些命令像:INSERT REPORT 和 GENERATE REPORT被用于在運行時動態(tài)生成REPORT程序。如果有和用戶的輸入內(nèi)容一起使用,則用戶可能會通過運行動態(tài)REPORT來獲得SAP數(shù)據(jù)庫中的關(guān)鍵數(shù)據(jù)。
對業(yè)務(wù)有何影響?
??如果用戶的輸入內(nèi)容和這些動態(tài)的ABAP命令一起使用,而用戶輸入內(nèi)容又沒有任何的后期處理流程或清理,這可能會導(dǎo)致SAP數(shù)據(jù)庫數(shù)據(jù)被非法讀寫,甚至?xí)S機執(zhí)行一些危險SAP系統(tǒng)命令。未經(jīng)批準(zhǔn)地訪問數(shù)據(jù)可能會使公司在客戶中信譽掃地,即使沒有也會嚴(yán)重?fù)p害公司的信譽。還會給公司還來經(jīng)濟損失,而且大多數(shù)還會承擔(dān)法律責(zé)任。舉例說明:
??一個對公司不滿的員工,在一個他經(jīng)常使用的程序中嵌入了動態(tài)ABAP命令,這個命令會生成一個所有的員工社保信息的報告。然后他像往常一樣進(jìn)入程序,瀏覽了包含所有員工社保信息的報告。這絕對是法律不允許的。
如何修復(fù)漏洞?
??使用動態(tài)ABAP命令的地方應(yīng)該被控制在盡可能少的情況中,而且無論什么時候使用,都應(yīng)該對用戶輸入的內(nèi)容進(jìn)行嚴(yán)格檢查以保證里面不會有潛在的惡意命令。
上面這些,只是選擇了ABAP程序漏洞中一小部分進(jìn)行了介紹。大部分都是因編程疏忽、單純無知的錯誤或惡意代碼而引起的程序漏洞。這些程序漏洞,能夠通過仔細(xì)的逐行的代碼檢查來發(fā)現(xiàn)。然而,通過人工進(jìn)行代碼檢查可是相當(dāng)耗時的,因為,一個公司里定制開發(fā)的ABAP代碼庫中會有成千上萬行的ABAP代碼!
如前所述,大約80%的SAP客戶都有自己定制開發(fā)的程序。這些程序大部分都是用ABAP或WebDynpro 來開發(fā)。這些定制開發(fā)過程中的質(zhì)量保證流程通常只是在將程序發(fā)布到生產(chǎn)環(huán)境前,進(jìn)行功能性的質(zhì)量檢查。而對跨站腳本、未授權(quán)檢查、SQL注入等安全漏洞方面進(jìn)行的檢查,卻大部分都沒有進(jìn)行過。
一些客戶會希望通過一些黑盒測試來發(fā)現(xiàn)大部分關(guān)鍵的安全漏洞。但是,黑盒測試只能確認(rèn)一部分問題。
總結(jié)
以上是生活随笔為你收集整理的ABAP程序中的七大危险漏洞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PC上虚拟机中安装NW 7.02 ABA
- 下一篇: Web Dynpro for ABAP