CTF-PHP

  1. PHP弱类型
  2. PHP转换规则
  3. 题目
  4. 流程
  5. PHP文件包含
  6. 题目
    1. 如何查看flag.php文件
    2. 大体流程

PHP弱类型

php是一种弱类型语言,对数据的类型要求并不严格,可以让数据类型互相转换。
在php中有两种比较符号: =====

  • == :弱等于。在比较前会先把两种字符串类型转成相同的再进行比较。它不会比较变量类型,只比较值。
  • === :强等于。在比较前会先判断两种字符串类型是否相同再进行比较,如果类型不同直接返回不相等。既比较值也比较类型

PHP转换规则

  • 若一个数字和一个字符串进行比较或者进行运算时,PHP会把字符串转换成数字再进行比较
  • 若字符串以数字开头,则取开头数字作为转换结果,不能转换为数字的字符串或null,则转换为0
  • eg:”admin”是不能转换为数字的字符串,而”123”或”123aa”就是可以转换为数字的字符串)
  • 布尔值true和任意字符串都弱相等
  • var_dump(12=="12")                                   //true
    var_dump(12=="12aa")                               //true
    var_dump( "admin"==0)                               //true
    var_dump(false==""==0==NULL)                        //true
    var_dump(true=="hyuf")                              //true
    

题目

  • $num=$_GET['num'];
    if(!is_numeric($num))
    {
    echo $num;
    if($num==1)
    echo 'flag{******}';
    } 
    

流程

使用$定义一个变量$num
is_numeric() 函数用于检测变量是否为数字或数字字符串,如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回空值,即 FALSE
flag在第二个条件中
在第一个if语句,如果输入为数字,则打印输入的数字,不打印flag
所以我们要执行第二个if语句,所以不能单纯输入数字,否则会执行第一个if语句
为满足判断条件2,根据上述转换规则,输入的数字为1+非数字字符则满足判断条件2打印出flag

writeup

PHP文件包含

  • web 应用采用 include()、include_once()、require()、require_once()等文件包含函数,并且需要包含的文件路径是通过用户传输参数的方式引入;
  • 用户能够控制包含文件的参数,被包含的文件可被当前页面访问;

题目

  • <?php
           include "flag.php";
           $a = @$_REQUEST['hello'];
           eval( "var_dump($a);");
           show_source(__FILE__);
    ?> 
    
    
  • Include():包含并运行指定的文件,只有在程序执行到include时才包含文件,且当包含文件发生错误时,程序警告,但会继续执行。此时包含文件为flag.php

  • $_REQUEST["参数"],此时参数为hello,此时用于提供给用户输入

  • eval() 函数可将字符串转换为代码执行,并返回一个或多个值,此时用于执行我们想要的命令

  • var_dump()的功能是输出变量的信息,此时用于将运行结果输出给我们看

  • show_source()函数,可以使用show_source('flag.php')直接查看flag.php页面

    如何查看flag.php文件

    通过Linux的系统命令cat flag.php查看文件
    通过php函数show_source()函数直接查看

    大体流程

    • 使用php函数→用户输入→php函数转换→执行操作系统命令→获取flag
    • php函数直接查看flag

    本题定义了一个变量$a,以及赋一个用户可控的参数hello给$a,我们利用可控参数hello找到我们的flag,传值过程(hello→a→eval)eval函数将用户的输入转化为代码执行(执行系统命令)从而通过执行系统命令查看我们的flag.php文件

    因为已知页面有show_source()函数,可以使用show_source('flag.php')直接查看flag.php页面

    writeup


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至1694933467@qq.com