【BuuCTF】BadySQli

题目描述

纯粹的SQL注入题

随意传入

复制代码
name=abc&pw=a

返回 wrong user

尝试传入

复制代码
name=1%27&pw=a

发现闭合方式为',同时给出了一个可疑字符串

把这段字符串丢进ChatGPT,告诉我们可能是Base32编码的,对其进行Base32解码得到字符串

复制代码
c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==

这显然是Base64编码的,再对其解码,得到明文

复制代码
select * from user where username = '$name'

显然这道题的注入点就是name

题解

在尝试的过程中发现以下字符串被过滤

复制代码
or  =   (   )  

但是由于对大小写不敏感,or可以使用大小写方式进行绕过

传参:

复制代码
name=1' Or 1#&pw=a

返回 wrong pass

说明name已经注入成功了,但是却要校验pw参数。

由于当name的值为1'时,会返回错误的语句,正常的思路是使用报错注入,得到数据库的信息,但是过滤了(),因此也无法进行数据库的查询。

题目给了源代码,点入search.php的源代码,关键代码如下:

其登录逻辑是,根据name到数据库中查找,将查找到的用户名对应的md5加密的密码与传入的pw的md5值进行比较(即存储在数据库中的是密码的md5值),若相等,则登录成功。这与CTF比赛中常见的直接对用户名参数进行注入不同。

当我们传入name=1' Or 1#&pw=a时,查询的结果是用户admin的用户名和密码,即$arr[1]的值是admin$arr[2]的值是admin用户的密码。当pw的md5值与$arr[2]的值相等时,就返回flag。而admin用户的密码是我们无法得到的。

因此我们需要控制$arr[2]的值,将其赋值为pw参数的md5值。当传参如下时:

复制代码
name=1' union select 1,"admin",3#&pw=a

返回也是 wrong pass,说明用户名存储在表中的第二列,猜测密码存储在第三列,传参:

复制代码
name=1' union select 1,"admin","0cc175b9c0f1b6a831c399e269772661"#&pw=a

其中0cc175b9c0f1b6a831c399e269772661a 的md5值,这样传参,$arr[1]的值为admin$arr[2]的值为0cc175b9c0f1b6a831c399e269772661

总结

本题的登录逻辑与一般的题目不同,源码中的查询语句并非是

复制代码
select * from user where username = '$name' && password = '$pw'

而是

复制代码
select * from user where username = '$name'

先选择与用户名匹配的记录,记录中存储的是用户名和密码的md5值 ,再将查询到的密码的md5值与传入参数的md5值进行比较。

相关推荐
dogstarhuang1 小时前
OpenAI GPT-5.6 降价后如何重算 API 账单?多模型路由与成本治理实战
服务器·网络·人工智能·大模型·api·ai应用开发·接口管理
苏宸啊1 小时前
linux网络编程udp服务器和客户端代码编写(echo版本和字典版本)
linux·网络
Latticy1 小时前
vulnhub系列靶机-mrRobot
web安全·网络安全·渗透测试
奇树谦3 小时前
HDD 为什么适合顺序大文件读写:从 RAID 5 到 RAID 50 的原理与性能分析
linux·运维·网络
嵌入式阿蔡3 小时前
Linux_01:交叉编译与开发环境实战——从单片机跨到 Linux 的第一道坎
linux·运维·网络·单片机·嵌入式硬件·嵌入式实时数据库
雷电小将军5 小时前
诡秘之主手游占卜家序列加点 诡秘之主手游占卜家怎么加点
服务器·网络·游戏·电脑·玩游戏
陈皮波比茶5 小时前
Python项目实战-网络机器人(爬虫)
开发语言·网络·爬虫·python·机器人
白猫不黑5 小时前
网络安全/信息安全专业学习路线与入行指南:从大学到岗位的完整规划
网络·学习·安全·web安全·网络安全·黑客技术
wWYy.5 小时前
Linux发送数据包的过程
linux·网络
云飞云共享云桌面5 小时前
自动化设备厂 10 人研发团队,如何共用一台服务器做 SolidWorks 建模?
运维·服务器·网络·3d·自动化·制造