漏洞類別
結構化輸出生成漏洞
程序通常必須動態(tài)構造結構化輸出,然后由另一個程序使用。示例包括:構造數(shù)據(jù)庫使用的SQL查詢,或構造Web瀏覽器使用的HTML頁面??梢詫⑸山Y構化輸出的代碼視為子組件。輸出的預期結構,以及如何在輸出中使用子組件的輸入,可以被視為該子組件應遵守的協(xié)定。例如,當提供名稱和密碼作為輸入時,預期的輸出是一個SQL查詢,該查詢從用戶中選擇具有給定名稱和密碼的用戶數(shù)據(jù)庫表。
【資料圖】
一種常見的不安全編程實踐是通過字符串操作來構造這種結構化輸出。輸出構造為字符串的串聯(lián),其中其中一些字符串是從程序的輸入派生的(直接或間接)。這種做法很危險,因為它使輸出字符串的預期結構成為隱式的,并且惡意選擇輸入字符串的值可能會導致程序生成意外的輸出。例如,程序員可以將SQL查詢構造為:
query=”select * from users where name=’” + name + ”’” and pw = ’” + password + ”’”
目的是構造一個SQL查詢,用于檢查where子句中的名稱和密碼。但是,如果名稱字符串由攻擊者提供,則攻擊者可以將名稱設置為“John"--”,這將從查詢中刪除密碼檢查(注意-在SQL中開始注釋)。
結構化輸出生成漏洞是程序構造此類意外輸出的錯誤。在結構化輸出表示旨在將提供的輸入作為數(shù)據(jù)包含的代碼的情況下,這尤其危險。然后,惡意選擇的輸入數(shù)據(jù)可能會以意外的方式影響生成的輸出代碼。這些漏洞也稱為注入漏洞(例如,SQL注入或腳本注入)。名稱“注入”是指利用這些漏洞通常會提供數(shù)據(jù)輸入,導致結構化輸出包含額外的代碼語句,即利用在輸出中注入意外的新語句。結構化輸出生成漏洞與許多不同類型的結構化輸出相關:
?SQL注入漏洞是一種結構化輸出生成漏洞,其中結構化輸出由SQL代碼組成。這些漏洞與服務器端Web應用程序軟件特別相關,在服務器端Web應用程序軟件中,應用程序通常通過部分基于Web表單提供的輸入構造查詢來與后端數(shù)據(jù)庫進行交互。
?命令注入漏洞是一個結構化輸出生成漏洞,其中結構化輸出是應用程序發(fā)送到操作系統(tǒng)shell的shell命令。
?腳本注入漏洞(有時也稱為跨站點腳本(XSS)漏洞)是一種結構化輸出生成漏洞,其中結構化輸出是發(fā)送到Web瀏覽器進行客戶端執(zhí)行的JavaScript代碼。
此列表絕不是詳盡無遺的。其他例子包括:XPath注入,HTML注入,CSS注入,PostScript注入等等。
有幾個因素可能導致難以避免結構化輸出生成漏洞:
?結構化輸出可以是支持句法結構明顯不同的子語言的語言。這種問題案例的一個重要例子是HTML,它支持JavaScript,CSS和SVG等子語言。
?結構化輸出的計算可以在不同的階段進行,一個階段的輸出被存儲,然后作為后續(xù)階段的輸入進行檢索。經歷多個階段的結構化輸出生成漏洞有時稱為存儲注入漏洞,或者更一般地稱為高階注入漏洞。示例包括存儲的XSS和高階SQL注入。
利用結構化輸出生成漏洞的攻擊技術通常取決于結構化輸出語言的性質,但已知并記錄了用于利用SQL注入或腳本注入的各種攻擊技術。
Web和移動安全CyBOK知識區(qū)[2]提供了對此類攻擊技術的更詳細討論。
標簽: