ctf 你真的会php?
//这题最重要的思想是结合系统思考渗透方向
if(is_numeric($_REQUEST[‘number’])){//不能是数字通过空格绕过
$info=“sorry, you cann’t input a number!”;
}elseif(
r
e
q
[
′
n
u
m
b
e
r
′
]
!
=
s
t
r
v
a
l
(
i
n
t
v
a
l
(
req['number']!=strval(intval(
req[′number′]!=strval(intval(req[‘number’]))){//直接实验
var_dump( strval(intval(" 123 "))); string(3) “123” 可以看到 空格直接被没有了
$info = "number must be equal to it’s integer!! ";
}else{
$value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"])); //也是直接实验
var_dump(strrev(“123 “)==“321”); bool(true)
注意 “123 “不等于"123” 但是” 123” 等于"123” 所以可以构造入"123 “的东西 strrev一下变成” 321" 等于"321"
然后最骚气的就是结合系统,服务器系统是32位的整形 整数范围是 -2147483648 到 2147483647 2147483647 倒一下是7463847421 再intval 一下 又变成 214748367(64位 -9223372036854775808 是 9223372036854775807))所以构造payload为2147483647%20就可以了
if(
v
a
l
u
e
1
!
=
value1!=
value1!=value2){
$info=“no, this is not a palindrome number!”;
}else{
if(is_palindrome_number($req["number"])){
$info = "nice! {$value1} is a palindrome number!";
}else{
$info=$flag;
}
}