【BUUCTF】BabySQli
【BUUCTF】BabySQli
题目来源
收录于:BUUCTF GXYCTF2019
题目描述
纯粹的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
其中0cc175b9c0f1b6a831c399e269772661
是a的md5值,这样传参,$arr[1]
的值为admin
,$arr[2]
的值为0cc175b9c0f1b6a831c399e269772661
总结
本题的登录逻辑与一般的题目不同,源码中的查询语句并非是
select * from user where username = '$name' && password = '$pw'
而是
select * from user where username = '$name'
先选择与用户名匹配的记录,记录中存储的是用户名和密码的md5值,再将查询到的密码的md5值与传入参数的md5值进行比较。
【BUUCTF】BabySQli的更多相关文章
- 【BUUCTF】强网杯 2019随便注1 write up
输入万能密码1' or 1=1# ,判断存在sql注入, SQL注入的万能密码实际上是利用了网址后台的漏洞,打开下面的网址不用密码和账号也可以登录后台. 万能密码原理: 万能密码能够绕过sql检测,在 ...
- 【BUUCTF】ACTF2020 新生赛Include1 write up
查看源代码+抓包都没有发现什么信息,只有这两个东东 <meta charset="utf8"> Can you find out the flag? <meta ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
随机推荐
- LeetCode721 账户合并
题解 对于\(vector<vector<string>> accounts\),我们定义\(accounts[i]\)为一个列表项.对于\(accounts\)中的一条列表项 ...
- vscode使用github
1, vscode打开terminal,生成RSA密钥,并查看蜜月 PS D:\code\SQL> git init Reinitialized existing Git repository ...
- 企业IT基础资源管理的“帮帮团”上线啦——源启云原生基础设施管理平台
为助力企业提升基础资源一体化管理和交付效率,以更先进的基础设施管理方式来满足现代企业业务持续扩展和复杂化的需要,中电金信运用基础设施即代码(Infrastructure as Code,简称IaC)技 ...
- 2024年1月Java项目开发指南9:密码加密存储
提前声明: 你不会写这加密算法没关系啊,你会用就行. 要求就是:你可以不会写这个加密算法,但是你要知道加密流程,你要会用. @Service public class PasswordEncrypto ...
- Qt开发经验小技巧91-100
数据库处理一般建议在主线程,如果非要在其他线程,务必记得打开数据库也要在那个线程,即在那个线程使用数据库就在那个线程打开,不能打开数据库在主线程,执行sql在子线程,很可能出问题. 新版的QTcpSe ...
- Qt编写地图综合应用23-标注点交互
一.前言 地图项目应用中,标注点的交互使用频率非常高,这应该是最常用的场景,比如从数据库中读取出来设备的信息包括经纬度坐标,然后需要在地图上显示对应的设备,这就需要用addMarker函数来动态添加标 ...
- HTTP协议中,Content-Type(内容类型)讲解
在基于HTTP协议进行Web开发时,客户端请求经常会发送请求文件或媒体的类型(Type),为了编译理解和总体把握,在本人总结了一下常用的文件或媒体类型,支持的类型大致有以下9种: 文本:text.图像 ...
- vmstorage如何将原始指标转换为有组织的历史
vmstorage如何将原始指标转换为有组织的历史 参考自:vmstorage-how-it-handles-data-ingestion vmstorage是VictoriaMetrics中负责处理 ...
- 痛苦调优10小时,我把 Spark 脚本运行时间从15小时缩短到12分钟!
周一我就有个困惑,还写成文章了:如何从 Spark 的 DataFrame 中取出具体某一行,里面提了自己猜想的几种解决方案. 没想到这么快就要面对这个问题了,我用小孩子都听得懂的例子描述一下我在干什 ...
- ATM 管理系统的设计与实现(类似毕业设计,附源代码)
ATM 管理系统的设计与实现 作者前言:本系统通过基本规范化的设计,简单的利用了java基本功能实现了ATM系统,本系统虽然简单,但是逻辑很严密,对于有一定java知识的读者有较大帮助,可以用作参考. ...