24.FALSE
分析:
PHP函数
isset(): 检测变量是否设置
只能用于变量,传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数
格式: isset ( mixed var [, mixed var [, ...]] )
若变量不存在则返回 FALSE
若变量存在且其值为NULL,也返回 FALSE
若变量存在且值不为NULL,则返回 TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
== : 比较运算符号 不会检查条件式的表达式的类型
===: 恒等计算符 , 同时检查表达式的值与类型。(会检查表达式类型,如bool)
die()函数 : 停止程序运行,输出内容
sha1()函数: 计算字符串 "Hello" 的 SHA-1 散列。默认的传入参数类型是字符串型
W3School: http://www.w3school.com.cn/php/func_string_sha1.asp
分析源码:
<?php
if (isset($_GET['name']) and isset($_GET['password'])) {
if ($_GET['name'] == $_GET['password'])
echo '<p>Your password can not be your name!</p>';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '<p>Invalid password.</p>';
}
else{
echo '<p>Login first!</p>';
?>
登录成功条件:
(1)传入name,password的值
(2)name和password的值不能相等
(3) name和password的sha1加密散列值相等
前两个条件容易实现,关键是第三个条件,怎样实现呢?
思路: sha1()函数默认的传入参数类型是字符串型,可以传入其他类型,使其返回值为false。如数组类型。
注意到源码是三等号,不能用弱类型判断
<?php
var_dump(sha1('aaroZmOk')===sha1('aaK1STfY')); //bool(false)
var_dump(sha1('aaroZmOk')==sha1('aaK1STfY')); //bool(true)
?>
var_dump() 方法,判断一个变量的类型与长度,并输出变量的数值,如果变量有值,则输出是变量的值,并返回数据类型。
应该利用false===false
md5 和 sha1 无法处理数组,但是 php 没有抛出异常,直接返回 fasle
sha1([]) === false
md5([]) === false
实现:
构造url: http://ctf4.shiyanbar.com/web/false.php?name[]=a&password[]=b (a,b只要不等即可),提交即可获得flag
得到:
本文做了部分修改,先看原文直接去https://www.cnblogs.com/ssooking/p/5869784.html