web_015

kim23   ·   发表于 2019-11-26 11:38:56   ·   技术文章投稿区

web_015

 

 

标签:CTF | isset() | strcmp() | 代码审计 | 改后缀

提示:仔细思考一下吧~


打开网址

 

查看网页源代码(Ctrl+U),发现隐藏内容:<!--index.phps-->

 

 

访问的inde.phps然后就能下载inde.phps源代码文件了,

phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码。

因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。其实,只要不用php等已经在服务器中注册过的MIME类型为文件即可,但为了国际通用,所以才用了phps文件类型。

 

打开源代码,现已改名为web15_index.phps

 

 

<?php

    error_reporting(0);

    $flag = '*******';

    if (isset($_GET['password'])) {

        

        if (strcmp($_GET['password'], $flag) == 0)  

            die($flag);  

        else

            print 'Invalid password';  

    }

?>

 

代码解释

error_reporting(0);

error_reporting — 设置应该报告何种 PHP 错误

error_reporting(0); // 关闭所有PHP错误报告

这句的意思就是关闭所有PHP错误报告

 

if (isset($_GET['password'])) {}

isset — 检测变量是否已设置并且非 NULL

如果 传参的值存在并且值不是 NULL 则返回 TRUE,否则返回 FALSE

如果一次传入多个参数,那么 isset() 只有在全部参数都以被设置时返回 TRUE 计算过程从左至右,中途遇到没有设置的变量时就会立即停止。

也就是说GET传参的参数password必须存在且值不能为NULL,只要满足条件就能执行if里边的语句了。

 

if (strcmp($_GET['password'], $flag) == 0) die($flag);

strcmp — 二进制安全字符串比较

语法:strcmp ( string $str1 , string $str2 ) : int

注意该比较区分大小写。

参数str1:第一个字符串。str2:第二个字符串。

如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0

也就是说要么传参password的值和变量$flag的值,相同;要么函数发生错误,返回0,0==0返回true

第一种不可行,因为我们不知道flag的值,第二种我们传入数组,这个函数将发生错误,并且返回数值00==0返回true,条件满足,输出flag

5.3之前的php中,显示了报错的警告信息后,返回数值0

 

所以只要传入数组就可以满足条件,获取flag

 

Payload?password[]=1

flag{Stll_better_d0uble_equas1ls}

 

 


打赏我,让我更有动力~

0 Reply   |  Until 2019-11-26 | 694 View
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.