9.1 注入解釋型語言
1、解釋型語言是一種在運動時有一個運動時組件解釋語言代碼並執行其中包含的指令的語言。
2、編譯型語言:它的代碼在生成時候轉換成機器指令,然後在運行時直接由使用該語言的計算機處理器執行這些指令。
3、基於解釋型語言的執行方式,產生一系列叫代碼注入的漏洞。任何有實際用途的應用程序都會收到用戶提交的數據,對其進行處理並執行相應的操作。
4、原本驗證用戶名和密碼的SQL。
若攻擊者知道admin賬戶名,然後利用漏洞,
這樣也起到了admin賬戶的作用。
5、若攻擊者不知道admin賬戶名,且根據(數據庫表第一個往往是admin賬戶信息,由認爲手工創建的)這一特徵,以數據庫中的第一個用戶登錄。
9.2 注入SQL
1、SQL是最普遍的漏洞,經常使用API來避免SQL注入,
9.2.1 利用一個基本的漏洞
9.2.2 注入不同的語句類型
1、SELECT語句:查詢作用。其注入點通常在WHERE子句。
2、INSERT語句:建立新的數據行。利用漏洞可以爲自己創建一個攻擊賬戶,但必須保證後面數據類型符合。保證SQL正常執行。
3、UPDATE語句:更新一行或多行數據。
4、DELETE語句:刪除表中一行或多行。與UPDATE類似。
9.2.3 查明SQL注入漏洞
1、注入字符串數據:如果SQL查詢合併與用戶提交的數據,它會將這些數據包含在單引號中。爲了利用任何SQL注入漏洞,攻擊者需要擺脫這些引號的束縛。
2、注入數字數據:如果SQL查詢合併數據,必將其包含在單引號中,作爲字符串處理。但許多時候,應用程序會將數字數據以數字格式直接傳送到數據庫中,並不把它放入單引號中。所以採用以下針對數字數據的特殊測試步驟。
3、注入查詢結構:如果用戶提交的數據被插入SQL查詢結構中,而不是查詢中的數據項中,這時實施SQL注入攻擊只需要直接應用有效的SQL語法,而不需要進行“轉義”。
9.2.4 “指紋”識別數據庫
1、數據庫衆多,差異明顯。我們已經知道如何提取數據庫版本字符串,即使某種原因提取不到,還可以利用其它方法識別。一種方法就是根據數據庫連接字符串的不同方式進行識別。
9.2.5 UNION操作符
1、UNION將兩個或幾個SELECT語句的結果組合到獨立一個結果中(結果中不含重複值,且查詢語句格式數據類型必須一致或者數據類型兼容)。
9.2.6 提取有用的數據
9.2.7 使用UNION提取數據
9.2.8 避開過濾
1、有時爲了防止SQL注入攻擊而設置多種輸入過濾,如,刪除或淨化某些字符,禁止SQL關鍵字等。
2、避免使用被阻止的字符
若應用程序刪除或編碼某些在SQL注入攻擊中經常使用到的字符,那麼不使用這些字符,關鍵字也可以進行攻擊。
3、避免使用簡單確認:一些輸入確認使用黑名單,易造成過濾不徹底情況。
4、使用SQL註釋:註釋用/*和*/。如果應用程序組織或者刪除輸入中的空格,可以使用註釋“冒充”注入數據中的空白符。有的註釋可以隔斷關鍵字。
5、利用有缺陷的過濾:輸入確認機制通常包含邏輯缺陷,可對這些缺陷加以利用,是被阻止的輸入避開過濾。
9.2.9 二階SQL注入
爲了修改密碼,查詢舊密碼
9.2.10 高級利用
1、攻擊者即使遇到SQL注入漏洞,但也無法直接獲取注入的查詢的結果,以下爲討論這種問題出現的情況。
2、獲取數字數據:如果包含單引號的輸入得到正常處理,則就不存在SQL注入。
3、使用帶外通道
1、許多SQL注入攻擊中,瀏覽器不返回攻擊過程中的信息,攻擊者很難加以利用。
4、使用推論:條件式響應
造成帶外通道不可用的原因很多,很可能是因爲數據庫處在一個受保護的網絡中,邊界防火牆禁止任何與因特網或其他網絡的帶外連接,只能通過Web應用程序注入點訪問數據庫。
9.2.11 SQL注入之外:擴大數據庫攻擊範圍
1、成功利用一個SQL注入漏洞可完全控制應用程序所有數據,然而許多原因表明,利用數據庫漏洞後者控制它的一些內置功能,從而進一步實施攻擊,可能會取得更大的成效。
2、MS-SQL:被攻擊者濫用的功能是xp_cmdshell存儲過程,他是內置的一項功能。這個存儲過程允許數據庫管理員以和cmd.exe命令符相同的方式執行操作系統。
3、MySQL包含的可被攻擊者濫用的內置功能較少,其中一個實例是任何擁有FILE_PRIV許可的用戶都可以讀取並寫入文件系統。
9.2.12 使用SQL注入工具
1、多數工具通過以下方法來利用SQL注入漏洞:
①參數蠻力攻擊
②附加各種字符
③蠻力參測請求列數
④注入定製查詢來檢索任意數據
⑤若無法適用UNION檢索結果,可在查詢中注入布爾類型條件(AND 1=1等)
⑥條件時間延遲檢索數據
9.2.13 SQL語法與錯誤參考
1、主要介紹一些SQL語法和錯誤代碼,不再列出。
9.2.14 防止SQL注入
1、部分有效的防禦措施
將用戶輸入的單引號配對轉義,但以下兩種情況無效:
1)提交的數字數據內置在SQL查詢中,這種數據通常不包含在單引號內。
2)
2、參數化查詢,以下是兩個步驟
①應用程序指定查詢結構,爲用戶輸入的每個數據項預留佔位符
②應用程序指定每個佔位符的內容。
3、深層防禦:此是提供額外的保護,防止前端防禦由於任何原因失效。
9.3 注入NoSQL
不瞭解,有興趣的童鞋,自己看。
9.4 注入XPath
1、基於導航XML文檔並從中獲取數據的解釋型語言。
9.4.1 破壞應用程序邏輯
1、Xpath與SQL區別:注入數字時都不需要單引號,但Xpath關鍵字和元素名都區分大小寫。
9.4.2 謹慎XPath注入
1、攻擊者可利用此漏洞從目標XML文檔中獲取任意信息。方式和上述SQL輸入類似。
9.4.3 盲目XPath注入
1、即使不知道數據結構信息,也可以通過盲注來一個個試探。
9.4.4 查找XPath注入漏洞
9.4.5 防止XPath注入
9.5 注入LDAP
1、LDAP(輕量級目錄訪問協議)用於訪問網絡中的目錄服務,
2、最常用的搜索過濾器:
①簡單匹配條件
②析取查詢
③合取查詢
9.5.1 利用LDAP注入
1、析取查詢:以允許用戶查看指定業務部門的僱員的應用程序爲例,其搜索結果僅限於用戶獲得授權可以查看的地理區域。
2、合取查詢:應用程序允許用戶按姓名在授權查看的地理區域內搜索僱員。
9.5.2 查找LDAP注入漏洞
9.5.3 防止LDAP注入
9.6 小結
1、我們已經分析了用於注入Web應用程序數據存儲的漏洞,攻擊者可利用這些漏洞更改應用程序數據、執行其他未授權操作、破壞應用程序邏輯等。下一章將介紹這類攻擊及其它攻擊。
9.7 問題
1、如果要通過實施UNION攻擊、利用SQL注入漏洞獲取數據,但是並不知道最初的查詢返回的列數,如何才能查明這個值?
答:可以通過兩個簡單的方法確定列數。其一,可以SELECT每個列中的類型中性值NULL,並逐漸遞增列數,直到應用程序返回數據,表明指定了正確的列數,例如:
' UNION SELECT NULL--
' UNION SELECT NULL, NULL--
' UNION SELECT NULL, NULL, NULL--
請注意,在Oracle上,需要在上述每種情況的最後一個NULL後添加FROM DUAL。
另外,可以注入ORDER BY子句並遞增指定列,直到引發錯誤,表明請求了無效的列:
' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
2、已經確定一個字符串參數中的SQL注入漏洞,已經確信數據庫爲MS-SQL或Oracle,但當前無法獲得任何數據或錯誤消息確定到底是哪個數據庫。如何才能查明這一點?
答:一種確認數據庫類型的簡單方法,是使用數據庫特定的字符串串聯語法在所控制的查詢中構建某個良性輸入。例如,如果原始參數值爲London,則可以輪流提交以下數據項:
'||' London
'+'London
如果第一個數據項導致和原始參數值相同的行爲,說明數據庫可能爲Oracle。如果第二個數據項導致和原始參數值相同的行爲,說明數據庫可能爲MS-SQL。
3、已經在應用程序的許多位置提交了一個單引號,並通過得到的錯誤消息確定幾個潛在的SQL注入漏洞。下列哪一種方法能夠以最快的速度確定專門設計的輸入是否會對應用程序的處理過程造成影響?
(a) 註冊一個新用戶
(b) 更新個人資料
(c) 註銷服務
答:雖然看似違背常理,但用戶註冊功能可能是最安全的。註冊功能通常使用INSERT語句,如果修改這些語句,並不會影響到其他記錄。用於更新個人資料的功能可能使用條件性UPDATE語句,如果注入' or 1=1--之類的有效載荷,可能會導致數據表中的所有記錄遭到修改。同樣,註銷功能可能使用條件性DELETE語句,如果操作不當,也可能影響到其他用戶。
也就是,我們不可能提前確定某個功能會執行哪些語句;在執行測試之前,應嚮應用程序所有者警告可能導致的風險。
4、在登錄功能中發現了一個SQL注入漏洞,並嘗試使用輸入' or 1=1--來避開登錄,但攻擊沒有成功,生成的錯誤消息表明--字符串被應用程序的輸入過濾刪除。如何解決這個問題?
答:有一種簡單的方法可以達到相同的效果,即使用輸入' or 'a'='a,而無需使用註釋符號。
5、已經發現了一個SQL注入漏洞,但由於應用程序允許任何包含空白符的輸入,因而無法實施任何有效的攻擊。如何解除這種限制?
答:可以使用SQL註釋字符分隔注入的有效載荷中的關鍵字和其他項目。例如:
'UNIONSELECTusername,passwordFROMusers--
6、在將其合併到SQL查詢之前,應用程序並不配對用戶輸入中出現的所有單引號。假設已經在一個數字字段中發現了一個SQL注入漏洞,但需要在攻擊有效載荷中使用一個字符串值。不使用單引號,如何在查詢中插入字符串?
答:可以使用CHAR命令通過ASCII數字字符代碼返回字符串。例如,在Oracle上,字符串FOO可以表示爲:
CHAR(70)||CHAR(79)||CHAR(79)
7、在極少數情況下,應用程序在用戶提交的輸入中使用參數化查詢,以不安全的方式建立動態SQL查詢。什麼時候會出現這種情況?
答:在將用戶提交的輸入置入查詢的其他元素(如表和列名稱),而非查詢參數中時,將會出現這種情況。參數化查詢無法使用這些項目的佔位符進行預編譯,因此需要採用不同的解決方案(可能需要基於嚴格的輸入確認)。
8、假設已經提升了在應用程序中的權限,現在完全擁有管理員訪問權限,這時如果在某個用戶管理功能中發現了一個SQL注入漏洞,如何利用這個漏洞進一步擴大攻擊範圍?
答:因爲已經具有管理員訪問權限,因此可以使用應用程序本身檢索所需的任何數據,也就是說,不必通過SQL注入攻擊來獲取應用程序本身的數據。但是,仍然可以利用這種攻擊來訪問任何與保存在同一數據庫中的其他應用程序有關的數據,或者提升自己在數據庫或基礎操作系統中的權限,或者攻破數據庫服務並將攻擊範圍擴大到更廣泛的內部網絡。
9、在攻擊一個並未保存任何敏感數據、也未實施任何身份驗證或訪問控制機制的應用程序的情況下,如何排列下列漏洞的重要性?
(a) SQL注入
(b) XPath注入
(c) OS命令注入
答:XPath注入僅可用於從目標XML文件中檢索數據。因此,如果應用程序不包含任何敏感數據,則這種漏洞並不會導致嚴重的後果。同樣,利用SQL注入漏洞並不能從數據庫中提取任何敏感數據。但是,有時可以利用這類攻擊提升在數據庫中的權限,並以其他方式實施攻擊。
在某些情況下,SQL注入漏洞可能是一個更加嚴重的漏洞。另一方面,OS命令注入則始終是一個高風險的漏洞,因爲攻擊者可以利用它直接攻破基礎服務器,並可將其作爲針對內部系統的其他攻擊的起點。
10、假如正在檢測一個允許搜索個人資料的應用程序功能,並且懷疑該功能正訪問某數據庫或Active Directory後端。如何確定到底是哪一種情況?
答:如果該功能正訪問數據庫,則提交SQL通配符%作爲搜索查詢可能會返回大量記錄。同樣,如果該功能正訪問Active Directory,則提交通配符*作爲搜索查詢可能會返回大量記錄。在其他系統中,這兩個通配符都不會造成相同的效果。