XCTF - simple_php
题目编号:GFSJ0485
知识点
本题主要考察php的弱类型比较
源码分析
<?php
//显示源码
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
//变量a和0进行比较,and a不等于0这个接下来会解释
if($a==0 and $a){
//输出flag1
echo $flag1;
}
//如果b是字符串或者数字
if(is_numeric($b)){
exit();
}
//b大于1234
if($b>1234){
//输出flag2
echo $flag2;
}
?>
解题思路
通过对源码进行分析,总共有两点需要解决
$a==0 and $a
:这个说明了a变量和0相等,并且还不能是0,如果a是0,那前面的if就不成立,也就不能输出flag1了。is_numeric($b)
&$b>1234
变量b是字符串或者数字,并且b的值大于1234
is_numeric()
函数用于检测变量是否为数字或数字字符串,如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。
关于a、b的取值,可以先看一个知识点。
PHP是一门弱类型语言,当涉及“”判断时,它的表现是有一些奇特的。
例如,“a0”将会得到true,“a==1”将会得到false。
(int)"1234abc"=1234
(int)"abcd"=0
(int)"1a2b3c"=1
(int)"a12b"=0
(int)"000123abc"=123
原理:PHP语言中在涉及“==”判断时,如果运算符两边分别为字符串(不以数字开头的字符串),会将字符串转化为数字0,再进行比较。如果是以数字开头的字符串,那么它将会转化成开头的数字(即第一个字母前的所有数字)。
唯一的例外就是上面我们提到的科学计数法9e9
这种会直接被认定为科学计数法
由此,我们可以得出a的值可以为a1,b的值可以为1235a
payload http://61.147.171.105:52976/?a=a1&b=1235b