攻防世界web新手-simple_php

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是一门弱类型语言,当涉及“”判断时,它的表现是有一些奇特的。
例如,“a
0”将会得到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

猜你喜欢

转载自blog.csdn.net/yuanxu8877/article/details/127624426