同类型题(更难版->)攻防世界_Web(easyphp)(php代码审计/json格式/php弱类型匹配)
php代码审计
show_source(__FILE__)
:show_source()
函数用于显示指定文件的源代码,并进行语法高亮显示。__FILE__
是魔术常量,表示当前正在执行的 PHP 文件的完整路径和文件名。这行代码会显示当前文件的源代码。include("config.php")
:include
语句用于将指定的文件(这里是config.php
)包含到当前脚本中。
1. 获取 GET 参数
$a=@$_GET['a'];
$b=@$_GET['b'];
@
是错误抑制符,用于抑制可能出现的错误信息。$_GET
是一个超全局变量,用于获取通过 HTTP GET 方法传递的参数。这里将用户通过 GET 请求传递的a
和b
参数的值分别赋给变量$a
和$b
。
2. 条件判断输出 $flag1
if($a==0 and $a){
echo $flag1;
}
$a==0
:使用松散比较运算符==
比较$a
是否等于 0。在松散比较中,一些非数字类型的值(如字符串"0"
)也会被视为等于 0。$a
:在布尔上下文中,PHP 会将变量$a
转换为布尔值进行判断。除了false
、0
、0.0
、""
、'0'
、array()
、null
等被视为false
的值外,其他值都被视为true
。- 要使
$a==0 and $a
这个条件成立,$a
需要满足在松散比较下等于 0,但本身又被视为布尔值true
。
3. 检查 $b
是否为数字
if(is_numeric($b)){
exit();
}
is_numeric()
用于判断一个变量是否为数字或者可以转换为数字的字符串。如果$b
是数字或可转换为数字的字符串,脚本会调用exit()
函数终止执行。
4. 条件判断输出 $flag2
if($b>1234){
echo $flag2;
}
- 如果
$b
不是数字(通过上一个条件判断),但在比较时能满足大于 1234 的条件,脚本会输出$flag2
。在 PHP 中,当比较一个非数字字符串和数字时,PHP 会尝试将非数字字符串转换为数字进行比较。
解题步骤
根据条件输入参数a,b获取 $flag1,
获取 $flag2
a使 $a==0 and $a
这个条件成立
b非数字,比1234大
绕过方法
- 获取
$flag1
:可以将a
参数设置为字符串"0e123"
。在 PHP 中,以0e
开头的字符串会被当作科学计数法表示的数字进行处理,"0e123"
会被解释为0
,满足$a==0
;同时,字符串"0e123"
本身在布尔上下文中被视为true
,满足$a
的条件。 - 获取
$flag2
:可以将b
参数设置为字符串"1235abc"
。is_numeric("1235abc")
会返回false
,因为它不是一个纯数字字符串;而在比较"1235abc"
和 1234 时,PHP 会将"1235abc"
转换为数字 1235 进行比较,满足$b>1234
的条件。