目錄
-
變量覆蓋漏洞
繞過過濾空白字符
多重加密
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!";
}
登錄后復制
所以第三步要滿足的條件為,它必須為回文數即從左往右和從右往左讀取都要相同的數值,所以我們構造如下






