ctf-web-攻防世界基础题simple_php

本文详细解析了攻防世界中的Web基础题,通过分析PHP松散比较和is_numeric函数,展示了如何利用这些特性获取隐藏的flag1和flag2。文章提供了具体的解题思路和示例URL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

攻防世界web基础题
解题:具有一定的php基础,了解php松散比较 ==

【题目】

在这里插入图片描述

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

【题目分析】

通过第一个if条件得到$flag1
松散比较请参考:PHP弱类型比较表

if($a==0 and $a){
    echo $flag1;
}
/*
1. $a 由$_GET['a']赋值而来,$_GET是一个数组,数组中的每一个值都是一个字符串类型。
2. 由1可得$_GET['a']是一个字符串类型的值
3. $a == 0 为true 并且 $a 为true 则if条件成立

== 是php中松散比较,松散比较不会严格比较类型,而会进行类型转换。
$a==0 首先判断$a是不是int型,如果是,直接和0比较,如果不是int型,会将$a先转换为int型再和0比较。
将一个不含有数字的字符串转换为int类型时,它的值为0。例如'php' == 0 为true
将一个非0的字符串转换为bool型,其值为true 例如:'php' ==true 为true 而 '0' ==true 为false

综上所述,$_GET['a']可以为一个非零的字符串,例如:'php'
*/

通过第2、3个if条件得到$flag2

if(is_numeric($b)){
    exit();
}
if($b>1234){
    echo $flag2;
}

/*
is_numeric — 检测变量是否为数字或数字字符串,数字字符串就是这个字符串里面仅有数字。
$b 首先不能为数字或数字字符串,否则直接exit
$b 和int型的1234比较,先判断$b的类型,后转换int

'1234a' 转化为int型就等价于 1234 ,而'1234a'不是数字字符串,是一般的字符串
'0a' 转换为int型等价于 0
'a12345' 转化为int型等价于0
当一个前半部分为数字的字符串转换为int类型时,会保留前半部分的数字作为最终的值

综上所述,$_GET['b']的值可以为'99999a' 转换为int 后为 99999 > 1234
*/

数组与数字比较时,数组是永远大于int类型的数字的
例如

$b = array();
var_dump($b);
if( $b > 999999999999999){
    echo '<br>'.'yes';
}else{
    echo '<br>'.'no';
}


/*
运行结果:
array(0) { }
yes
*/

通过分析,本题的答案可以为

http://220.249.52.133:33567/?a='php'&b='9999php'

【总结】

一切输入的类型是可疑的,永远不要相信在弱类型的php下任何比较函数,任何数学运算。否则,你绝对是被php出卖的那一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值