关于buu warmup的深入理解
打开页面,一个滑稽,查看源码,得到source.php,输入得到源码:
<?php //首先测试一下in_array()函数的绕过方法 //$str=["heel","zzy"]; //var_dump(in_array("heel?f",$str)); highlight_file(__FILE__); class emmm { public static function checkFile(&$page) { $whitelist = ["source"=>"source.php","hint"=>"hint.php"];//检查白名单 if (! isset($page) || !is_string($page)) {//第0重检查:是否设置了该变量或者说是是字符串 echo "you can't see it"; return false; } if (in_array($page, $whitelist)) {//第一重检查:是否在白名单,返回为真,注意该静态方法中有多重检查,只要满足一个return真即可 return true; } $_page = mb_substr(//形同substr函数,加了前缀之后就可以识别中文了 $page, 0, mb_strpos($page . '?', '?')//strpos表示截取到第二个参数之前的位置,返回值为数字 ); if (in_array($_page, $whitelist)) {//第二重检查,经过裁剪的page是否在白名单 return true; } $_page = urldecode($page);//url解码 $_page = mb_substr(//梅开二度,再来一次 $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) {//又是一次熟悉的操作 return true;//看着像是经过第一次检查,但是最重要的是经过了url解码 } echo "you can't see it"; return false; } } if (! empty($_REQUEST['file'])//要求file不能为空 && is_string($_REQUEST['file'])//要求参数是字符串 && emmm::checkFile($_REQUEST['file'])//要求得通过这个静态的检查 ) { include $_REQUEST['file'];//如果通过了就包含文件 exit; } else { echo ""; } ?>
是一道代码审计的题。将源码拷贝到本地进行分析。
这里主要运用了三个函数:
<?php //in_array函数漏洞 $arr=[1,2,3]; var_dump(in_array('1shell.php',$arr,true)); echo"<tbr>"; //mb_strpos函数说明 $str="hello world"; var_dump(mb_strpos($str,'w')); echo"<br>"; //mb_substr函数说明 var_dump(mb_substr($str,0,3)); ?>首先这里主要运用了这三个函数,我就去查了下这三个函数是否存在漏洞
$in_array(我们要搜索的,目标字符串); 判断我们要搜索的内容是否在数组里
返回值:布尔类型的值
$mb_strpos(原始的字符串,目标字符串); 搜索第一次出现的位置
返回值:第一次出现的位置
$mb_substr(原始的字符串,起始位置,种植位置) 截取字符串
返回值:截取完毕后的字符串
对于in_array()函数,如果只有前两个参数
$arr=[1,2,3];
var_dump(in_array(“1”,$arr));
echo"<br>";
对于这段代码,返回值是true,因为“1”==1 只比较值不比较类型,这里是弱类型比较
但如果加入第三个参数例如
var_dump(in_array(“1”,$arr,true)); ”1“!==1 这里就会返回false 因为会进行强类型比较,一个为字符串类型,一个为整数
这个函数的漏洞与PHP的弱类型比较一个道理比如说这里数组里有1-3,如果想传shell.php,就可以尝试1shell.php
对于第二个函数 m b s t r p o s ( ) 是 用 来 搜 索 字 符 串 出 现 的 位 置