当前位置: 首页 > article >正文

BUUCTF[极客大挑战 2019]EasySQL 1题解

[极客大挑战 2019]EasySQL题解

  • 分析
  • 解题过程
    • 漏洞原理分析
    • 明确注入点:
    • 尝试万能密码法
      • 法一
      • 法二
  • 总结

分析

从题目分析,这道题应该与SQL注入有关,启动靶机之后,访问url是一个登录界面,随便输入用户名密码之后,发现用的还是[GET]请求👍。那基本可以确定本题一定与SQL注入有关。
登录界面
GET型

  • SQL注入的漏洞是基于数据库命令的底层逻辑,在互联网初期,没有人对SQL注入进行预防,这就导致很多历史遗留问题。
    迄今为止还是WEB中十大常见漏洞之一

解题过程

漏洞原理分析

对于上面的登录界面,后端验证用户名和密码是否匹配的数据库的查询语句可能是下面这样的格式:

select * from table_name where username=变量1 and password=变量2; 

其中的变量1是我们在用户名中输入的字符,变量2是我们在password中输入的字符。SQL注入出现的原理是SQL语句对变量和命令的界定不够清晰,我们可以构造合适的输入变量改变整个SQL查找语句的功能。

明确注入点:

SQL注入的类型主要分为数字型字符型,分类标准就是变量的数据类型:
对于数字型

select * from table_name where username=变量1 and password=变量2; 

我们构造输入

1 and 1=1 #回显正常
1 and 1=2 #回显异常

而对于字符型,关键在于试着找出变量是用什么符号闭合的,常见的符号有'单引号'“双引号”()[]等。

select * from table_name where username='变量1' and password='变量2'; 
select * from table_name where username="变量1" and password="变量2"; 

对于这道题我们构造输入

1'

直接报错,这说明我们输入的'与前面的某个引号闭合,导致最后多出来一个单独的‘,详细情况如下:

select * from table_name where username='1'' and password='变量2'; 

这样我们确定本题有注入点,并确定注入类型是字符型。

尝试万能密码法

这好像是CTF中独有的技巧因为一般的渗透都会直接入侵后端(谁和你过家家😅)

法一

我们通过or的逻辑结构,构造前端的payload,以跳过判断逻辑:

?usename=1' or '1'='1&password=1' or '1'='1

后端代码:

select * from table_name where username='1' or '1'='1' and password='1' or '1'='1'; 

对与门(and)和或门(or)有一定了解的读者很容易理解上面的代码,where后面的语句一定是真(1),这样就跳过了SQL语句对用户名和密码的判断。
最后的结果是:
flag
flag{c245efae-9088-4dec-8c2e-5c34c73392e9}

法二

上面的方法对于hacker来说还是太讲理了,不够实用,我们直接构造payload:

?username=1' or true #&password=1
select * from table_name where username='1' or true #' and password='1'; 

这个方法直接使用#注释掉了后面的语句,同样可以获得flag。

总结

这是一道初级的SQL注入题目,与渗透测试的实际环境有出入,主要的考察点是SQL类型判断以及构造payload。

http://www.lryc.cn/news/2398564.html

相关文章:

  • Css样式中设置gap: 12px以后左右出现距离问题解析
  • MySQL问题:count(*)与count(1)有什么区别
  • 大模型 提示模板 设计
  • excel表格记账 : 操作单元格进行加减乘除 | Excel中Evaluate函数
  • 20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s
  • 如何合理设计缓存 Key的命名规范,以避免在共享 Redis 或跨服务场景下的冲突?
  • Trae CN IDE自动生成注释功能测试与效率提升全解析
  • 让AI弹琴作曲不再是梦:Python+深度学习玩转自动化音乐创作
  • C++概率论算法详解:理论基础与实践应用
  • ssh登录wsl2
  • 黑马Java面试笔记之 消息中间件篇(Kafka)
  • LeetCode - 234. 回文链表
  • PYTHON通过VOSK实现离线听写支持WINDOWSLinux_X86架构
  • nginx+tomcat动静分离、负载均衡
  • SQL进阶之旅 Day 13:CTE与递归查询技术
  • 【PmHub面试篇】Gateway全局过滤器统计接口调用耗时面试要点解析
  • neo4j 5.19.0两种基于向量进行相似度查询的方式
  • 项目课题——基于ESP32的智能插座
  • 华为云Flexus+DeepSeek征文|利用华为云 Flexus 云服务一键部署 Dify 平台开发文本转语音助手全流程实践
  • ck-editor5的研究 (7):自定义配置 CKeditor5 的 toolbar 工具栏
  • MPLS-EVPN笔记详述
  • 嵌入式Linux系统中的启动分区架构
  • 无人机甲烷检测技术革新:开启环境与能源安全监测新时代
  • mysql数据库实现分库分表,读写分离中间件sharding-sphere
  • [Python] struct.unpack() 用法详解
  • 普通二叉树 —— 最近公共祖先问题解析(Leetcode 236)
  • Spring AOP:面向切面编程 详解代理模式
  • 零知开源——STM32F407VET6驱动ILI9486 TFT显示屏 实现Flappy Bird游戏教程
  • 数据安全中心是什么?如何做好数据安全管理?
  • Monorepo 详解:现代前端工程的架构革命