API 就像是呼叫者與被呼叫者之間簽訂的規定。最常見的 API 濫用形式是由呼叫者這一當事方未能遵守此規定所造成的。例如,如果程式在呼叫 chroot() 後無法呼叫 chdir(),即違反規範如何以安全方式變更使用中根目錄的規定。程式庫濫用的另一個好例子是期待被呼叫者向呼叫者傳回值得信賴的 DNS 資訊。在這種情況下,呼叫者是透過對其行為做出某些假設 (傳回值可用於驗證目的) 來濫用被呼叫者 API。另一方也可能違反呼叫者與被呼叫者間的規定。例如,如果編碼器衍生出子類別 SecureRandom 並傳回一個非隨機值,則違反了規定。
DBMS_UTILITY.EXEC_DDL_STATEMENT
只會執行歸類為資料定義語言 (Data Definition Language) 一部份的指令,並且忽略不受內嵌 SQL 支援的其他指令。使用該程序時,此行為將很難偵測到錯誤。http://www.example.com/index.php?param=...
,以下在 index.php
中的 php 片段會將 URL 參數 param
(以取代「...」的方式傳遞) 的值列印至畫面,只要其符合代表「零或多個英數字元」的 POSIX 一般表示式 '^[[:alnum:]]*$'
:
<?php
$pattern = '^[[:alnum:]]*$';
$string = $_GET['param'];
if (ereg($pattern, $string)) {
echo($string);
}
?>
Example 1
會按照英數輸入如期操作,但是因為不安全的 ereg()
函數會用於驗證受感染的輸入,所以還是可能會透過 null
位元組執行 Cross-site scripting (XSS) 攻擊。藉由傳遞 param
的值,其中包含有效的英數字串,後面依序接著 null
位元組與 <script>
標籤 (例如 "Hello123%00<script>alert("XSS")</script>"
),ereg($pattern, $string)
依然會傳回 true
,因為 ereg()
函數在讀取輸入字串 (由左到右) 時,會忽略接在 null
位元組字元後面的任何內容。在此範例中,這表示接在 null
位元組後面注入的 <script>
標籤,將會顯示給使用者並接受評估。xp_cmdshell
函數。不應使用該函數。xp_cmdshell
函數會啟動 Windows 指令 shell,以執行提供的指令字串。該指令會在預設系統或提供的代理伺服器環境中執行。但是,沒有方法可以將使用者限制為預先指定的權限操作組合,任何權限授予都會開放使用者執行任何指令字串。chroot()
系統呼叫的不適當使用會讓攻擊者避開系統的封鎖。chroot()
系統呼叫允許程式修改其 File System 的根目錄含義。在適當地進行 chroot()
呼叫之後,程式無法存取新根目錄所定義的目錄樹狀架構之外的任何檔案。這樣的環境叫作 chroot jail,通常是用來阻止程式被推翻、並用來存取未經授權檔案的可能性。例如,很多 FTP 伺服器在 chroot jail 環境中執行,以便用來防止發現新伺服器弱點的攻擊者有能力下載密碼檔或者其他系統中的敏感檔案。chroot()
可能會讓攻擊者避開 chroot jail。因為 chroot()
函數呼叫不會改變程式目前的工作目錄,所以在呼叫 chroot()
之後,相關路徑仍然會參照 chroot jail 之外的 File System 資源。
chroot("/var/ftproot");
...
fgets(filename, sizeof(filename), network);
localfile = fopen(filename, "r");
while ((len = fread(buf, 1, sizeof(buf), localfile)) != EOF) {
fwrite(buf, 1, sizeof(buf), network);
}
fclose(localfile);
GET
。FTP 伺服器在其初始化程式中呼叫 chroot()
,以避免存取 /var/ftproot
以外的檔案。但是,因為伺服器沒能藉由呼叫 chdir("/")
來變更目前的工作目錄,所以攻擊者就能要求檔案 "../../../../../etc/passwd
",並取得系統密碼檔案的副本。java.io
套件,因此違反了企業級 JavaBeans 規格。FileResponse
實例讓攻擊者能夠下載受保護目錄內的應用程式二位元程式碼,或是檢視其中的任何檔案。
from django.http import FileResponse
...
def file_disclosure(request):
path = request.GET['returnURL']
return FileResponse(open(path, 'rb'))
...
範例 2:以下程式碼採用不可信賴的資料,並使用該資料來建立在伺服器端轉送中使用的路徑。
...
String returnURL = request.getParameter("returnURL");
RequestDispatcher rd = request.getRequestDispatcher(returnURL);
rd.forward();
...
...
<% String returnURL = request.getParameter("returnURL"); %>
<jsp:include page="<%=returnURL%>" />
...
...
String returnURL = request.getParameter("returnURL");
return new ModelAndView(returnURL);
...
<webflow:end-state id="finalStep" view="${requestParameters.url}"/>
<webflow:view-state id="showView" view="${requestParameters.test}">
<bean class="org.springframework.web.servlet.view.
InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
InternalResourceViewResolver
會採用其所設定的字首,然後串連檢視屬性中傳送的值,並於最後加上字尾。
...
String returnURL = request.getParameter("returnURL");
return new ActionForward(returnURL);
...
realloc()
來調整儲存敏感資訊的緩衝區大小。此函數可能會將敏感資訊的副本鎖在記憶體中,無法覆寫。realloc()
函數通常是用來提高分配記憶體區塊的大小。此操作通常需要將舊記憶體區塊中的內容轉移到容量更大的新記憶體區塊。它會完整無缺地保留原來記憶體區塊中的內容,但是不會讓程式得到任何內容,藉此阻止了程式清除記憶體中敏感資訊的能力。如果攻擊者之後能夠檢查記憶體傾印的內容,敏感資料就會暴露出來。realloc()
:
plaintext_buffer = get_secret();
...
plaintext_buffer = realloc(plaintext_buffer, 1024);
...
scrub_memory(plaintext_buffer, 1024);
realloc()
,所以資料副本仍然會在原來對 plaintext_buffer
分配的記憶體中暴露出來。VirtualLock
來鎖定包含敏感資料的頁面。此函數並不是隨時都可執行的。VirtualLock
函數是用來鎖住記憶體的頁面,以防止在磁碟中被分頁。然而,在 Windows 95/98/ME 作業系統裡,這個函數是不能完整執行的,而且沒有任何影響。