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

 源码分析

  1. show_source(__FILE__);
    这行代码会显示当前文件的源代码。__FILE__ 是一个魔术常量,表示当前文件的完整路径和文件名。
  2. include("config.php");
    这行代码会包含(即插入)config.php 文件的内容到当前文件。我们可以假设 config.php 文件可能包含了一些配置信息,比如 $flag1 和 $flag2 的定义。
  3. $a=@$_GET['a']; 和 $b=@$_GET['b'];
    这两行代码从 URL 的 GET 参数中获取 a 和 b 的值,并分别赋给变量 $a 和 $b@ 符号用于抑制错误消息,即如果 $_GET['a'] 或 $_GET['b'] 不存在,PHP 不会显示错误。
  4. if($a==0 and $a){
    这个条件判断似乎存在逻辑错误。$a==0 会检查 $a 是否等于 0,而 $a 单独使用会检查 $a 是否存在(即是否为真值)。但是,由于 $a 已经用 @ 符号赋值,它永远不会为 null 或 false,因此这个条件永远不会为真。
  5. if(is_numeric($b)){
    这个条件判断 $b 是否为数字。如果 $b 是数字,exit(); 会被调用,脚本会终止执行。
  6. if($b>1234){
    这个条件判断 $b 是否大于 1234。如果 $b 是非数字(因为之前的 is_numeric($b) 已经排除了数字的情况),这个条件将不会为真。但如果 $b 是一个非数字但能够进行比较的字符串(比如 "1234a"),这个条件可能为真。如果条件为真,它会输出 $flag2

访问config.php文件无果

弱比较介绍:当两个不同类型比较时,会自动转换成相同类型后再比较值。相当于啥呢,举例如下:

if("admin"==0) //true
if("1admin"==1)//true
if("admin1"==1)//false
if("0e12324"=="0e1324")//true
再次解释举例内容:数字和字符串比较中,字符串转换成数字的过程中,会取字符串前面数字的值作为整个字符串转换成数字的值,比较“1admin”,转换成数字就是1,所以"admin"的话,因为字符串没有数字,只能转换成0了,所以if("admin"==0) 会是true。这里的admin换成任意字符都行。

is_numeric()`` 是 PHP 中的一个内置函数,用于检查一个变量是否为数字或数字字符串。如果变量是数字或数字字符串,则返回 true;否则返回 false`。

在给出的 PHP 代码片段中,is_numeric($b) 用于检查 $b 是否为数字或数字字符串。如果是,脚本将调用 exit(); 终止执行。这意味着,如果 $b 是一个可以转换为数字的值(无论是整数、浮点数还是数字字符串),脚本都不会继续执行到后面的代码。

这里有一点需要注意,即使 $b 是一个以数字开头但包含非数字字符的字符串(例如 "123abc"),is_numeric() 也会返回 true,因为该函数在检查时会尝试将字符串转换为数字,并基于转换是否成功来返回结果。如果字符串以数字开头,PHP 会尝试将其转换为那个数字值。

因此,这段代码中的 is_numeric($b) 检查并不完全安全,特别是如果 $b 应该是一个严格的整数或浮点数。如果代码需要确保 $b 是一个严格的整数或浮点数,而不是以数字开头的字符串,那么可能需要使用更严格的验证方法,例如正则表达式或类型转换检查。

此外,由于 $b 的值来自 URL 的 GET 参数,没有进行适当的输入验证或清理,这可能导致潜在的安全风险,特别是如果 config.php 中的 $flag2 包含敏感信息。在实际应用中,应该始终验证和清理用户输入,以防止安全漏洞,如跨站脚本攻击(XSS)或 SQL 注入等。

直接构造playload

?a=a&b=9999a

  • 20
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值