CTF日记|[GXYCTF2019]BabySQli

CTF日记|[GXYCTF2019]BabySQli
文章图片

前期的判断很重要。判断注入点,判断是哪一种类型的注入,有哪些关键词被过滤等。

  • post类型注入
  • 注入点在用户上。密码输入时没有任何异样而在用户处会触发关键词报错。
  • 过滤关键词有or ( ) =
    CTF日记|[GXYCTF2019]BabySQli
    文章图片
源码中有这么一串字符。base32解密,再64解密后得到结果select * from user where username = '$name'

其实从过滤的关键词考虑,基本上很多事情多做不了了。本题的考点是在union联合查询上。
既然hint解密后得到sql的关键语句如上,我们就可以推测出该题对用户的判断步骤:
  1. 查询表中指定用户的所有信息
  2. 传入的密码与查询的信息密码进行比对
看似没什么问题,实际上通过联合查询就可以绕过此判断。联合查询出的临时数据可以帮助我们直接登录
CTF日记|[GXYCTF2019]BabySQli
文章图片

放个例子方便理解:
我们要登录到Dumb这个用户,那么根据上面那条语句我们可以得到Dumb的相关账号密码。
CTF日记|[GXYCTF2019]BabySQli
文章图片

但如果我们查询一个未知用户,配合上构造过的联合查询语句,得到的结果如下。题目对账号的判断完全取决于数据库采出来的信息。那么直接当我们传入的密码为nice(与语句构造的一样),就可登录成功了。
CTF日记|[GXYCTF2019]BabySQli
文章图片

该题同理,唯一不同的是。需要多来一步对密码的md5加密。

【CTF日记|[GXYCTF2019]BabySQli】最后放个源代码
Do you know who am I? - 锐客网 '; $arr = mysqli_fetch_row($result); // print_r($arr); if($arr[1] == "admin"){ if(md5($password) == $arr[2]){ echo $flag; } else{ die("wrong pass!"); } } else{ die("wrong user!"); } } } ?>

    推荐阅读