實現模塊注入的方法有以下幾種:
使用CreateRemoteThread和LoadLibrary注入:即跨進程創建線程。注入程序先把DLL文件路徑寫入目標進程,再獲取裝載DLL的LoadLibray函數地址,最后調用CreateRemoteThread在目標進程中建立以LoadLibrary函數地址為線程函數地址、以DLL文件名為參數的遠程線程。CreateRemoteThread調用內核函數NtCreateThread建立線程,而NtCreateThread函數的執行引起LoadLibrary的函數調用,用于加載進程用到的動態鏈接庫NoJ。
使用APC注入:APC異步過程調用機制是Windows系統的一種“軟件中斷”機制。在進程中每個線程都有自己的APC隊列,系統調用可以把一個“用戶APC請求”掛入目標線程的APC隊列,當線程從“軟件中斷”中恢復前,會對“用戶APC請求”進行處理。注入程序也先把DLL文件路徑寫入目標進程,再將QueueUserAPC函數通過調用LoadLibrary插入DLL到目標線程的APC隊列中。APC機制借用目標進程中的線程執行RootKit代碼,因而避免了跨進程創建線程的常規方案,從而能有效的逃避針對跨進程創建線程的可疑行為的檢測。且該技術未對內核對象等系統敏感信息進行修改,因而更具隱蔽性。
使用系統鉤子注入:鉤子是Windows消息處理機制的一部分。根據鉤子函數所在的位置分為系統鉤子和線程鉤子。系統鉤子要把鉤子函數插入到其他進程的地址空間,需要將鉤子函數代碼寫在模塊DLL中,系統鉤子可以監視整個系統內的鉤子消息。注入程序通過SotWindowsHookEx函數設置系統鉤子。當一個應用接收到某個消息時,Windows系統首先檢查該消息類型的鉤子是否存在,如果在則檢查相應的鉤子函數模塊是否存在于當前進程的地址空間中,如不在則系統會調用LoadLibrary加載鉤子函數模塊。
使用注冊表注入:在Windows NT/2000/2003操作系統中,Applnit.DLLs位于注冊表中的HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\目錄下,表示當某個進程加載User32.d11時,鍵值列出的所有DLL都將調用LoadLibrary函數加載到該進程空間中。AppInit.DLLs本質上是一種系統全局性的掛鉤,攻擊者只要把DLL添加到該鍵值下就實現了模塊注入。
預防SQL注入的措施有以下這些:
嚴格區分用戶權限:在權限設計中,針對軟件用戶,沒有必要給予數據庫的創建、刪除等管理權限。這樣即便在用戶輸入的SQL語句種含有內嵌式的惡意程序,因為其權限的限定,也不可能執行。所以程序在權限設計時,最好把管理員與用戶區別起來。這樣能夠最大限度的降低注入式攻擊對數據庫產生的損害。
強制參數化語句:在設計數據庫時,如果用戶輸入的數據并不直接內嵌到SQL語句中,而通過參數來進行傳輸的話,那麼就可以合理的預防SQL注入式攻擊。運用這種方法能夠避免絕大多數的SQL注入攻擊。遺憾的是,如今適用參數化語句的數據庫引擎并不多,但是數據庫工程師在開發時要盡可能選用參數化設計語句。
檢驗用戶輸入的信息:在SQL Server數據庫中,有比較多的輸入內容檢驗工具,能夠協助管理人員來應對SQL注入式攻擊。
回答所涉及的環境:聯想天逸510S、Windows 10。
實現模塊注入的方法有以下幾種:
使用CreateRemoteThread和LoadLibrary注入:即跨進程創建線程。注入程序先把DLL文件路徑寫入目標進程,再獲取裝載DLL的LoadLibray函數地址,最后調用CreateRemoteThread在目標進程中建立以LoadLibrary函數地址為線程函數地址、以DLL文件名為參數的遠程線程。CreateRemoteThread調用內核函數NtCreateThread建立線程,而NtCreateThread函數的執行引起LoadLibrary的函數調用,用于加載進程用到的動態鏈接庫NoJ。
使用APC注入:APC異步過程調用機制是Windows系統的一種“軟件中斷”機制。在進程中每個線程都有自己的APC隊列,系統調用可以把一個“用戶APC請求”掛入目標線程的APC隊列,當線程從“軟件中斷”中恢復前,會對“用戶APC請求”進行處理。注入程序也先把DLL文件路徑寫入目標進程,再將QueueUserAPC函數通過調用LoadLibrary插入DLL到目標線程的APC隊列中。APC機制借用目標進程中的線程執行RootKit代碼,因而避免了跨進程創建線程的常規方案,從而能有效的逃避針對跨進程創建線程的可疑行為的檢測。且該技術未對內核對象等系統敏感信息進行修改,因而更具隱蔽性。
使用系統鉤子注入:鉤子是Windows消息處理機制的一部分。根據鉤子函數所在的位置分為系統鉤子和線程鉤子。系統鉤子要把鉤子函數插入到其他進程的地址空間,需要將鉤子函數代碼寫在模塊DLL中,系統鉤子可以監視整個系統內的鉤子消息。注入程序通過SotWindowsHookEx函數設置系統鉤子。當一個應用接收到某個消息時,Windows系統首先檢查該消息類型的鉤子是否存在,如果在則檢查相應的鉤子函數模塊是否存在于當前進程的地址空間中,如不在則系統會調用LoadLibrary加載鉤子函數模塊。
使用注冊表注入:在Windows NT/2000/2003操作系統中,Applnit.DLLs位于注冊表中的HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\目錄下,表示當某個進程加載User32.d11時,鍵值列出的所有DLL都將調用LoadLibrary函數加載到該進程空間中。AppInit.DLLs本質上是一種系統全局性的掛鉤,攻擊者只要把DLL添加到該鍵值下就實現了模塊注入。
預防SQL注入的措施有以下這些:
嚴格區分用戶權限:在權限設計中,針對軟件用戶,沒有必要給予數據庫的創建、刪除等管理權限。這樣即便在用戶輸入的SQL語句種含有內嵌式的惡意程序,因為其權限的限定,也不可能執行。所以程序在權限設計時,最好把管理員與用戶區別起來。這樣能夠最大限度的降低注入式攻擊對數據庫產生的損害。
強制參數化語句:在設計數據庫時,如果用戶輸入的數據并不直接內嵌到SQL語句中,而通過參數來進行傳輸的話,那麼就可以合理的預防SQL注入式攻擊。運用這種方法能夠避免絕大多數的SQL注入攻擊。遺憾的是,如今適用參數化語句的數據庫引擎并不多,但是數據庫工程師在開發時要盡可能選用參數化設計語句。
檢驗用戶輸入的信息:在SQL Server數據庫中,有比較多的輸入內容檢驗工具,能夠協助管理人員來應對SQL注入式攻擊。
回答所涉及的環境:聯想天逸510S、Windows 10。