buuctf-web 解题过程
[SUCTF 2019]Upload Labs 2
源码
// admin.php
<?php
include 'config.php';
class Ad{
    public $cmd;
    public $clazz;
    public $func1;
    public $func2;
    public $func3;
    public $instance;
    public $arg1;
    public $arg2;
    public $arg3;
    function __construct($cmd, $clazz, $func1, $func2, $func3, $arg1, $arg2, $arg3){
        $this->cmd = $cmd;
        $this->clazz = $clazz;
        $this->func1 = $func1;
        $this->func2 = $func2;
        $this->func3 = $func3;
        $this->arg1 = $arg1;
        $this->arg2 = $arg2;
        $this->arg3 = $arg3;
    }
    function check(){
        $reflect = new ReflectionClass($this->clazz);
        $this->instance = $reflect->newInstanceArgs();
        $reflectionMethod = new ReflectionMethod($this->clazz, $this->func1);
        $reflectionMethod->invoke($this->instance, $this->arg1);
        $reflectionMethod = new ReflectionMethod($this->clazz, $this->func2);
        $reflectionMethod->invoke($this->instance, $this->arg2);
        $reflectionMethod = new ReflectionMethod($this->clazz, $this->func3);
        $reflectionMethod->invoke($this->instance, $this->arg3);
    }
    function __destruct(){
        system($this->cmd);
    }
}
if($_SERVER['REMOTE_ADDR'] == '127.0.0.1'){
    if(isset($_POST['admin'])){
        $cmd = $_POST['cmd'];
        $clazz = $_POST['clazz'];
        $func1 = $_POST['func1'];
        $func2 = $_POST['func2'];
        $func3 = $_POST['func3'];
        $arg1 = $_POST['arg1'];
        $arg2 = $_POST['arg2'];
        $arg2 = $_POST['arg3'];
        $admin = new Ad($cmd, $clazz, $func1, $func2, $func3, $arg1, $arg2, $arg3);
        $admin->check();
    }
}
else {
    echo "You r not admin!";
}
// func.php
<?php
include 'class.php';
if (isset($_POST["submit"]) && isset($_POST["url"])) {
    if(preg_match('/^(ftp|zlib|data|glob|phar|ssh2|compress.bzip2|compress.zlib|rar|ogg|expect)(.|\\s)*|(.|\\s)*(file|data|\.\.)(.|\\s)*/i',$_POST['url'])){
        die("Go away!");
    }else{
        $file_path = $_POST['url'];
        $file = new File($file_path);
        $file->getMIME();
        echo "<p>Your file type is '$file' </p>";
    }
}
?>
// class.php
<?php
include 'config.php';
class File{
    public $file_name;
    public $type;
    public $func = "Check";
    function __construct($file_name){
        $this->file_name = $file_name;
    }
    function __wakeup(){
        $class = new ReflectionClass($this->func);
        $a = $class->newInstanceArgs($this->file_name);
        $a->check();
    }
    function getMIME(){
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $this->type = finfo_file($finfo, $this->file_name);
        finfo_close($finfo);
    }
    function __toString(){
        return $this->type;
    }
}
class Check{
    public $file_name;
    function __construct($file_name){
        $this->file_name = $file_name;
    }
    function check(){
        $data = file_get_contents($this->file_name);
        if (mb_strpos($data, "<?") !== FALSE) {
            die("<? in contents!");
        }
    }
}
题目分析
flag的位置在admin.php中的__destruct
但是要实例化admin.php中的Ad类,必须是127.0.0.1登录,所以我们必须找到ssrf的利用点~~
实例化(instantiate)是指在面向对象的编程中,把用类创建对象的过程称为实例化。
是将一个抽象的概念类,具体到该类实物的过程。实例化过程中一般由类名 对象名 = new 类名(参数1,参数2...参数n)构成。
在面向对象的编程中,通常把用类创建对象的过程称为实例化,其格式如下:
如 Date date=new Date();
就是用日期类创建了一个日期的对象,就叫对象的实例化。
多数语言中,实例化一个对象就是为对象开辟内存空间,或者是不用声明,直接使用new 构造函数名,建立一个临时对象。
我们看到class.php中的__wakeup(),可以实例化任意类,所以我们要找到发序列化的点
在func.php中我们知道,当我们查看我们的上传文件时,会调用getMIME,而finfo_open也会触发phar反序列化
BUU XXE COURSE 1[xxe]
参考:https://blog.csdn.net/I_ET5u5/article/details/137650668
靶场界面

查找关键
打开网络,鼠标随便点空白处,出来一个login.php

抓包
可以看到有一个内嵌的xml

添加外部实体
root根元素(可以理解为类),为其添加一个外部实体(可以理解为类下的方法)
<!DOCTYPE root [
<!ENTITY admin SYSTEM "file:///flag"> ]>
这样在根元素root下有了一个外部实体admin,admin含有一个SYSTEM关键字,XML的解释器会在后续引用admin的时候,将会打开flag的内容并对username内的内容进行替换
在root根元素中对其进行引用
&admin;
send


[NCTF2019]Fake XML cookbook
分析


send

BUU XSS COURSE 1(XSS获取cookie登录)
尝试
可以看到留言可以保存,或许会储存xxs点

Cookie的一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,(如果该Cookie尚未到期)浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。
xss尝试
输入,提交

进入这个网址
什么都没有
看师傅wp
https://blog.csdn.net/m0_73866435/article/details/136354404
输入这个
< img src=# onerror=alert(/桃梨早/)>

buuctf-web 解题过程的更多相关文章
- Wirte-up:攻防世界Web解题过程新手区01-06
		文章更新于:2020-02-18 说明:为了标识图片边界,有些图片加了红线以增强观感. 注1: web 环境搭建参见: Windows&linux使用集成环境搭建 web 服务器 注2:DVW ... 
- BuuCTF Web Writeup
		WarmUp index.php <html lang="en"> <head> <meta charset="UTF-8"> ... 
- CentOS 5.5 下安装Countly Web Server过程记录
		CentOS 5.5 下安装Countly Web Server过程记录 1. 系统更新与中文语言包安装 2. 基本环境配置: 2.1. NodeJS安装 依赖项安装 yum -y install g ... 
- Http协议简单解析及web请求过程
		HTTP协议: HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统. 基于HTTP协议的客户端/服务器请求响应机制的信息交换过程包含下面几个步骤: 1) ... 
- 《深入分析Java Web技术内幕》读书笔记 - 第1章 深入Web请求过程
		第1章 深入Web请求过程 1 1.1 B/S网络架构概述 2 基于统一的应用层协议HTTP来交互数据. 1.2 如何发起一个请求 4 HTTP连接本质是建立Socket连接.请求实现方式:工具包如H ... 
- A+B Format 思路及解题过程结果
		A+B Format 思路及解题过程结果 github链接 题目 解题思路 这个题目的难点在于每三位用逗号隔开,以及带不带负号的问题.第一个问题,我的解决办法是先通过取整来取数,再通过取余来去数.第二 ... 
- Web请求过程总结
		Web请求过程总结 1.CND架构图 图片来源:深入分析JavaWeb技术内幕(许令波著) 2.发起HTTP请求 发起一个HTTP请求就是浏览器建立socket通信的过程,HttpClient开源的通 ... 
- 一个蒟蒻的解题过程记录——洛谷P1003 铺地毯
		这到题算是我“火线回归”后码的第一道题,病好了心情不错,发篇博客分享一下 目录: ·题目描述 ·题目分析 ·解题思路 ·代码实现 ·总结 ·题目描述: 为了准备一场特殊的颁奖典礼,组织者在会场的一片矩 ... 
- 爬取百度页面代码写入到文件+web请求过程解析
		一.爬取百度页面代码写入到文件 代码示例: from urllib.request import urlopen #导入urlopen包 url="http://www.baidu.com& ... 
- web 攻击靶机解题过程
		sql注入靶机攻击过程请参考 https://pentesterlab.com/exercises/from_sqli_to_shell/course http://www.sohu.com/a/12 ... 
随机推荐
- kubectl get deploy
			for i in `kubectl get deployments.apps -n nvpc-apps-02|grep -v NAME|awk '{print $1}'`; do kubectl ge ... 
- sudo kill -HUP 10146
			systemctl status docker systemctl reload docker 
- SDK连接节点失败排查思路
			https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/faq/connect.html Important: 前置说明 1 ... 
- mac 安装mysql详细教程(安装包方式)
			一:下载最新的MySQL社区版 为了安装更方便,建议下载dmg安装包.最新的版本是5.7.20. MySQL 二:安装MySQL 双击 mysql-5.7.20-macos10.12-x86_64 ... 
- Qt编写监控Onvif综合示例(支持云台/预置位/抓图/事件订阅等)
			一.功能特点 广播搜索设备,支持IPC和NVR,依次返回. 可选择不同的网卡IP进行对应网段设备的搜索. 依次获取Onvif地址.Media地址.Profile文件.Rtsp地址. 可对指定的Prof ... 
- Qt开源作品43-超级图形字体
			一.前言 对于众多的Qter程序员来说,美化UI一直是个老大难问题,毕竟这种事情理论上应该交给专业的美工妹妹去做,无奈在当前整体国际国内形式之下,绝大部分公司是没有专门的美工人员的,甚至说有个兼职的美 ... 
- Qt编写可视化大屏电子看板系统21-数据转曲线
			一.前言 数据转曲线,这个用的非常多,比如串口或者网络收到的数据,对特定的字节数据绘制实时的曲线,或者对历史记录存储的数据进行曲线绘制,按照约定的规则,数据转曲线绘制必须提供规则,没有规则只能对所有数 ... 
- [转]如何将 PDF 批量导入到iPhone或iPad?| 技能Get!
			电脑上没看完的 PDF,想在移动端继续阅读? 问题来了!如何随身携带大量PDF文档?如何将电脑上的 PDF 文档快速导入到你的 iPhone 和 iPad 呢?链接数据线已经 out 了,现在告诉大家 ... 
- Python 进阶:深入理解 import 机制与 importlib 的妙用
			大家好,今天我们来深入探讨 Python 中的导入机制和 importlib 模块.相信不少朋友和我一样,平时写代码时可能只用过最基础的 import 语句,或者偶尔用 importlib.impor ... 
- 《C++并发编程实战》读书笔记(4):原子变量
			1.标准原子类型 标准原子类型的定义位于头文件<atomic>内.原子操作的关键用途是取代需要互斥的同步方式,但假设原子操作本身也在内部使用了互斥,就很可能无法达到期望的性能提升.有三种方 ... 
