PHP代碼審計-01

🌸 連接方式

PHP + Mysql連接方式:

  1. Mysql(廢棄)
  2. Mysqli
  3. PDO
🌸 常見過濾

intval/addslashes/mysql_real_escape

mysqli_escape_string/mysqli_real_escape_string/mysqli::escape_string

PDO::quote

參數化查詢

  1. addslashes/mysql_real_escape
    1. 可能會導致寬字節注入(如果使用的是GBK編碼)
    2. 尋找字符串轉換函數來繞過
    3. urldecode
    4. simple_xml_loadstring
    5. stripshales
    6. json_decode
    7. iconv
    8. base64_decode
  2. mysqli::escape_string / PDO::quote
    1. addslashes差別:是否會主動加引號包裹
    2. 寬字節注入
  3. 參數化查詢
    1. 尋找非SQL值位置
    2. SELECT `name` FROM `users` WHERE `id` = ? ORDER BY `login_time` LIMIT 1 ,在這個SQL語句中除了?的位置是SQL值的位置,其他的位置都不是,要找非SQL值(可控)的位置

🌸 思路總結

??開發者容易遺漏的輸入點:

  1. HTTP頭
    1. X-Forwarded-For
    2. User-Agent
    3. Referer
  2. PHP_SELF
  3. REQUEST_URI
  4. 文件名 $_FILES[][name]
  5. php://input
  6. 引入單引號(轉義符)的方法
  7. stirpslashes
  8. base64_decode
  9. urldecode
  10. substr
  11. iconv
  12. str_replace('0','',$sql)
  13. xml
  14. json_encode
案例
🍂 1.php
<?php
include_once 'common.php';try {$name = $_GET["name"];$query = "SELECT name,age,email,country FROM user_details WHERE name = '{$name}';";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????這種寫法是最簡單的寫法,也是最基本的SQL注入類型。漏洞原因就是將name變量直接拼接在了SQL查詢語句中!

????????直接使用單引號進行閉合,利用報錯注入,獲取數據庫信息。

' and updatexml(1,concat(0x7e,database()),1)%23

🍂 2.php
<?php
include_once './common.php';try {$name = $_GET["name"];$name = addslashes($name);$query = "SELECT name,age,email,country FROM user_details WHERE name = '{$name}';";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????該代碼使用了addslashes()函數進行了相關的轉義。利用php在線文檔進行查詢該函數:

????????該函數會將單引號、雙引號、反斜線、NUL字節進行轉義。(但是并不能防止SQL注入漏洞的出現!)在這個代碼中若不考慮GBK編碼的問題,是不存在SQL注入漏洞的!

出現SQL注入漏洞的情況:

  1. 寬字節注入
  2. urldecode/base64_decode/iconv等函數的出現
🍂 3.php
<?php
include_once './common.php';try {$name = htmlspecialchars($_GET['name']);$query = "SELECT name,age,email,country FROM user_details WHERE name = '{$name}';";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????該代碼中出現了新的函數:htmlspecialchars(),依然是通過php手冊,查詢相關的功能:

????????該函數的作用是將特殊字符轉換為HTML實體。可以看到幫助文檔中提到,設置了ENT_QUOTES后,單引號就會被轉為為&#039... 可以看到該函數是在第二個參數重進行設置。

????????然而在該代碼中沒有第二個參數,所以說,這里是不會將單引號進行轉換為HTML實體的!依然存在漏洞。

🍂 4.php
<?php
include_once './common.php';try {$id = addslashes($_GET['id']);$query = "SELECT name,age,email,country FROM user_details WHERE id > $id;";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????該代碼中接收的參數變成了id參數,沒有單引號進行包裹,所以這里的addslashes()函數也就失效了。

🍂 5.php
<?php
include_once './common.php';try {$name = preg_replace("/'/", "\\'", $_GET['name']);$query = "SELECT name,age,email,country FROM user_details WHERE name = '{$name}';";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????該代碼中使用了新的函數preg_replace(),同樣是查詢手冊:

????????簡單來說就是替換!只要用戶輸入的數據中出現了單引號,那就替換為\'。看似是實現了過濾,但是依然存在SQL注入漏洞

????????原因是,當用戶輸入的是:\'的時候,那么就會替換為:\\',而第一個\把第二個\給轉義了,使得'逃脫!

payload: Bob\%27%20and%20updatexml(1,concat(0x7e,database()),1)%23

🍂 6.php
<?php
include_once './common.php';try {$id = intval($_GET['id']);$query = "SELECT name,age,email,country FROM user_details WHERE id = {$id};";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????該代碼采用了intval函數,將用戶輸入的內容轉換為整數,雖然還是直接拼接了SQL語句,但是并不存在SQL注入漏洞。

????????用戶輸入:1',就會轉換為1,可以理解為從第一個不是數字的地方開始,全部舍棄。

🍂 7.php
<?php
include_once './common.php';try {if (intval($_GET["id"])) {$query = "SELECT name,age,email,country FROM user_details WHERE id = {$_GET['id']};";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}}
}catch (PDOException $e){echo $e->getMessage();
}

????????也算是比較經典的漏洞了,看似存在intval函數,但是后面拼接的時候,并不是intval()轉換之后的結果,而是$_GET['id']!從而導致了SQL注入漏洞的出現。

🍂 8.php
<?php
include_once './common.php';try {if (!is_numeric($_GET['id'])) {header('Status: 404 Not Found');}$query = "SELECT name,age,email,country FROM user_details WHERE id = {$_GET['id']};";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????該版本采用了新的函數is_numeric()判斷傳遞的參數是否是數字!如果不是數字的話,那就通過header頭發送原生的http頭。

????????但是這里存在一個很大的問題,當用戶輸入的不是數字的時候,雖然進入了if條件,但是并沒有exit/die函數的出現,所以整個代碼還是會繼續往下執行。

id=1%20and%20sleep(3)#此時就可以通過延時注入來進行測試:

🍂 9.php
<?phpinclude_once './common.php';try {$order = addslashes($_GET['order']);if(!preg_match('/DESC|ASC/i', $order)) {exit("Bad order");}$query = "SELECT name,age,email,country FROM user_details order by id {$order};";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????雖然這里出現了addslashes()函數,但是并不需要單引號進行包裹~ 同時還出現了正則匹配,匹配$order中是不是存在DESC/ASC。所以注入的相關語句可以寫成:ASC; DROP TABLE user_details--

🍂 10.php
<?php
include_once './common.php';try {if (!is_numeric($_GET['id'])) {header('Status: 404 Not Found');exit();}$query = "SELECT name,age,email,country FROM user_details WHERE id = {$_GET['id']};";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????該版本的代碼就是針對8.php,做出了相關的修復。

🍂 11.php
<?php
include_once './common.php';try {$order = addslashes($_GET['order']);$query = "SELECT name,age,email,country FROM user_details ORDER BY id {$order};";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????同樣存在SQL注入漏洞,無需單引號閉合:

🍂 12.php
<?php
include_once './common.php';try {$name = $_GET["name"];$query = "SELECT name,age,email,country FROM user_details WHERE name= ?;";$stmt = $conn->prepare($query);$stmt->bindValue(1, $name);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????這種寫法就是預編譯的寫法了,是不存在SQL注入漏洞的。

🍂 13.php
<?php
include_once './common.php';try {$name = addslashes($_GET["name"]);$name = urldecode($name);$query = "SELECT name,age,email,country FROM user_details WHERE name= '{$name}';";$stmt = $conn->prepare($query);$stmt->execute();$stmt->bindColumn('email', $email);while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {echo "$email" . "<br>";}
}catch (PDOException $e){echo $e->getMessage();
}

????????本來如果只有addslashes()函數的話,就不會存在SQL注入漏洞,但是addslashes函數后面存在一個urldecode()函數,從而導致了SQL注入漏洞的出現,同時若是出現base64_decode iconv等函數時,也是存在SQL注入漏洞的!

????????因為經過一次編碼之后,addslashes()函數是檢測不到單引號的存在~

????????在URL中發送payload的時候,會自動進行一次URLEncode,服務器收到請求之后,再自動的進行URLDecode,然后代碼中存在一次URLDecode,所以Payload就需要進行兩次URLEncode

🦄 數據庫配置
CREATE DATABASE example;CREATE TABLE `example`.`user_details` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(256) NOT NULL,
`email` VARCHAR(256) NOT NULL,
`age` INT NULL,
`country` VAR CHAR(256) NULL,
PRIMARYKEY (`id`)
) ENGINE = MyISAM;INSERT INTO `user_details`(`id`,`name`,`email`,`age`,`country`) VALUES('1','Bob','bob@example.com','22','China');
INSERT INTO `user_details`(`id`,`name`,`email`,`age`,`country`) VALUES('2','Alice','Alice@example.com','25','En');

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

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

相關文章

SpringKafka錯誤處理:重試機制與死信隊列

文章目錄 引言一、Spring Kafka錯誤處理基礎二、配置重試機制三、死信隊列實現四、特定異常的處理策略五、整合事務與錯誤處理總結 引言 在構建基于Kafka的消息系統時&#xff0c;錯誤處理是確保系統可靠性和穩定性的關鍵因素。即使設計再完善的系統&#xff0c;在運行過程中也…

藍橋杯2024JavaB組的一道真題的解析

文章目錄 1.問題描述2.問題描述3.思路分析4.代碼分析 1.問題描述 這個是我很久之前寫的一個題目&#xff0c;當時研究了這個題目好久&#xff0c;發布了一篇題解&#xff0c;后來很多人點贊&#xff0c;我都沒有意識到這個問題的嚴重性&#xff0c;我甚至都在懷疑自己&#xf…

性能比拼: Go標準庫 vs Python FastAPI(第二輪)

本內容是對知名性能評測博主 Anton Putra Python (FastAPI) vs Go (Golang) (Round 2) Performance Benchmark 內容的翻譯與整理, 有適當刪減, 相關指標和結論以原作為準 介紹 這是第二輪關于 FastAPI 和 Golang 的對比測試。我幾天前運行了前一次的基準測試&#xff0c;到目…

DeepSeek與ChatGPT的優勢對比:選擇合適的工具來提升工作效率

選DeepSeek還是ChatGPT&#xff1f;這就像問火鍋和披薩哪個香&#xff01; "到底該用DeepSeek還是ChatGPT?” 這個問題最近在互聯網圈吵翻天!其實這就跟選手機系統-樣&#xff0c;安卓黨iOS黨都能說出一萬條理由&#xff0c;但真正重要的是你拿它來干啥&#xff01;&am…

Python爬蟲第4節-請求庫urllib的request模塊使用

目錄 前言&#xff1a;基本庫urllib的使用 一、urlopen方法 二、Request類 三、高級用法 前言&#xff1a;基本庫urllib的使用 開始學習爬蟲時&#xff0c;第一步就是要模擬瀏覽器給服務器發送請求。這個時候&#xff0c;你可能會有很多問題&#xff1a;該從哪里開始做呢&a…

Vue3 Pinia Store使用示例

代碼示例&#xff1a; import { defineStore } from "pinia"; // 導入 Pinia 的 defineStore 方法 import { ref } from "vue"; // 導入 Vue 的響應式 API ref import { type Menu } from "/interface"; // 導入自定義的 Menu 類型/…

JavaScript逆向魔法:Chrome開發者工具探秘之旅

在前端開發和安全研究領域&#xff0c;JavaScript逆向工程是一項關鍵技能。它涉及分析和理解代碼的執行流程、數據結構和邏輯&#xff0c;以發現潛在的安全漏洞、提取核心算法或實現功能兼容。本文將結合Chrome開發者工具的調試功能&#xff0c;并通過具體示例幫助你更好地理解…

Qt基礎:資源文件

資源文件 1. 資源文件2. 資源文件創建 1. 資源文件 資源文件顧名思義就是一個存儲資源的文件&#xff0c;在Qt中引入資源文件好處在于他能提高應用程序的部署效率并且減少一些錯誤的發生。 在程序編譯過程中&#xff0c; 添加到資源文件中的文件也會以二進制的形式被打包到可執…

Agent TARS與Manus的正面競爭

Agent TARS 是 Manus 的直接競爭對手&#xff0c;兩者在 AI Agent 領域形成了顯著的技術與生態對抗。 一、技術架構與功能定位的競爭 集成化架構 vs 模塊化設計 Agent TARS 基于字節跳動的 UI-TARS 視覺語言模型&#xff0c;將視覺感知、推理、接地&#xff08;grounding&#…

使用ssh連接上開發板

最后我發現了問題&#xff0c;我忘記指定用戶名了&#xff0c;在mobaXterm上左上角打開會話&#xff0c;點擊ssh&#xff0c;然后輸入要連接的開發板主機的ip地址&#xff0c;關鍵在這里&#xff0c;要指定你要連接的開發板的系統中存在的用戶&#xff0c;因為通過ssh連接一個設…

【性能優化點滴】odygrd/quill在編譯期做了哪些優化

Quill 是一個高性能的 C 日志庫&#xff0c;它在編譯器層面進行了大量優化以確保極低的運行時開銷。以下是 Quill 在編譯器優化方面的關鍵技術和實現細節&#xff1a; 1. 編譯時字符串解析與格式校驗 Quill 在編譯時完成格式字符串的解析和校驗&#xff0c;避免運行時開銷&…

【數據結構】排序算法(中篇)·處理大數據的精妙

前引&#xff1a;在進入本篇文章之前&#xff0c;我們經常在使用某個應用時&#xff0c;會出現【商品名稱、最受歡迎、購買量】等等這些榜單&#xff0c;這里面就運用了我們的排序算法&#xff0c;作為剛學習數據結構的初學者&#xff0c;小編為各位完善了以下幾種排序算法&…

混雜模式(Promiscuous Mode)與 Trunk 端口的區別詳解

一、混雜模式&#xff08;Promiscuous Mode&#xff09; 1. 定義與工作原理 定義&#xff1a;混雜模式是網絡接口的一種工作模式&#xff0c;允許接口接收通過其物理鏈路的所有數據包&#xff0c;而不僅是目標地址為本機的數據包。工作層級&#xff1a;OSI 數據鏈路層&#x…

大學生機器人比賽實戰(一)綜述篇

大學生機器人比賽實戰 參加機器人比賽是大學生提升工程實踐能力的絕佳機會。本指南將全面介紹如何從零開始準備華北五省機器人大賽、ROBOCAN、RoboMaster等主流機器人賽事&#xff0c;涵蓋硬件設計、軟件開發、算法實現和團隊協作等關鍵知識。 一、比賽選擇與準備策略 1.1 主…

【Linux】動靜態庫知識大梳理

親愛的讀者朋友們&#x1f603;&#xff0c;此文開啟知識盛宴與思想碰撞&#x1f389;。 快來參與討論&#x1f4ac;&#xff0c;點贊&#x1f44d;、收藏?、分享&#x1f4e4;&#xff0c;共創活力社區。 在 Linux 系統編程中&#xff0c;動靜態庫是重要的組成部分&#xff0…

06-公寓租賃項目-后臺管理-公寓管理篇

尚庭公寓項目/公寓管理模塊 https://www.yuque.com/pkqzyh/qg2yge/5ba67653b51379d18df61b9c14c3e946 一、屬性管理 屬性管理頁面包含公寓和房間各種可選的屬性信息&#xff0c;其中包括房間的可選支付方式、房間的可選租期、房間的配套、公寓的配套等等。其所需接口如下 1.1…

Links for llama-cpp-python whl安裝包下載地址

Links for llama-cpp-python whl安裝包下載地址 Links for llama-cpp-python whl安裝包下載地址 https://github.com/abetlen/llama-cpp-python/releases

為境外組織提供企業商業秘密犯法嗎?

企業商業秘密百問百答之九十六&#xff1a;為境外組織提供企業商業秘密犯法嗎&#xff1f; 在日常的對外交流中&#xff0c;企業若暗中為境外的機構、組織或人員竊取、刺探、收買或非法提供商業秘密&#xff0c;這種行為嚴重侵犯了商業秘密權利人的合法權益&#xff0c;更深遠…

grep 命令詳解(通俗版)

1. 基礎概念 grep 是 Linux 下的文本搜索工具&#xff0c;核心功能是從文件或輸入流中篩選出包含指定關鍵詞的行。 它像“文本界的搜索引擎”&#xff0c;能快速定位關鍵信息&#xff0c;特別適合日志分析、代碼排查等場景。 2. 基礎語法 grep [選項] "搜索詞" 文件…

JSVMP逆向實戰:原理分析與破解思路詳解

引言 在當今Web安全領域&#xff0c;JavaScript虛擬機保護&#xff08;JSVMP&#xff09;技術被廣泛應用于前端代碼的保護和反爬機制中。作為前端逆向工程師&#xff0c;掌握JSVMP逆向技術已成為必備技能。本文將深入剖析JSVMP的工作原理&#xff0c;并分享實用的逆向破解思路…