【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

其中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值进行比较。

【BUUCTF】BabySQli的更多相关文章

  1. 【BUUCTF】强网杯 2019随便注1 write up

    输入万能密码1' or 1=1# ,判断存在sql注入, SQL注入的万能密码实际上是利用了网址后台的漏洞,打开下面的网址不用密码和账号也可以登录后台. 万能密码原理: 万能密码能够绕过sql检测,在 ...

  2. 【BUUCTF】ACTF2020 新生赛Include1 write up

    查看源代码+抓包都没有发现什么信息,只有这两个东东 <meta charset="utf8"> Can you find out the flag? <meta ...

  3. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  4. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  5. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  7. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  8. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  9. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  10. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

随机推荐

  1. Node开发规范v1.0

    一.空格与格式 (一)缩进 采用2个空格缩进,而不是tab缩进. 空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同.2个空格会让代码看起来更紧凑.明快. 变量声明 永远用var声明变量,不 ...

  2. vue3笔记 - 父子组件通信

    父传子 说明:父组件将数据绑定在组件标签上:子组件props接收 父组件: <template> <Child :msg="msg" /> </tem ...

  3. vue 相同路由不同参数跳转时,不刷新

    在公共的router-view上加 :key="$route.fullPath  控制key属性变化

  4. 有关IOS内存读写冲突

    有关IOS内存读写冲突 在写内存相关代码时,获取已使用内存代码中报错 let hostPort: mach_port_t = mach_host_self() var host_size = mach ...

  5. Collector的配置和使用

    目录 Collector的配置和使用 Collector配置 Receivers Processors Exporters Service Extensions 使用环境变量 Collector的使用 ...

  6. Qt音视频开发12-easyplayer内核

    一.前言 在视频监控行业经常看到两个厂家广告打得比较厉害,一个是青犀视频对应easyplayer,一个是大牛直播,两个最初都是sdk免费,并提供调用示例源码,后面大牛直播的sdk以及示例都无法运行,目 ...

  7. Python绘制土地利用和土地覆盖类型图详解

    土地利用和土地覆盖是环境科学和城市规划中的重要概念,它们能够帮助本文理解人与自然的关系,促进可持续发展.随着城市化进程的加快,科学地监测和管理土地资源显得尤为重要.Python作为一种强大的编程语言, ...

  8. 记录一个uniapp写的小程序的手写板,横屏,用于签名,也可竖屏

    今天需要在小程序增加一个手写板的功能,但是得横向的手写纵向的保存,直接上代码,竖屏的时候不需要旋转图片 <template> <view class="wrapper&qu ...

  9. document.querySelector 有多个类 的情况

    document.querySelector 有多个类 document.querySelector 方法用于返回文档中匹配指定 CSS 选择器的第一个元素.如果要查询具有多个类的元素,可以将它们作为 ...

  10. selenium学习-常用方法

    id_#当前元素的ID  tag_name#获取元素标签名的属性  text#获取该元素的文本.  click()#单击(点击)元素  submit()#提交表单  clear()#清除一个文本输入元 ...