《白帽子講 Web 安全》之開發語言安全深度解讀

目錄

引言

1.PHP 安全

1.1變量覆蓋

1.2空字節問題

1.3弱類型

1.4反序列化

1.5安全配置

2Java 安全

2.1Security Manager

2.2反射

2.3反序列化

3Python 安全

3.1反序列化

3.2代碼保護

4.JavaScript 安全

4.1第三方 JavaScript 資源

4.2JavaScript 框架

5.Node.js 安全

小結


引言

在 Web 應用開發的廣袤天地里,開發語言宛如構建大廈的基石,其安全性直接關乎整個應用的安危。吳翰清在《白帽子講 Web 安全》中對開發語言安全的剖析,猶如一盞明燈,照亮了我們探索語言安全風險與防護的道路。接下來,讓我們一同深入解讀這一關鍵章節。

1.PHP 安全

1.1變量覆蓋

在早期的 PHP 開發環境中,若配置文件中register_globals設置為On,這就如同敞開了一扇危險的大門。此時,外部的 POST 或 GET 請求參數能夠直接注冊為全局變量,完全處于外部可控狀態。

例如,假設在一個用戶權限驗證的 PHP 腳本中,存在一個未初始化的關鍵變量$admin,正常情況下它應該在特定邏輯中被賦值為true或false來判斷用戶是否為管理員。但由于register_globals = On,攻擊者可以通過構造一個惡意的 GET 請求,如Example Domain,直接篡改$admin變量的值,從而實現非預期的執行邏輯,甚至可能導致越權訪問,獲取管理員權限。從安全角度出發,現代 PHP 開發早已摒棄了這種危險的配置方式,建議始終將register_globals設置為Off。

1.2空字節問題

PHP 在執行文件操作時,會調用底層的 C 語言庫。C 語言的字符串以空字節(\0)作為結束標志,然而 PHP 的字符串結構與之不同。當 PHP 字符串中出現空字節時,就會引發嚴重問題。

例如,假設存在一個文件上傳功能,代碼意圖將用戶上傳的文件保存到uploads/目錄下,文件名由用戶輸入并拼接在路徑后。如果攻擊者在文件名中插入空字節,如test.php\0.jpg,PHP 底層調用 C 語言庫進行文件操作時,獲取的字符串會在空字節處截斷。原本應該保存uploads/test.php\0.jpg的文件,實際可能被保存為uploads/test.php,這就導致攻擊者可以繞過文件類型檢查,上傳惡意的 PHP 文件,進而獲取服務器權限。值得慶幸的是,PHP 5.3 版本修復了這一漏洞,極大地提升了文件操作的安全性。

1.3弱類型

PHP 的一大特點是定義變量時無需顯式指定類型,變量的值可以在運行過程中自由改變類型。在進行變量相等判斷時,PHP 提供了嚴格比較(===)和松散比較(==)兩種方式。松散比較在某些情況下會產生意想不到的結果。例如:

$a = "1";$b = 1;var_dump($a == $b); // truevar_dump($a === $b); // false

在這個例子中,$a是字符串類型,$b是整型,但在松散比較時,PHP 會自動進行類型轉換,導致兩者被判斷為相等。在安全敏感的場景中,如密碼驗證,若使用松散比較,可能會讓攻擊者有機可乘。因此,為了確保代碼的安全性,在 PHP 開發中應盡量明確變量類型,并優先使用嚴格比較。

1.4反序列化

在 PHP 開發中,對象序列化存儲是一種常見的操作,它將對象轉換為可存儲或傳輸的格式。然而,如果對不可信數據進行反序列化,就如同打開了一個潘多拉魔盒。攻擊者可以精心構造惡意對象,利用對象的魔術方法在特定時機自動調用的特性,執行任意命令。例如,假設存在一個包含用戶信息的類User,其中定義了一個__destruct魔術方法用于清理資源:

class User {public $name;public $email;public function __destruct() {// 假設這里執行一些文件操作file_put_contents('log.txt', "User $this->name logged out\n");}}

攻擊者可以構造一個惡意的序列化字符串,通過反序列化操作,在__destruct方法中注入惡意代碼,如修改系統文件或執行任意命令。為了防范這種風險,應避免對不可信數據進行反序列化操作,或者在反序列化前對數據進行嚴格的校驗。

1.5安全配置

在過去的 PHP 版本中,安全模式是一種重要的安全防護機制。它可以對文件操作、變量操作等行為進行限制,例如限制 PHP 腳本只能訪問特定目錄下的文件,防止惡意腳本對系統文件進行非法讀寫。

然而,從 PHP 5.4 版本開始,安全模式不再被建議依賴。此外,PHP 還有一些其他重要的安全配置選項,如allow_url_include,若設置為On,PHP 腳本可以包含遠程 URL 的文件,這可能導致遠程代碼執行風險,因此建議設置為Offdisable_functions可以禁用一些危險的函數,如eval、system等,防止攻擊者利用這些函數執行惡意代碼;LD_PRELOAD用于指定動態鏈接庫的加載順序,不當使用可能被攻擊者利用來注入惡意代碼;magic_quotes_gpc曾經用于自動轉義用戶輸入數據中的特殊字符,防止 SQL 注入等攻擊,但由于存在一些問題,已被移除。在現代 PHP 開發中,開發者需要根據項目需求和安全最佳實踐,合理配置這些選項,以提升應用的安全性。

2Java 安全

2.1Security Manager

Java 的 Security Manager 是一個強大的安全策略定義工具,尤其在運行不可信代碼時,啟用 Security Manager 顯得尤為重要。啟用方式有兩種,一種是通過指定策略文件,在啟動 Java 應用時使用-Djava.security.policy參數指定策略文件路徑,策略文件中詳細定義了哪些操作是允許的,哪些是禁止的。例如:

grant {permission java.io.FilePermission "/tmp/*", "read,write";};

上述策略表示允許應用對/tmp/目錄下的文件進行讀寫操作。

另一種啟用方式是在代碼中直接調用System.setSecurityManager(new SecurityManager());。當應用執行的操作不符合策略定義時,就會拋出異常。不過,需要注意的是,從 Java 17 開始,Security Manager 的標準資源被移除,在未來的版本中可能會被完全刪除,這也促使開發者尋找其他更可靠的安全防護機制。

2.2反射

Java 的反射機制賦予了開發者在運行時動態獲取類的屬性和方法,并調用對象屬性和方法的強大能力。例如:

Class<?> clazz = Class.forName("com.example.MyClass");Object obj = clazz.newInstance();Method method = clazz.getMethod("myMethod", String.class);method.invoke(obj, "Hello");

然而,這種靈活性也帶來了安全隱患。攻擊者可以利用反射機制,在反序列化過程中,繞過正常的訪問控制,調用一些敏感的方法或修改關鍵的屬性。許多 Java 反序列化漏洞很大程度上依賴于反射特性,攻擊者通過構造惡意的序列化數據,利用反射執行任意代碼,獲取系統權限。

2.3反序列化

在 Java 應用中,對象的序列化和反序列化操作廣泛應用于對象的傳輸和存儲。需要序列化的對象必須實現Serializable接口。在反序列化過程中,如果在Classpath中找不到對應的類,會拋出異常。但攻擊者可以利用這一機制,構造惡意對象,利用反序列化執行任意命令。以 Apache Commons Collections 庫中的 Transformer 接口相關漏洞為例,攻擊者可以通過精心構造的序列化數據,利用 Transformer 接口的特性,在反序列化時執行惡意代碼,如創建遠程連接、讀取敏感文件等。為了防范 Java 反序列化漏洞,開發者需要謹慎處理外部輸入的序列化數據,避免對不可信數據進行反序列化操作,同時及時更新相關庫的版本,修復已知的漏洞。

3Python 安全

3.1反序列化

Python 自帶的pickle序列化庫在處理對象序列化時非常方便,但也存在安全隱患。在pickle反序列化過程中,__reduce__方法可能會自動調用,攻擊者可以利用這一特性構造惡意對象,執行任意命令。例如:

import pickleimport osclass MaliciousObject:def __reduce__(self):return (os.system, ('rm -rf /',))malicious_obj = MaliciousObject()serialized_data = pickle.dumps(malicious_obj)

如果將上述序列化數據進行反序列化操作,就會執行rm -rf /命令,刪除系統中的所有文件。為了防御反序列化漏洞,開發者可以采取多種措施。首先,盡量選擇高版本的pickle庫,因為高版本通常修復了一些已知的安全問題。其次,可以定義過濾器,對反序列化的數據進行嚴格篩選,只允許反序列化安全的對象。還可以重寫過濾方法,在反序列化前對數據進行全面檢查。另外,對序列化數據進行簽名校驗也是一種有效的手段,確保數據在傳輸過程中未被篡改。

3.2代碼保護

Python 作為一種解釋型語言,在運行過程中有一個編譯階段,源代碼會被編譯成字節碼并存儲在.pyc文件中。然而,.pyc文件并不具備保密性,任何人都可以輕松獲取并反編譯,無法有效保護源代碼。這對于一些商業應用或涉及敏感業務邏輯的項目來說,是一個需要關注的問題。為了在一定程度上保護 Python 代碼,可以使用混淆工具對代碼進行混淆處理,使反編譯后的代碼難以理解和修改。但需要注意的是,這種保護方式并非絕對安全,只是增加了攻擊者反編譯和篡改代碼的難度。

4.JavaScript 安全

4.1第三方 JavaScript 資源

在現代 Web 應用中,加載第三方 JavaScript 資源是一種常見的做法,比如用于廣告投放、社交分享等功能。然而,使用第三方資源也伴隨著諸多安全風險。第三方 JavaScript 代碼可能存在安全漏洞,一旦被攻擊者利用,就可能導致用戶隱私泄露,如獲取用戶的瀏覽歷史、地理位置等信息。攻擊者還可能在第三方 JavaScript 代碼中植入惡意攻擊代碼,當用戶訪問頁面時,惡意代碼被執行,對用戶的設備或網絡造成損害。為了避免這些影響,開發者可以盡量避免使用不可信的第三方 JavaScript 資源。如果必須使用,可以通過校驗資源完整性的方式,確保資源在傳輸過程中未被篡改。例如,使用Subresource Integrity(SRI)技術,在 HTML 中引入 JavaScript 資源時,添加integrity屬性,驗證資源的哈希值:

<script src="https://example.com/script.js" 
integrity="sha384-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"></script>

此外,使用沙箱iframe隔離第三方 JavaScript 資源也是一種有效的防護手段,將第三方代碼限制在一個獨立的環境中運行,減少對主頁面的影響。

4.2JavaScript 框架

隨著 Web 應用交互的日益復雜,JavaScript 框架在開發中得到了廣泛應用。然而,不安全的框架使用可能會引入安全漏洞。以 jQuery 及其插件為例,曾經存在多個安全漏洞,如跨站腳本攻擊(XSS)漏洞、代碼注入漏洞等。這些漏洞可能導致攻擊者在用戶瀏覽器中執行惡意腳本,竊取用戶信息或進行其他惡意操作。開發者在使用 JavaScript 框架時,需要密切關注框架的官方發布信息,及時更新到最新版本,以修復已知的安全漏洞。同時,Web 漏洞掃描器也可以對前端組件進行漏洞檢測,幫助開發者及時發現并解決潛在的安全問題。

5.Node.js 安全

Node.js 作為一種流行的 Web 服務端開發語言,其應用也可能存在各種安全漏洞。例如,eval函數在 Node.js 中可以執行字符串形式的 JavaScript 代碼,如果使用不當,攻擊者可以通過注入惡意代碼,利用eval函數執行任意命令,獲取服務器權限。在使用第三方模塊時,Node.js 的開發者需要格外小心。第三方模塊可以發布到 npm 倉庫,由于 npm 倉庫中的模塊數量眾多,質量和安全性參差不齊,有些模塊可能存在安全漏洞,甚至包含惡意代碼。開發者在使用第三方模塊前,應仔細審查模塊的來源和口碑,盡量選擇知名、可靠的模塊,并及時更新模塊版本,以降低安全風險。

小結

不同的開發語言都有其獨特的安全屬性和特性,在 Web 安全領域,雖然很多安全做法逐漸趨于標準化,但每種語言的安全風險和防護重點依然存在差異。隨著技術的不斷發展,開發語言也在持續演進,像 PHP、Java 等語言在發展過程中,對一些不安全的特性或做法進行了調整和改進。開發者需要緊跟語言的發展趨勢,深入了解所使用語言的安全特性和潛在風險,遵循安全最佳實踐,采取有效的防護措施,確保 Web 應用的安全性。只有這樣,才能在不斷變化的 Web 安全環境中,為用戶提供安全可靠的應用服務。

喜歡就點點贊和評論關注一起進步咯

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72921.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72921.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙HarmonyOS NEXT應用崩潰分析及修復

鴻蒙HarmonyOS NEXT應用崩潰分析及修復 如何保證應用的健壯性&#xff0c;其中一個指標就是看崩潰率&#xff0c;如何降低崩潰率&#xff0c;就需要知道存在哪些崩潰&#xff0c;然后對癥下藥&#xff0c;解決崩潰。那么鴻蒙應用中存在哪些崩潰類型呢&#xff1f;又改如何解決…

分析K8S中Node狀態為`NotReady`問題

在Kubernetes&#xff08;k8s&#xff09;集群中&#xff0c;Node狀態為NotReady通常意味著節點上存在某些問題&#xff0c;下面為你分析正常情況下節點應運行的容器以及解決NotReady狀態的方法。 正常情況下Node節點應運行的容器 1. kubelet kubelet是節點上的核心組件&…

第六屆機電一體化技術與智能制造國際學術會議(ICMTIM 2025)

重要信息 4月11-13日 南京江北新區工業大學亞朵酒店 www.icmtim.org&#xff08;點擊了解參會投稿等&#xff09; 簡介 由南京工業大學主辦&#xff0c;南京工業大學電氣工程與控制科學學院、中國礦業大學、黑龍江大學、江蘇省自動化學會承辦的第六屆機電一體化技術…

INT202 Complexity of Algroithms 算法的復雜度 Pt.2 Search Algorithm 搜索算法

文章目錄 1.樹的數據結構1.1 有序數據(Ordered Data)1.1.1 有序字典&#xff08;Ordered Dictonary&#xff09;1.1.1.1 排序表&#xff08;Sorted Tables&#xff09; 1.2 二分查找&#xff08;Binary Search&#xff09;1.2.1 二分查找的時間復雜度 1.3 二叉搜索樹&#xff0…

【AVRCP】藍牙鏈路控制器(LC)與AVRCP互操作性要求深度解析

目錄 一 、Link Controller&#xff08;LC&#xff09;概述 1.1 LC的定義與功能 1.2 LC在藍牙技術中的重要性 二、Link Controller&#xff08;LC&#xff09;互操作性要求 2.1 互操作性要求概述 2.2 物理層互操作性要求 2.3 鏈路管理互操作性要求 2.4 其他互操作性要求…

高級背景摳圖工具(python)

這是一個專業的圖像背景處理工具,基于Python開發,主要功能包括:1. 智能背景去除 - 使用rembg庫的深度學習模型自動識別并移除圖片背景。 2. 背景自定義 - 支持純色背景替換,保留透明通道(Alpha通道)。3. 高級參數調節 - 提供5種專業級圖像處理參數。4. 實時預覽 - 雙窗口…

如何設計外貿郵件開發信主題

開發信是打開客戶大門的第一步&#xff0c;而郵件主題則是決定客戶是否打開郵件的關鍵。一個吸引人的主題不僅能提高打開率&#xff0c;還能為后續溝通打下良好基礎。 一、突出價值和利益 郵件主題要直接傳達收件人能從中獲得的價值和利益&#xff0c;引起他們的興趣和關注。…

wordpress表單插件CF7調用方式

Contact Form 7(CF7)是WordPress中非常流行的表單插件&#xff0c;以下是其常見的調用方式&#xff1a; 通過短代碼調用 在頁面或文章編輯器中添加&#xff1a;完成表單設置后&#xff0c;復制表單對應的短代碼&#xff0c;然后在需要顯示表單的頁面或文章的編輯器中直接粘貼…

快速入手-基于Django的主子表間操作mysql(五)

1、如果該表中存在外鍵&#xff0c;結合實際業務情況&#xff0c;那可以這么寫&#xff1a; 2、針對特殊的字典類型&#xff0c;可以這么定義 3、獲取元組中的字典值和子表中的value值方法 4、對應的前端頁面寫法

網絡運維學習筆記(DeepSeek優化版) 021 HCIA-Datacom新增知識點03園區網典型組網架構及案例實戰

文章目錄 園區網典型組網架構及案例實戰1 園區網定義2 園區網絡典型架構3 各層級協議與技術4 項目生命周期管理5 小型園區網絡設計框架5.1 組網方案設計5.2 IP地址規劃5.3 園區內部的路由設計5.4 NAT設計5.5 WLAN設計5.6 安全設計5.7 運維管理設計 6 小型園區的實施方案與運維手…

1.8 函數的連續性和間斷點

1.連續的定義 2.間斷點的定義 3.間斷點的分類

基于Arm GNU Toolchain編譯生成的.elf轉hex/bin文件格式方法

基于Arm GNU Toolchain編譯生成的.elf轉hex/bin文件格式方法 已經棄用的版本&#xff08;Version 10.3-2021.10&#xff09;&#xff1a;gcc-arm-none-eabi&#xff1a;https://developer.arm.com/downloads/-/gnu-rmArm GNU Toolchain當前版本&#xff1a;https://developer.a…

希爾排序中的Hibbard序列

一 定義 Hibbard序列的每個元素由以下公式生成: h_k = 2^k - 1 其中k從1開始遞增,序列為:1, 3, 7, 15, 31, 63, … 二 生成方式 起始條件:k=1,對應h_1=2^1-1=1 遞推公式:每次k增加1,計算 h_{k+1}=2^{k+1}-1 示例:前5項…

失敗的面試經歷(??∧??)

一.面向對象的三大特性 1.封裝&#xff1a;將對象內部的屬性私有化&#xff0c;外部對象不能夠直接訪問&#xff0c;但是可以提供一些可以使外部對象操作內部屬性的方法。 2.繼承&#xff1a;類與類之間會有一些相似之處&#xff0c;但也會有一些異處&#xff0c;使得他們與眾…

算法及數據結構系列 - 二分查找

系列文章目錄 算法及數據結構系列 - BFS算法 文章目錄 二分查找框架思路經典題型二分查找尋找左側邊界尋找右側邊界 刷題875. 愛吃香蕉的珂珂1011. 在 D 天內送達包裹的能力392. 判斷子序列 二分查找 框架思路 int binarySearch(int[] nums, int target) {int left 0, righ…

SpringBoot的啟動原理?

大家好&#xff0c;我是鋒哥。今天分享關于【SpringBoot的啟動原理&#xff1f;】面試題。希望對大家有幫助&#xff1b; SpringBoot的啟動原理&#xff1f; 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 Spring Boot的啟動原理主要是通過 SpringApplication 類來…

代碼隨想錄第55期訓練營第八天|LeetCode344.反轉字符串、541.反轉字符串II、卡碼網:54.替換數字

前言 這是我參加的第二次訓練營&#xff01;&#xff01;&#xff01;爽&#xff01;這次我將更加細致的寫清每一道難題&#xff0c;不僅是提升自己&#xff0c;也希望我自己的寫的文章對讀者有一定的幫助&#xff01; 打卡代碼隨想錄算法訓練營第55期第八天&#xff08;づ&a…

Json的應用實例——cad 二次開發c#

以下是一個使用AutoCAD C#.NET API實現你需求的示例代碼&#xff0c;代碼實現了提示用戶選擇一個實體&#xff0c;將一些字符串變量及其對應的值組成JSON格式數據存儲到實體的擴展數據&#xff08;XData&#xff09;中&#xff0c;并在彈出窗口中顯示該實體的所有擴展數據信息。…

Springboot的jak安裝與配置教程

目錄 Windows系統 macOS系統 Linux系統 Windows系統 下載JDK&#xff1a; 訪問Oracle官網或其他JDK提供商網站&#xff0c;下載適合Windows系統的JDK版本。網站地址&#xff1a;Oracle 甲骨文中國 | 云應用和云平臺點擊進入下滑&#xff0c;點擊進入下載根據自己的系統選擇&…

Python與區塊鏈隱私保護技術:如何在去中心化世界中保障數據安全

Python與區塊鏈隱私保護技術:如何在去中心化世界中保障數據安全 在區塊鏈世界里,透明性和不可篡改性是兩大核心優勢,但這也帶來了一個悖論——如何在公開賬本的同時保障用戶隱私?如果你的交易記錄對所有人可見,如何防止敏感信息泄露? Python 作為區塊鏈開發中最受歡迎的…