【BUUCTF】BabySQli

打印 上一主题 下一主题

主题 909|帖子 909|积分 2727

【BUUCTF】BabySQli

题目来源

收录于:BUUCTF  GXYCTF2019
题目描述

纯粹的SQL注入题

随意传入
  1. name=abc&pw=a
复制代码
返回 wrong user

实验传入
  1. name=1%27&pw=a
复制代码
发现闭合方式为',同时给出了一个可疑字符串

把这段字符串丢进ChatGPT,告诉我们大概是Base32编码的,对其进行Base32解码得到字符串
  1. c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==
复制代码
这显然是Base64编码的,再对其解码,得到明文
  1. select * from user where username = '$name'
复制代码
显然这道题的注入点就是name
题解

在实验的过程中发现以下字符串被过滤
  1. or  =   (   )  
复制代码
但是由于对巨细写不敏感,or可以使用巨细写方式进行绕过
传参:
  1. 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值。当传参如下时:
  1. name=1' union select 1,"admin",3#&pw=a
复制代码
返回也是 wrong pass,说明用户名存储在表中的第二列,猜测暗码存储在第三列,传参:
  1. name=1' union select 1,"admin","0cc175b9c0f1b6a831c399e269772661"#&pw=a
复制代码
其中0cc175b9c0f1b6a831c399e269772661是a的md5值,这样传参,$arr[1]的值为admin,$arr[2]的值为0cc175b9c0f1b6a831c399e269772661
总结

本题的登录逻辑与一般的题目不同,源码中的查询语句并非是
  1. select * from user where username = '$name' && password = '$pw'
复制代码
而是
  1. select * from user where username = '$name'
复制代码
先选择与用户名匹配的记录,记录中存储的是用户名和暗码的md5值,再将查询到的暗码的md5值与传入参数的md5值进行比力。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表