一道关于php文件包含的CTF题

一、源码

这是index.php的页面。

点击login后会发现url里多了action的参数,那么我们就可以通过它来获取源码。

?action=php://filter/read=convert.base64-encode/resource=login.php

再通过base64的解码可以查看源码。

index.php源码:

<?php
error_reporting(0);
session_start();
if (isset($_GET['action'])) {include $_GET['action'];exit();
} else {
?>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>Login</title><meta name="viewport" content="width=device-width, initial-scale=1.0"><link href="css/bootstrap.css" rel="stylesheet" media="screen">
</head>
<body>
<div class="container"><div class="form-signin"><?php if (isset($_SESSION['username'])) { ?><?php echo "<div class=\"alert alert-success\">You have been <strong>successfully logged in</strong>.</div>
<a href=\"index.php?action=logout.php\" class=\"btn btn-default btn-lg btn-block\">Logout</a>";}else{ ?><?php echo "<div class=\"alert alert-warning\">Please Login.</div>
<a href=\"index.php?action=login.php\" class=\"btn btn-default btn-lg btn-block\">Login</a>
<a href=\"index.php?action=register.php\" class=\"btn btn-default btn-lg btn-block\">Register</a>";} ?></div>
</div>
</body>
</html>
<?php
}
?>

login.php的源码:

<?phprequire_once('config.php');session_start();if($_SESSION['username']) {header('Location: index.php');exit;}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();}else {
?>
<!DOCTYPE html>
<html>
<head><title>Login</title><link href="static/bootstrap.min.css" rel="stylesheet"><script src="static/jquery.min.js"></script><script src="static/bootstrap.min.js"></script>
</head>
<body><div class="container" style="margin-top:100px">  <form action="login.php" method="post" class="well" style="width:220px;margin:0px auto;"><h3>Login</h3><label>Username:</label><input type="text" name="username" style="height:30px"class="span3"/><label>Password:</label><input type="password" name="password" style="height:30px" class="span3"><button type="submit" class="btn btn-primary">LOGIN</button></form></div>
</body>
</html>
<?php}
?>

register.php的源码:

<?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");$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();
} else {
?>
<!DOCTYPE html>
<html>
<head><title>Login</title><link href="static/bootstrap.min.css" rel="stylesheet"><script src="static/jquery.min.js"></script><script src="static/bootstrap.min.js"></script>
</head>
<body><div class="container" style="margin-top:100px">  <form action="register.php" method="post" class="well" style="width:220px;margin:0px auto;"><h3>Register</h3><label>Username:</label><input type="text" name="username" style="height:30px"class="span3"/><label>Password:</label><input type="password" name="password" style="height:30px" class="span3"><button type="submit" class="btn btn-primary">REGISTER</button></form></div>
</body>
</html>
<?php}
?>

config.php的源码:

<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root';
$dbname = 'web';?>

二、sql注入?

在审计代码的时候,发现了这么几行语句。

有sql的查询语句,那么是不是可以进行sql注入呢,其实不可以,因为这里使用了PHP的PDO处理,是很难进行注入的。

三、漏洞点

漏洞点当然还是在index.php下的include里,可以实现文件包含的漏洞,但要如何去实现呢?

我们可以去包含session文件,而想要包含session文件就需要知道文件的路径和文件的名字。

如何知道session文件的名字和路径

进入调试台,可以看到PHPSESSION,而session文件名一般是session值前面加一串ses_

至于路径的话,一般都是默认的那几个路径,网上查一查就知道了。

四、base64解码

根据这一行代码,我们可以知道,session文件中的内容是将username的值进行base64编码存放的。

那我们就需要把我们需要执行的命令写进用户名里。

我们来看看,session文件的内容。

既然它将我们的命令编码了,我们在url中也需要将其解码,我们就需要用php://filter伪协议。

运行完之后,发现失败了,那么是为什么呢?

四位一解码

我们查看session文件里的内容,根据base64的四位一解码,去掉无效字符我们发现

最后除了我们需要解码的内容外,只有三个数s28,这就会导致它向后面借了一位,就会使我们的命令解码出来是乱码,所以才失败。

那我们如何解决呢?

增加用户名长度

我们只需要增加用户名的长度,让其base64编码后的长度达到3位数,那么就可以解决这个问题了。

五、结果

http://127.0.0.1/include/session/index.php?action=php://filter/read=convert.base64-decode/resource=D:\phpstudy_pro\Extensions\tmp\tmp\sess_mt9ndl17bqmr1l1mlrodibtcsl

很明显我们成功了,不过需要注意的是,我们要显现出这个画面,要提前把index.php里的session_start();这句话给注释掉才行。

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

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

相关文章

可拖拽表单设计器都有哪些突出特点?

为了提高效率、降低开发成本&#xff0c;利用低代码技术平台的优势特点可以实现这一目标。究竟什么是低代码技术平台&#xff1f;都有哪些值得夸耀的特点和优势&#xff1f;今天&#xff0c;我们就带着这些问题&#xff0c;一起来了解低代码技术平台、可拖拽表单设计器的多个优…

第一周学习--联邦学习

OUC读研--第一周 目录 1、课程学习 2、fedavg的算法实现 关于代码详解 1、client __init__ 方法 local_train 方法 2、server 3、get_dataset 函数定义 数据集加载 MNIST 数据集 CIFAR-10 数据集 返回值 使用示例 4、 main 代码解释 可能的改进点 5、models …

【项目实用】SpringBoot整合日志功能插件

​分享不易&#xff0c;耗时耗力&#xff0c;麻烦给个不要钱的关注和赞吧 承接毕设指导&#xff0c;技术答疑&#xff0c;学习路上缺少导师的同学可以私信我 更多学习资料&#xff0c;公众号&#xff1a;墨轩学习网&#xff0c;B站&#xff1a;墨轩大楼 一、日志概述 日志记录…

安装WMware和Ubuntu并使用xShell连接

0、我的电脑配置 设备名称 hello 处理器 Intel(R) Core(TM) i7-10700K CPU 3.80GHz 3.79 GHz 机带 RAM 16.0 GB (15.9 GB 可用) 设备 ID 541EC230-9910-418C-9043-5FBBF8ED320C 产品 ID 00330-80000-00000-AA846 系统类型 64 位操作系统, 基于 x64 的处理器 笔和触控 没有可…

网络服务器及IO模型

网络服务器 单循环服务器&#xff1a;服务器在同一时刻只能响应一个客户端的请求 并发服务器模型&#xff1a;服务器在同一时刻可以响应多个客户端的请求 实现TCP并发服务器 1.多进程 2.多线程 3.IO多路复用&#xff1a; 为了解决进程或线程阻塞到某个 I/O 系统调用而出现的…

计算机视觉编程 3(图片处理)

目录 图像差分 高斯差分 形态学-物体计数 ​编辑 图片降噪 图像差分 # -*- coding: utf-8 -*- from PIL import Image from pylab import * from scipy.ndimage import filters import numpy# 添加中文字体支持 from matplotlib.font_manager import FontProperties font…

算法学习:一维数组的排序算法

【排序算法】八种排序算法可视化过程_哔哩哔哩_bilibili 1&#xff0c;冒泡排序&#xff1a; 冒泡排序(Bubble Sort): 冒泡排序是一种简单的排序算法,它通过重复地交换相邻的元素,直到整个序列有序。算法思路是:从第一个元素开始,依次比较相邻的两个元素,如果前者大于后者,就交…

51单片机最快能生成多高频率的方波?

前言 在嵌入式系统开发中&#xff0c;51 单片机作为一种非常非常非常经典&#xff0c;贯穿上下几十年的微控制器&#xff0c;被广泛应用于各种电子项目中。其中&#xff0c;生成特定频率的方波信号是一项常见的需求。 那么&#xff0c;51 单片机究竟能以多快的速度生成方波呢&…

c++类的继承

1.直接继承父类的方法 #include <iostream> #include <string>using namespace std; class Person{ public:void eat(){cout<<"在吃饭"<<endl;} }; class Student : public Person{ private:int age; public:string name;Student() {cout &…

Spring security 密码加密使用

一、密码加密 2011年12月21日&#xff0c;有人在网络上公开了一个包含600万个CSDN 用户资料的数据库&#xff0c;数据全部为明文储存&#xff0c;包含用户名、密码以及注册邮箱。事件发生后CSDN 在微博、官方网站等渠道发出了声明、解释说此数据库系2009 年备份所用&#xff0c…

外包干了2年,女朋友跑了...

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 简单的说下&#xff0c;我大学的一个同学&#xff0c;毕业后我自己去了自研的公司&#xff0c;他去了外包&#xff0c;快两年了我薪资、技术各个方面都有了很大的…

Salesforce篇——如何在lightning页面添加ListviewButton使用lwc组件

1.创建lwc组件&#xff0c;用于展示listview已选数据&#xff1a; html&#xff1a; <template><lightning-card title"Selected Records"><p>Selected Record IDs: {selectedIds}</p><lightning-button label"返回" onclick…

Spring中Bean的生命周期管理

Spring框架中的Bean生命周期是指从创建到销毁的整个过程。在这个过程中&#xff0c;Spring容器会负责管理Bean的状态和行为。以下是Spring中Bean生命周期的详细解释&#xff1a; 实例化&#xff1a;Spring容器根据Bean的定义信息&#xff0c;通过反射机制创建Bean对象。 设置属…

“阉割版”ADS还能遥遥领先吗?

文/王俣祺 导语&#xff1a;随着特斯拉FSD一次又一次的“入华无门”&#xff0c; 让国内车企智能驾驶的“内卷”之争迎来了喘息的余地&#xff0c;而“端到端”也成为现如今市场上的首要研发目标。早在今年4月份&#xff0c;华为就宣布其研发的HUAWEI ADS 3.0已经采用了最新的端…

Java-数据结构-包装类和认识泛型 !!!∑(゚Д゚ノ)ノ

目录&#xff1a; 一、包装类&#xff1a; 1、基本数据类型所对应的包装类&#xff1a; 2、装箱和拆箱&#xff1a; 二、 泛型&#xff1a; 1、什么是泛型&#xff1a; 2、语法&#xff1a; 三、泛型类的使用&#xff1a; 四、裸类型&#xff1a; 五、泛型的擦除机制&…

[oeasy]python031_[趣味拓展]unix起源_Ken_Tompson_Ritchie_multics

[趣味拓展]unix起源_Ken_Tompson_Ritchie_multics &#x1f94b; 回忆上次内容 上次 动态设置了 断点 断点 可以把代码 切成一段一段的可以 更快地调试 调试的目的 是 去除 bug 别害怕 bug 一步步 总能找到 bug这 就是 程序员基本功 调试 debug 在bug出现的时候 甚至…

Python 变量类型

Python 变量类型 变量赋值 多个变量赋值 标准数据类型 Python 数字 Python字符串 Python列表 Python 元组 Python 字典 Python数据类型转换 Python 变量类型 变量是存储在内存中的值&#xff0c;这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型…

【视频讲解】主成分分析原理与水果成熟数据实例:Python中PCA-LDA 与卷积神经网络CNN...

全文链接&#xff1a;https://tecdat.cn/?p37450 分析师&#xff1a;Shixian Ding 主成分分析&#xff08;PCA&#xff09;作为数据科学中用于可视化和降维的重要工具&#xff0c;在处理具有大量特征的数据集时非常有用。就像我们难以找到时间阅读一本 1000 页的书&#xff0…

实现流程化办公,可专注于开源可视化报表设计器!

近日&#xff0c;有很多粉丝和朋友们会问我们关于低代码技术平台、开源可视化报表设计器的相关内容和问题。其实&#xff0c;在流程化办公新时代&#xff0c;愿意启用新软件平台的客户朋友会收获市场红利&#xff0c;也会站在前沿之地上斩获更多市场份额。今天我们就一起来了解…

随机森林与线性回归

集成学习方法之随机森林 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过组合多个分类器来提高预测性能的方法。主要分为三种类型:Bagging、Boosting和Stacking。以下是集成学习的基本步骤和概念&#xff1a; 1数据采样&#xff1a;从训练集中有放回地随机抽取…