卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章44502本站已运行31027

phpbugs代码审计基础详解

目录
  • 变量覆盖漏洞
  • 绕过过滤空白字符
  • 多重加密
  • WITH ROLLUP注入
  • erge截断
  • strcmp比较字符串
  • sha()函数比较绕过

php小编新一为您介绍phpbugs代 码审计基础详解。代码审计是指对程序代码的安全性进行评估与检测,以发现潜在的安全问题或漏洞。phpbugs是一套优秀的安全审计工具,具备强大的漏洞扫描和识别能力,可以快速发现代码中的漏洞,从而提高系统的安全性。本文将详细介绍phpbugs的使用方法和相关技巧,帮助读者更好地进行代码审计工作。

变量覆盖漏洞

<?PHP
$flag='xxx'; 
extract($_GET);
 if(isset($shiyan))
 { 
$content=tri&#109;(file_get_contents($flag));//将读取$flag内容并去除左右空白后保存到$content
if($shiyan==$content)
{ 
echo'ctf{xxx}'; 
}
 else
 { 
echo'Oh.no';
 } 
 }
?>

重要点为$shiyan==$content只要满足这个条件就可以获取flag。

首先extract()函数的作用为从数组将变量导入到当前符号表,也就是说我们如果构造

xxx.com/index.php?$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}

phpbugs代码审计基础详解

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 = tri&#109;($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!

phpbugs代码审计基础详解

但是它的第二个要求为数字必须为整数,否则输出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!! ";
} 

导致我们输入字符串也会报错

phpbugs代码审计基础详解

这里我们用到%00来绕过is_numeric函数的判断。

phpbugs代码审计基础详解

根据报错,再来看看$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!";
 }

所以第三步要满足的条件为,它必须为回文数即从左往右和从右往左读取都要相同的数值,所以我们构造如下

phpbugs代码审计基础详解

卓越飞翔博客
上一篇: 用JavaScript读取宏控件数据的方法?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏