web105-112

web105

开启容器

代码审计

考察php变量覆盖

这边运用foreach函数

  1. 处理$_GET数据

    1
    2
    3
    4
    5
    6
    foreach($_GET as $key => $value){
    if($key==='error'){
    die("what are you doing?!");
    }
    $$key=$$value;
    }
    • 遍历$_GET数组中的每个键值对。
    • 如果键($key)是error,则程序会输出"what are you doing?!"并终止执行。
    • 否则,将键和值都作为变量名,并将值赋给这个新变量。例如,如果$_GET中有?name=John,那么代码会创建一个变量$name,并将其值设置为$John的值(注意这里是$$value,即变量的变量)。
  2. 处理$_POST数据

    1
    2
    3
    4
    5
    6
    foreach($_POST as $key => $value){
    if($value==='flag'){
    die("what are you doing?!");
    }
    $$key=$$value;
    }
    • 遍历$_POST数组中的每个键值对。
    • 如果值($value)是flag,则程序会输出"what are you doing?!"并终止执行。
    • 否则,将键和值都作为变量名,并将值赋给这个新变量。例如,如果$_POST中有age=25,那么代码会创建一个变量$age,并将其值设置为$25的值。

之中$$key=$$value;是会导致变量覆盖的关键

本地调试达到die函数可以输出变量

那我们直接

在$error中覆盖flag即可

这边先get后post

不能直接posterror=flag,因为在POST中如果value为flag则会爆错,但是get没有所以,我们get传入?suces=flag

之后post
`error=suces

web106

开启容器

代码审计

也是SHA1绕过

1
2
3
4
aaK1STfY
0e76658526655756207688271159624026011393
aaO8zKZF
0e89257456677279068558073954252716165668

web107

开启容器

代码审计

这里有一个parse_str函数
本地调试,将一组字符串分割出一个数组

直接将flag为v3的md5即可,这里注意要试下大写和小写的md5

web108

开启容器

代码审计

  • 使用ereg()函数(正则表达式匹配)检查$_GET['c']的值是否只包含英文字母(大小写均可)。
  • ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配

?c=a%00778

  • strrev($_GET['c']):将$_GET['c']的值反转。例如,如果$_GET['c']的值是"123",反转后会变成"321"

传入aaa%00778

web109

开启容器

代码审计

这里用异常处理类

1
2
3
payload: 
?v1=Exception&v2=system('cat fl36dg.txt')
?v1=Reflectionclass&v2=system('cat fl36dg.txt')

其实除了异常类,只要是用php内置类让v1不进行报错,v2执行命令即可

PHP提供了许多内置类,这些类涵盖了各种功能,从错误处理到数据库操作,从文件系统操作到网络通信等。以下是一些常见的PHP内置类:

1. 错误处理和异常

  • Exception:PHP的基异常类,用于处理运行时错误。
  • Error:PHP 7引入的基错误类,用于处理致命错误。
  • PDOException:与数据库相关的异常类,用于PDO扩展。

2. 数据库操作

  • PDO:PHP数据对象(PHP Data Objects),用于访问数据库的通用接口。
  • MySQLi:MySQL改进扩展,用于与MySQL数据库交互。
  • MongoDB:用于与MongoDB数据库交互的类。

3. 文件系统操作

  • SplFileObject:用于读取和写入文件的对象接口。
  • DirectoryIterator:用于遍历目录的迭代器。
  • FilesystemIterator:用于遍历文件系统的迭代器。

4. 字符串操作

  • SplString:用于字符串操作的类(较少使用)。
  • SimpleXMLElement:用于处理XML数据的类。

5. 网络通信

  • SoapClient:用于与SOAP Web服务通信的类。
  • HttpRequest:用于发送HTTP请求的类(需要安装pecl/http扩展)。

6. 数据结构

  • SplStack:栈数据结构。
  • SplQueue:队列数据结构。
  • SplHeap:堆数据结构。
  • SplFixedArray:固定大小的数组。

7. 日期和时间

  • DateTime:用于处理日期和时间的类。
  • DateInterval:用于表示时间间隔的类。
  • DatePeriod:用于表示日期周期的类。

8. 反射

  • ReflectionClass:用于反射类的信息。
  • ReflectionMethod:用于反射方法的信息。
  • ReflectionProperty:用于反射属性的信息。

9. 会话管理

  • SessionHandler:用于自定义会话存储的类。
  • SessionUploadProgress:用于处理文件上传进度的类。

10. 其他

  • stdClass:一个空的类,通常用于存储数据。
  • Closure:用于表示匿名函数的类。
  • Generator:用于表示生成器的类。

以上都可以

web110

开启容器

代码审计

考察内置类

可以使用FilesystemIterator文件系统迭代器来进行利用,通过新建FilesystemIterator,使用getcwd()来显示当前目录下的文件结构

1
?v1=FilesystemIterator&v2=getcwd

直接访问即可

web111

开启容器

代码审计

var_dump()函数用于输出变量的相关信息

可以看到这里还是对v1和v2进行了正则的过滤,然后如果$v1有ctfshow,会进入getFlag函数

然后会执行$ctfshow = $$v2

这里用全局变量GLOBALS

$GLOBALS — 引用全局作用域中可用的全部变量 一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

1
?v1=ctfshowweb&v2=GLOBALS

web112

开启容器

代码审计

1
2
3
4
php://filter/resource=flag.php
php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=flag.php
php://filter/read=convert.quoted-printable-encode/resource=flag.php
compress.zlib://flag.php