第29天:PHP應用弱類型脆弱Hash加密Bool類型Array數組函數轉換比較

#知識點:

1、安全開發-原生PHP-弱類型脆弱

2、安全開發-原生PHP-函數&數據類型

3、安全開發-原生PHP-代碼審計案例

1=====

兩個等號==是弱比較,使用==進行對比的時候,php解析器就會做隱式類型轉換,如果兩個值的類型不相等就會把兩個值的類型轉為同一類型進行對比。

==:弱比較運算符,進行比較時,PHP會嘗試將兩個值的類型進行隱式轉換為相同的類型。

===:強比較運算符,要求類型和值都相等,不進行任何隱式轉換。

在弱比較下,某些值之間可能因為隱式類型轉換導致不符合預期的結果。例如:

if ("123abc" == 123) {echo "True"; // 輸出 "True",因為 "123abc" 被轉換為數字 123 進行比較
}

建議與修復:

總是優先使用 === 進行比較,避免隱式類型轉換。

如果必須使用弱比較,明確了解隱式轉換規則,并確保輸入類型符合預期。

if ("123abc" === 123) {echo "True"; // 不會輸出任何結果
}

2MD5對比缺陷

進行hash加密出來的字符串如存在0e開頭進行弱比較的話會直接判定為true

QNKCDZO0e830400451993494058024219903391

md5(QNKCDZO,32) = 0e830400451993494058024219903391

2406107080e462097431906509019562988736854

md5(240610708,32) = 0e462097431906509019562988736854

s878926199a0e545993274517709034328855841020

md5(s878926199a,32) = 0e545993274517709034328855841020

MD5 哈希值以 0e 開頭時,PHP 的弱比較會將其解釋為科學計數法的數字 0。例如:

if (md5('QNKCDZO') == md5('240610708')) {echo "True"; // 輸出 "True",因為兩個哈希值都以 `0e` 開頭,被解析為 0
}

安全隱患:這種比較方式會導致哈希碰撞,攻擊者可以利用特定輸入生成以 0e 開頭的 MD5 值,從而繞過驗證。

建議與修復:

不要使用弱比較 (==) 進行哈希值驗證,應使用強比較 (===)。

使用更安全的哈希算法,如 hash_hmac 或 password_hash。

if (md5('QNKCDZO') === md5('240610708')) {echo "True"; // 不會輸出任何結果
}

3 函數strcmp類型比較缺陷

低版本的strcmp比較的是字符串類型,如果強行傳入其他類型參數,會出錯,出錯后返回值0,正是利用這點進行繞過。

在 PHP 的低版本中,strcmp() 函數只能用于比較字符串。如果傳入非字符串參數,會返回 0,因為出錯后 PHP 內部會返回相等的結果。

if (strcmp([], "string") == 0) {echo "True"; // 輸出 "True",因為出錯后返回 0
}

安全隱患:攻擊者可以通過傳入特殊類型的參數(如數組、對象)繞過邏輯判斷。

建議與修復:

確保傳入參數的類型始終是字符串。

使用顯式類型檢查或類型強制轉換:

if (is_string($param1) && is_string($param2) && strcmp($param1, $param2) === 0) {echo "Strings are equal.";
}

4、函數Bool類型比較缺陷

在使用 json_decode() 函數或 unserialize() 函數時,部分結構被解釋成 bool 類型,也會造成缺陷,運行結果超出研發人員的預期

使用 json_decode() 解析 JSON 字符串或 unserialize() 反序列化數據時,如果數據的結構意外被解析為布爾值,可能會引發邏輯錯誤。例如:

$json = 'false';
if (json_decode($json)) {echo "True"; // 不輸出任何結果,但邏輯可能被繞過
}

安全隱患:攻擊者可以構造特定的 JSON 數據或序列化數據,導致解析結果超出預期。

建議與修復:

顯式檢查解析結果的類型和結構:

$data = json_decode($json, true);
if (is_array($data) && isset($data['key'])) {// 進一步邏輯處理
}

5、函數switch 類型比較缺陷

當在switch中使用case判斷數字時,switch會將參數轉換為int類型計算

switch 語句中,PHP 會將 case 參數轉換為整數類型進行比較。如果傳入字符串類型的參數,可能會意外被轉換為數字:

switch ("123abc") {case 123:echo "Matched"; // 輸出 "Matched",因為 "123abc" 被轉換為 123break;
}

安全隱患:攻擊者可以通過構造特定輸入繞過邏輯判斷。

建議與修復:

避免在 switch 中混用不同類型的數據。

使用 === 替代 switch 語句中的隱式比較

$value = "123abc";
if ($value === 123) {echo "Matched";
}

6、函數in_array數組比較缺陷

當使用in_array()array_search()函數時,如果第三個參數沒有設置為true,則in_array()array_search()將使用松散比較來判斷

in_array()array_search() 默認使用弱比較(==)。如果未設置第三個參數為 true,可能會導致意外的比較結果:

$array = ["123", 123];
if (in_array("123abc", $array)) {echo "True"; // 輸出 "True",因為 "123abc" 被轉換為數字 123
}

安全隱患:攻擊者可以構造與數組中已有值相等的不同類型數據,繞過驗證。

建議與修復:

始終設置第三個參數為 true,啟用嚴格比較:

if (in_array("123abc", $array, true)) {echo "True"; // 不會輸出任何結果
}

7===數組比較缺陷

注意此時遇到的是 “===” ,不過也不是代表無從下手。在md5()函數傳入數組時會報錯返回NULL,當變量都導致報錯返回NULL時就能使使得條件成立。

在 PHP 中,md5() 函數不支持數組作為參數,會拋出錯誤并返回 NULL。如果多個變量導致函數返回 NULL,可能使條件成立:

$a = md5([]);
$b = md5([]);
if ($a === $b) {echo "True"; // 輸出 "True",因為兩次調用均返回 NULL
}

安全隱患:攻擊者可以利用此特性通過錯誤處理來繞過邏輯。

建議與修復:

確保函數參數的類型符合預期:

if (is_string($input) && md5($input) === $knownHash) {echo "Valid";
}

使用顯式類型驗證,避免直接比較可能返回錯誤的結果。

案例:

CTF題目:

矛盾 - Bugku CTF平臺

MD5 - Bugku CTF平臺

代碼審CMS:

某Info CMS代碼審計

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

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

相關文章

STM32F1學習——編碼器接口

一、編碼器接口 編碼器接口可以接收正交編碼器的信號,根據編碼器旋轉產生的正交信號脈沖,通過硬件自動控制CNT值的自增或自減,從而指出編碼器的位置、旋轉方向和旋轉速度。 每個高級定時器和通用定時器都有一個編碼器接口,他們會占…

如何刪除 Docker 中的懸虛鏡像?

在 Docker 中,懸虛鏡像(Dangling Images)是指那些沒有 標簽 且沒有被任何容器使用的鏡像。這些鏡像通常是由于構建過程中生成的中間層鏡像或未正確清理的鏡像殘留。刪除懸虛鏡像可以釋放磁盤空間并保持 Docker 環境的整潔。 1. 列出懸虛鏡像…

網絡安全的學習與實踐經驗(附資料合集)

學習資源 在線學習平臺: Hack This Site:提供從初學者到高級難度的挑戰任務,適合練習各種網絡安全技術。XCTF_OJ:由XCTF組委會開發的免費在線網絡安全網站,提供豐富的培訓材料和資源。SecurityTube:提供豐…

ts是什么、tsc是什么、tsx是什么、jsx是什么、scss是什么

一、TS (TypeScript): TypeScript 是一種由微軟開發的開源編程語言,它是 JavaScript 的一個超集,增加了類型系統和對ES6及以后版本新特性的支持。TypeScript 旨在解決 JavaScript 開發中的可維護性、可擴展性和大型項目中的復雜性問題。它允許開發者在編…

行業商機信息付費小程序系統開發方案

行業商機信息付費小程序系統,主要是整合優質行業資源,實時更新的商機信息。在當今信息爆炸的時代,精準、高效地獲取行業商機信息對于企業和個人創業者而言至關重要。 一、使用場景 日常瀏覽:用戶在工作間隙或閑暇時間&#xff0c…

[Qt] 輸入控件 | Line | Text | Combo | Spin | Date | Dial | Slider

目錄 輸入類控件 1、Line Edit 錄入個人信息 使用正則表達式驗證輸入框的數據 驗證兩次輸入的密碼一致 切換顯示密碼 2、Text Edit 獲取多行輸入框的內容 驗證輸入框的各種信號 3、Combo Box 使用下拉框模擬麥當勞點餐 從文件中加載下拉框的選項 4、Spin Box 調整…

Flink CDC 自定義函數處理 SQLServer XML類型數據 映射 doris json字段方案

Flink CDC 自定義函數處理 SQLServer XML類型數據方案 1. 背景 因業務使用SQLServer數據庫,CDC同步到doris 數倉。對于SQLServer xml類型,doris沒有相應的字段對應, 可以使用json來存儲xml數據。需要進行一步轉換。從 flink 自定義函數入手…

C語言:cJSON將struct結構體與JSON互相轉換

文章目錄 struct 轉 jsonjson 轉 struct 文檔&#xff1a; https://github.com/DaveGamble/cJSON 項目結構 . ├── libs │ ├── cJSON.c │ └── cJSON.h └── main.c示例 struct 轉 json #include "libs/cJSON.h" #include <stdio.h>// defi…

JeeSite 快速開發平臺:全能企業級快速開發解決方案|GitCode 光引計劃征文展示

投稿人GitCode ID&#xff1a;thinkgem 光引計劃投稿項目介紹 JeeSite 快速開發平臺&#xff0c;不僅僅是一個后臺開發框架&#xff0c;它是一個企業級快速開發解決方案&#xff0c;后端基于經典組合 Spring Boot、Shiro、MyBatis&#xff0c;前端采用 Beetl、Bootstrap、Admi…

2025/1/4期末復習 密碼學 按老師指點大綱復習

我們都要堅信&#xff0c;道路越是曲折&#xff0c;前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 現代密碼學 第五版 楊波 第一章 引言 1.1三大主動攻擊 1.中斷…

【架構設計(一)】常見的Java架構模式

常見的 Java 架構模式解析 在 Java 開發領域&#xff0c;選擇合適的架構模式對于構建高效、可維護且能滿足業務需求的軟件系統至關重要。本文將深入探討幾種常見的 Java架構模式&#xff0c;包括單體架構與微服務架構、分層架構與微服務架構的對比&#xff0c;以及事件驅動架構…

opencv與halcon的差距及改進方法

本文是直接問ai獲得的結果。 在我理解中&#xff0c;這是開源軟件與商業非開源工業軟件的普遍差距特點。 商業非開源工業軟件的人員、資金、時間投入是巨大的&#xff0c;開發人員也不是普通人普通水平。 一般情況下&#xff0c;試圖通過開源軟件改吧改吧就實現彎道超車&#x…

Java 內存溢出(OOM)問題的排查與解決

在 Java 開發中&#xff0c;內存溢出&#xff08;OutOfMemoryError&#xff0c;簡稱 OOM&#xff09;是一個常見且棘手的問題。相比于數組越界、空指針等業務異常&#xff0c;OOM 問題通常更難定位和解決。本文將通過一次線上內存溢出問題的排查過程&#xff0c;分享從問題表現…

AF3 AtomAttentionEncoder類解讀

AlphaFold3的AtomAttentionEncoder 類用于處理基于原子的表示學習任務。 源代碼: class AtomAttentionEncoderOutput(NamedTuple):"""Structured output class for AtomAttentionEncoder."""token_single: torch.Tensor # (bs, n_tokens, c_…

【51單片機零基礎-chapter3:按鍵:獨立按鍵|||附帶常見C語句.邏輯運算符】

將unsigned char var0;看作溝通二進制和十進制的橋梁 var是8位,初始為0000 0000; 同時可以進行十進制的運算 邏輯運算 位運算 & 按位與(有0則0) | 按位或(有1則1) ~ 按位非 ^ 按位異或(相同則1,不同為0) <<按位左移 >>按位右移 位運算符解釋: 0011 1100 <&…

游戲如何檢測iOS越獄

不同于安卓的開源生態&#xff0c;iOS一直秉承著安全性更高的閉源生態&#xff0c;系統中的硬件、軟件和服務會經過嚴格審核和測試&#xff0c;來保障安全性與穩定性。 據FairGurd觀察&#xff0c;雖然iOS系統具備一定的安全性&#xff0c;但并非沒有漏洞&#xff0c;如市面上…

在Lua中,Metatable元表如何操作?

Lua中的Metatable&#xff08;元表&#xff09;是一個強大的特性&#xff0c;它允許我們改變表&#xff08;table&#xff09;的行為。下面是對Lua中的Metatable元表的詳細介紹&#xff0c;包括語法規則和示例。 1.Metatable介紹 Metatable是一個普通的Lua表&#xff0c;它用于…

Python基于matplotlib實現樹形圖的繪制

在Python中&#xff0c;你可以使用matplotlib庫來繪制樹形圖&#xff08;Tree Diagram&#xff09;。雖然matplotlib本身沒有專門的樹形圖繪制函數&#xff0c;但你可以通過組合不同的圖形元素&#xff08;如線條和文本&#xff09;來實現這一點。 以下是一個簡單的示例&#…

2 秒殺系統架構

第一步 思考面臨的問題和業務場景 秒殺系統面臨的問題: 短時間內并發非常高&#xff0c;如果按照秒殺的并發做相應的承載會造成大量資源的浪費。第二解決超賣的問題。 第二步 思考目前的處境和解決方案 因為秒殺系統屬于短時間內的高并發問題&#xff0c;我們不可能使用那么…

12306分流搶票軟件 bypass v1.16.43 綠色版(春節自動搶票工具)

軟件介紹 12306Bypass分流搶票軟件&#xff0c;易操作強大的12306搶票軟件&#xff0c;全程自動搶票&#xff0c;云識別驗證碼打碼&#xff0c;多線程秒單、穩定撿漏&#xff0c;支持搶候補票、搶到票自動付款&#xff0c;支持多天、多車次、多席別、多乘客、短信提醒等功能。…