• Code-Audit(代码审计)习题记录4-5


    4、习题4

    题目内容如下:

    1. error_reporting(0);
    2. show_source(__FILE__);
    3. $a = @$_REQUEST['hello'];
    4. eval("var_dump($a);");
    函数解释

    $REQUEST — HTTP Request 变量,默认情况下包含了 [$GET],[$POST] 和 [$COOKIE]的数组。

    var_dump() var_dump() 函数用于输出变量的相关信息。var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

    eval() 函数把字符串当作php 代码来执行

    代码分析

    总的来说就是eval函数来执行命令,从而获取flag。但是var_dump() 函数执行后,无法被eval函数当作php代码执行,因此,需要在var_dump() 函数执行的之后,就完成类似于 whoami这样的命令执行。

    理解测试:

    执行下面的代码,会直接打印字符

    php -r "eval(var_dump('whoami'));" 
    

    但是 反引号位 (`) 是可以执行命令的

    因此执行下面代码,会输出root 等用户名

    php -r "eval(var_dump(`whoami`));"

    所以可以构造执行命令,查找当前含有flag 的文件,然后读物文件来获取flag

    构造ls命令,获取当前目录文件 index.php和lib.php

    ?hello=`ls`

    读取 lib.php 文件的内容

    ?hello=`cat lib.php`

    显示内容长度为41,但是没有看到内容,右键查看源代码,得到flag ,原来是被注释掉了

     

    flag{yczxtsadjadljada}

    使用tac 命令,可以直接输出flag

     5、习题5

    题目内容如下

     

    代码如下:

    1. if (isset($_GET['name']) and isset($_GET['password'])) {
    2. if ($_GET['name'] == $_GET['password'])
    3. echo '

      Your password can not be your name!

      '
      ;
    4. else if (sha1($_GET['name']) === sha1($_GET['password']))
    5. die('Flag: '.$flag);
    6. else
    7. echo '

      Invalid password.

      '
      ;
    8. }
    9. else{
    10. echo '

      Login first!

      '
      ;
    11. ?>

    经过代码分析,可以知道,首先GET 传入两个值,一个name 另一个password 首先就是这两个参数的值不一样,不然$GET['name'] == $GET['password'] 就会报错,接着,name和password 的sha1 的值要相等,并且这个相等采用了 === ,即不能采用弱类型比较===只有在相同类型下,才会比较其值。这样满足条件后,才能输出flag

    函数解释:

    die() 函数输出一条消息,并退出当前脚本。该函数是exit()函数的别名。

    有意思的是 sha1不能处理数组,构造paylaod

     name[]=1&password[]=2

    当我们传入name[]=1&password[]=2时,会造成sha1(Array) === sha1(Array),即NULL===NULL,从而吐出flag

    Flag: flag{tczdaljdasnqw}

     

  • 相关阅读:
    Dockerfile架设LNMP
    LLVM之父Chris Lattner:为什么我们要重建AI基础设施软件
    python实现adb辅助点击屏幕工具
    .net也能写内存挂
    儿童台灯怎么选对眼睛最好?2022年的现在如何挑选儿童台灯呢
    js获得相对路径文件,并上传到服务器
    【网络安全-键盘监视】学会以后去捉弄舍友,看他有了什么不可告人的秘密
    使用venv为Python项目创建一个独立的虚拟环境
    IP地址 0.0.0.0 和 127.0.0.1之间的区别
    Leetcode 283. Move Zeroes
  • 原文地址:https://blog.csdn.net/shelbytt/article/details/136221782