web_020

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

web_020

 

 

标签:CTF | isset() | MD5加密 | 代码审计

提示:四星题目开始加大难度了~仔细想想吧~


打开网址

 

 

if (isset($_GET['a']) and isset($_GET['b'])) {

 

    if ($_GET['a'] != $_GET['b']){

 

     if (md5($_GET['a']) === md5($_GET['b']))

         die('Flag: '.$flag);

 

    }else{

        print 'Wrong.';

    }

}

 

代码解释

if (isset($_GET['a']) and isset($_GET['b'])) {}

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

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

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

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

 

if ($_GET['a'] != $_GET['b']){}

这句的意思是如果传参a的值和传参b的值不相等就可以执行if里边的语句了,否则就输出"Wrong"

 

if (md5($_GET['a']) === md5($_GET['b'])) die('Flag: '.$flag);

这句话的意思是传参a的值和b的值都先经过md5加密的值要求严格相等。

md5是不能处理数组的,md5(数组)会返回null,所以md5(a[])==null,md5(b[])==nullmd5(a[])===md5(b[]) --> null === null 返回true,这样就得到flag了。

 

因此向GET传参两个名为ab的不相等的数组,从而导致md5()均返回空,于是得到flag

 

Payload?a[]=1&b[]=2

Flag: flag{dq80g_fjdk456rwr47jl}

 


打赏我,让我更有动力~

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

© 2016 - 2022 掌控者 All Rights Reserved.