目錄
-
變量覆蓋漏洞
繞過過濾空白字符
多重加密
WITH ROLLUP注入
erge截斷
strcmp比較字符串
sha()函數比較繞過
php小編新一為您介紹phpbugs代 碼審計基礎詳解。代碼審計是指對程序代碼的安全性進行評估與檢測,以發現潛在的安全問題或漏洞。phpbugs是一套優秀的安全審計工具,具備強大的漏洞掃描和識別能力,可以快速發現代碼中的漏洞,從而提高系統的安全性。本文將詳細介紹phpbugs的使用方法和相關技巧,幫助讀者更好地進行代碼審計工作。
變量覆蓋漏洞
<?PHP $flag='xxx'; extract($_GET); if(isset($shiyan)) { $content=trim(file_get_contents($flag));//將讀取$flag內容并去除左右空白后保存到$content if($shiyan==$content) { echo'ctf{xxx}'; } else { echo'Oh.no'; } } ?>
登錄后復制
重要點為$shiyan==$content
只要滿足這個條件就可以獲取flag。
首先extract()
函數的作用為從數組將變量導入到當前符號表,也就是說我們如果構造
xxx.com/index.<strong class="keylink">php</strong>?$shiyan=1
則會生成一個名字為$shiyan
的變量,值為1。
然后通過isset
函數來判斷剛生成的$shiyan
變量是否為null,如果為null就進入判斷。
$content
變量則是通過file_get_contents
函數和trim
函數來讀取文件,但是此時它所讀取的文件$flag
值為xxx,此時這個目錄是不存在的,所以它的值為空。
所以我們此時要做的就是將$shiyan
的值變為空即可。
所以構造鏈接xxx.com/index.php?$shiyan=&flag=1
即可獲得ctf{xxx}
php小編新一為您介紹phpbugs代 碼審計基礎詳解。代碼審計是指對程序代碼的安全性進行評估與檢測,以發現潛在的安全問題或漏洞。phpbugs是一套優秀的安全審計工具,具備強大的漏洞掃描和識別能力,可以快速發現代碼中的漏洞,從而提高系統的安全性。本文將詳細介紹phpbugs的使用方法和相關技巧,幫助讀者更好地進行代碼審計工作。
繞過過濾空白字符
<?php $info = ""; $req = []; $flag="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; ini_set("display_error", false); //為一個配置選項設置值 error_reporting(0); //關閉所有PHP錯誤報告 if(!isset($_GET['number'])){ header("hint:26966dc52e85af40f59b4fe73D8c323a.txt"); //Http頭顯示hint 26966dc52e85af40f59b4fe73d8c323a.txt die("have a fun!!"); //die — 等同于 exit() } foreach([$_GET, $_POST] as $global_var) {//foreach 語法結構提供了遍歷數組的簡單方式 foreach($global_var as $key => $value) { $value = trim($value);//trim — 去除字符串首尾處的空白字符(或者其他字符) is_string($value) && $req[$key] = addslashes($value); // is_string — 檢測變量是否是字符串,addslashes — 使用反斜線引用字符串 } } function is_palindrome_number($number) { $number = strval($number); //strval — 獲取變量的字符串值 $i = 0; $j = strlen($number) - 1; //strlen — 獲取字符串長度 while($i < $j) { if($number[$i] !== $number[$j]) { return false; } $i++; $j--; } return true; } if(is_numeric($_REQUEST['number'])) //is_numeric — 檢測變量是否為數字或數字字符串 { $info="sorry, you cann't input a number!"; } elseif($req['number']!=strval(intval($req['number']))) //intval — 獲取變量的整數值 { $info = "number must be equal to it's integer!! "; } else { $value1 = intval($req["number"]); $value2 = intval(strrev($req["number"])); if($value1!=$value2){ $info="no, this is not a palindrome number!"; } else { if(is_palindrome_number($req["number"])){ $info = "nice! {$value1} is a palindrome number!"; } else { $info=$flag; } } } echo $info;
登錄后復制
根據代碼判斷,它需要滿足多個條件才可以執行$info=$flag;
之后echo出來的才是flag。
if(is_numeric($_REQUEST['number'])) //is_numeric — 檢測變量是否為數字或數字字符串 { $info="sorry, you cann't input a number!"; }
登錄后復制
先來看看第一個條件,它要求number參數傳入的內容不能為數字,否則返回sorry, you cann't input a number!
但是它的第二個要求為數字必須為整數,否則輸出number must be equal to it's integer!!
elseif($req['number']!=strval(intval($req['number']))) //intval — 獲取變量的整數值 { $info = "number must be equal to it's integer!! "; }
登錄后復制
導致我們輸入字符串也會報錯
這里我們用到%00來繞過is_numeric
函數的判斷。
根據報錯,再來看看$value1
,它是$req["number"]
的整數值,$value2
則為反轉之后的$req["number"]
的整數值。
$value1 = intval($req["number"]); $value2 = intval(strrev($req["number"])); if($value1!=$value2){ $info="no, this is not a palindrome number!"; }
登錄后復制
所以第三步要滿足的條件為,它必須為回文數即從左往右和從右往左讀取都要相同的數值,所以我們構造如下