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);
?>

image-20220118163412157

上图为测试结果,可以看到通过get方法将a=123穿入,得到变量$a为字符串类型,值为'123',转化后为true。一般情况下,其他类型转换为bool类型时都为true,但空类型和0、字符串"0"等为FALSE,具体如下。

转换为布尔值时,以下值为FALSE:

  1. 布尔值FALSE本身
  2. 整数0(零)
  3. 浮点数0.0(零)
  4. 空字符串和字符串“ 0”
  5. 零元素数组
  6. 成员变量为零的对象(仅PHP 4)
  7. 特殊类型NULL(包括未设置的变量)
  8. 从空标签创建的SimpleXML对象

其他所有值均视为TRUE(包括任何资源)。

同时还需要主要到题目第9行

if(is_numeric($b))

is_numeric() 函数用于检测变量是否为数字或数字字符串。如果指定的变量是,则返回 TRUE,否则返回 FALSE

所以最后构造URL后加上 /?a=qwe&b=2222a ,得到flag。

变量$a可以为任意转化为数值为0,转化为bool值为true的字符串,

变量$b可以为任意非数字非数字字符串,且转化为数值后的值大于1234的字符串。

参考

https://www.cnblogs.com/Mrsm1th/p/6745532.html

posted @ 2022-03-21 21:06  qweg_focus  阅读(67)  评论(0编辑  收藏  举报