zoukankan      html  css  js  c++  java
  • [极客大挑战 2019]BuyFlag

    0x01

    进入页面如下

    结合题目buyflag的提示,我们点击payflag看看

    查看一下源码

    发现端倪

    0x02

    if (isset($_POST['password'])) {
    	$password = $_POST['password'];
    	if (is_numeric($password)) {
    		echo "password can't be number</br>";
    	}elseif ($password == 404) {
    		echo "Password Right!</br>";
    	}
    }
    

    这里跟以前做过的一个“矛盾”的ctf题目很相似,首先它判断你是不是数字,如果是,就错误,如果不是数字再判断你是不是等于404,如果等于404,则密码正确。很显然,这里的考点就是is_numeric这个函数,那么我们来看看这个函数有什么特别

    PHP is_numeric() 函数

    is_numeric() 函数用于检测变量是否为数字或数字字符串。

    语法:

    bool is_numeric ( mixed $var )
    

    $var:要检测的变量。

    返回值:

      如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。

    is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断!

    那知道这个就好说了,我们直接404%20,就可以同时过第一个判断和第二个判断,下面尝试

    0x03

    但我们把密码改了之后,发现提示我们数字长度太大,但是要让我们买flag还必须有这么多的钱,那我们就需要对money这个参数动点脑筋了,有什么办法让它不需要输入那么多数字,还能满足它对money的判断

    PHP strcmp() 函数

    要求的是传入两个字符串,那如果我们传入一个非字符串会出现什么结果呢?当我们传入一个非字符串的时候,函数会报错,但同时会返回结果0,也就是说虽然报错,但返回的结果0意味着相等,那么如何可以传入一个非字符串呢?用数组。

    所以这里我们将money这个变量改成数字形式

    再这里同样还有一个点需要注意,平时的时候我们的cookie一般是PHPSESSID,但是这里却不是,这里的user,本来这里的值是user=0,那么我们将其改为1,其可能是判断用户的一个方式

    下面是返回结果

    拿到flag

    总结

    主要是考察php中某些函数的用法和漏洞利用

  • 相关阅读:
    一个用php抓取网页中电子邮箱的实例
    jQuery中ajax加载文本
    phantomjs介绍(js网页截屏、javascript网页解析渲染工具)
    delphi 如何获取大于2G的物理内存大小[delphi]
    DELPHI——过程与函数[delphi]
    Delphi初始化和析构 initialization和finalization
    Delphi执行DOS命令显示到文本框
    MYSQL基础集合函数(count,sun,avg,max,min)
    MYSQL基础链接查询(内连接查询,外连接查询)
    MYSQL基础合并查询结果(UNION)
  • 原文地址:https://www.cnblogs.com/Jleixin/p/13297548.html
Copyright © 2011-2022 走看看