simple_php WP(php弱类型比较 类型转换等)
simple_php WP(php弱类型比较 类型转换等)
攻防世界simple_php,链接https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5072&page=1
题目如下
<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>
php弱类型比较
php中比较符号分为两种,=== 和 ==
其中 ===为严格比较,首先比较数据类型是否相同,再进行值比较
而 ==为松散比较,会自动进行类型转换后再比较
如果用==比较一个数字和字符串,则字符串会自动转换成数值再进行数值比较。且字符串开始部分决定了它的值,如果字符串以合法的数值开始,则使用该数值,否则为0。
如下所示
<?php
var_dump("admin"==0); //true
var_dump("1admin"==1); //true
var_dump("admin1"==1) //false
var_dump("admin1"==0) //true
?>
同时注意到题目第6行处
if($a==0 and $a)
还需要考虑将变量$a类型转化为bool后的值,在本地编写bool.php测试转化结果
//bool.php
<?php
$a=@$_GET['a'];
var_dump($a);
settype($a,"bool");//将变量$a强制转化为bool类型
var_dump($a);
?>
上图为测试结果,可以看到通过get方法将a=123穿入,得到变量$a为字符串类型,值为'123',转化后为true。一般情况下,其他类型转换为bool类型时都为true,但空类型和0、字符串"0"等为FALSE,具体如下。
转换为布尔值时,以下值为FALSE:
- 布尔值FALSE本身
- 整数0(零)
- 浮点数0.0(零)
- 空字符串和字符串“ 0”
- 零元素数组
- 成员变量为零的对象(仅PHP 4)
- 特殊类型NULL(包括未设置的变量)
- 从空标签创建的SimpleXML对象
其他所有值均视为TRUE(包括任何资源)。
同时还需要主要到题目第9行
if(is_numeric($b))
is_numeric() 函数用于检测变量是否为数字或数字字符串。如果指定的变量是,则返回 TRUE,否则返回 FALSE
所以最后构造URL后加上 /?a=qwe&b=2222a ,得到flag。
变量$a可以为任意转化为数值为0,转化为bool值为true的字符串,
变量$b可以为任意非数字非数字字符串,且转化为数值后的值大于1234的字符串。
参考