【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 ————————— ...
随机推荐
- Node开发规范v1.0
一.空格与格式 (一)缩进 采用2个空格缩进,而不是tab缩进. 空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同.2个空格会让代码看起来更紧凑.明快. 变量声明 永远用var声明变量,不 ...
- vue3笔记 - 父子组件通信
父传子 说明:父组件将数据绑定在组件标签上:子组件props接收 父组件: <template> <Child :msg="msg" /> </tem ...
- vue 相同路由不同参数跳转时,不刷新
在公共的router-view上加 :key="$route.fullPath 控制key属性变化
- 有关IOS内存读写冲突
有关IOS内存读写冲突 在写内存相关代码时,获取已使用内存代码中报错 let hostPort: mach_port_t = mach_host_self() var host_size = mach ...
- Collector的配置和使用
目录 Collector的配置和使用 Collector配置 Receivers Processors Exporters Service Extensions 使用环境变量 Collector的使用 ...
- Qt音视频开发12-easyplayer内核
一.前言 在视频监控行业经常看到两个厂家广告打得比较厉害,一个是青犀视频对应easyplayer,一个是大牛直播,两个最初都是sdk免费,并提供调用示例源码,后面大牛直播的sdk以及示例都无法运行,目 ...
- Python绘制土地利用和土地覆盖类型图详解
土地利用和土地覆盖是环境科学和城市规划中的重要概念,它们能够帮助本文理解人与自然的关系,促进可持续发展.随着城市化进程的加快,科学地监测和管理土地资源显得尤为重要.Python作为一种强大的编程语言, ...
- 记录一个uniapp写的小程序的手写板,横屏,用于签名,也可竖屏
今天需要在小程序增加一个手写板的功能,但是得横向的手写纵向的保存,直接上代码,竖屏的时候不需要旋转图片 <template> <view class="wrapper&qu ...
- document.querySelector 有多个类 的情况
document.querySelector 有多个类 document.querySelector 方法用于返回文档中匹配指定 CSS 选择器的第一个元素.如果要查询具有多个类的元素,可以将它们作为 ...
- selenium学习-常用方法
id_#当前元素的ID tag_name#获取元素标签名的属性 text#获取该元素的文本. click()#单击(点击)元素 submit()#提交表单 clear()#清除一个文本输入元 ...