三个等号的题

打开是一个简单的登陆界面,查看源码:

<?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>‘;
?>
如果想登录成功,必须满足两个条件:

$_GET[‘name‘] != $_GET[‘password‘]
sha1($_GET[‘name‘]) === sha1($_GET[‘password‘])

这里需要注意一下,第二个条件是===,和==是有点区别的:

===是恒等计算符   同时检查表达式的值与类型

==是比较运算符号  不会检查条件式的表达式的类型

所以,===会比较类型,比如bool。
在这里,sha1()函数和md5()函数存在着漏洞,sha1()函数默认的传入参数类型是字符串型,那要是给它传入数组呢,当然,会出现错误,使sha1()函数返回错误,也就是返回false,这样一来===运算符就可以发挥作用了,所以,这道题需要构造username和password既不相等,又同样是数组类型,构造url:

http://ctf4.shiyanbar.com/web/false.php?name[]=a&password[]=b

a,b既可以看成不同的值,也可以看成a,b啦。
得到flag。
时间: 2024-10-11 22:02:39

三个等号的题的相关文章

浅析JavaScript和PHP中三个等号(===)和两个等号(==)的区别

先做个简单的介绍,让先有个直观的认识 == equality 等同 === identity 恒等 == 两边值类型不同的时候,要先进行类型转换,再比较. === 不做类型转换,类型不同的一定不等. 举例说明: "1" == true 类型不同,"=="将先做类型转换,把true转换为1,即为 "1" == 1: 此时,类型仍不同,继续进行类型转换,把"1"转换为1,即为 1 == 1: 此时,"==" 左

JavaScript中的两个等号(==)和三个等号(===)

"Determining whether two variables are equivalent is one of the most important operations in programming." (确定两个变量是否相等是编程中最重要的操作之一)--Nicholas Zakas JavaScript中作比较有两个方式:严格模式(strict comparison 使用三个等号 ===)和概要模式(abstract comparison 使用两个等号 ==),对于他们的意

javascript的三个等号(===)的作用

javascript的三个等号(===)的作用:在代码中,经常需要去比较两个操作数是否相等,javascript提供了两种比较运算符,一个是使用最为频繁的普通等号运算符(==),另一个是使用虽然不如第一个频繁,但是比较规则要严格的全等运算符(===).一.普通等号运算符:此运算符的比较规则比较松散,因为在进行比较之前,两个操作数要进行数据类型转换.规则如下:1.如果操作数中有布尔值,则先将此布尔值转换为数值类型.true转换为1,false转换为0.2.如果操作数中,一是数字,一个是字符串,那么

2018 HDU多校第三场赛后补题

2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube 题意: 在画布上画一个三维立方体. 题解: 模拟即可. 代码: #include <bits/stdc++.h> using namespace std; int a, b, c, R, C; char g[505][505]; int main () { int T; cin >>

随机产生三十道四则运算题程序

#include<stdio.h>#include<stdlib.h>#include<time.h>int main(){ int x,y,z,t,i; srand(time(NULL)); printf("三十道四则运算题\n"); for(i=0;i<30;i++) { x=rand()%100; y=rand()%100; z=rand()%4; switch(z) { case 0: printf("%d+%d=\n&quo

UVA_11877.第三次比赛C题:The Coco Cola

题目: 有一个coco cola小店,你可以用三个空瓶换一瓶coco cola饮料,如果你有n个空瓶,你可以喝到多少瓶饮料? 输入输出要求: intput:最多有10组案例,每组输入一个整数,0不被处理操作. Output:每组案例输出你能喝到的饮料数. sample intput: 3 10 81 0 sanple output: 1 5 40 代码如下: #include<iostream> #include<cstdio> using namespace std; int m

第三章 自测题

2. (1) 化为函数极限,再利用数列极限与函数极限的关系.\[\begin{aligned}  \lim_{x\to +\infty}  (x \tan \frac 1x)^{x^2} &= \lim_{t\to 0}  \exp \frac{ \ln \frac{\tan t}{t} }{t^2} \\   &=  \exp \left(  \lim_{t\to 0}  \frac{ \ln \frac{\tan t}{t} }{t^2}\right)\\   &=  \exp

Linux系统运维常见面试简答题系列(三)(9题)

1. 写一个sed命令,修改/tmp/input.txt文件的内容,要求:(1) 删除所有空行:(2) 一行中,如果包含"11111″,则在"11111″前面插入"AAA",在"11111″后面插入"BBB",比如:将内容为0000111112222的一行改为:0000AAA11111BBB2222 [[email protected]~]# cat -n /tmp/input.txt1 00001111122223 000011111

C++习题三10、11题

10.  某单位的职工工资包括基本工资Wage,岗位巾Subsidy,房租Rent,水费Waterfee,电费Elecfee,设计实现工资管理的类Salary,该类的形式如下: class salary{ private: double wage,subsidy,rent,waterfee,elecfee; public: salary(-----){初始化工资数据的各分项} salary(){初始化工资的各分项数据为0} void setXX (double f){xx=f;} double