Buuctf——[GXYCTF2019]BabySQli

发布时间 2023-09-26 15:44:22作者: 你呀你~

本题目是一道联合注入

进入页面后发现只有一个登录框。

知识点

union select联合查询

  • union拼接的两个查询语句查询字段数必须一样多
  • 当其中一个查询结果为空时,不影响另外一个语句的查询结果
  • 联合注入核心是使用拼接的select语句同时使原查询语句结果为空来覆盖原查询结果,从而实现控制从数据库中查询到的数据
  • 结合子查询实现对数据库更多的操作

解题过程

首先使用简单的语句进行测试

有waf,使用字典fuzz一下。发现过滤了 or ( ) =

尝试联合注入,order by不能用,直接union select 1,2,3,4#

最后测试出来为三个字段,一般来说就是id,username,password了

但是发现回显为wrong pass!。

屏蔽掉原本查询语句结果。payload为-1'union select 1,2,3#发现返回为

说明查询结果的username必须为有效用户,使用admin。通过修改union查询语句来修改查询结果。payload为-1'union select 1,'admin',3#
此时查询结果为

id username password
1 admin 3

此时发现为wrong pass!。修改传入的pw参数为3,使之与查询得到的password对应
发现仍然为wrong pass!考虑是对password进行MD5加密后保存在数据库中的,传入的pw会进行MD5加密后再与数据库中的数据进行比较
构造payload为-1'union select 1,admin,'eccbc87e4b5ce2fe28308fd9f2a7baf3'# (eccbc87e4b5ce2fe28308fd9f2a7baf3为3的MD5加密)

此时查询结果为

id username password
1 admin eccbc87e4b5ce2fe28308fd9f2a7baf3

修改pw参数为3,得到flag

总结

后台比较逻辑估计为如下情况

  • 首先通过username传入的参数进行数据库查询

  • 对查询结果中的username字段进行判断,(此处判断是在对查询结果进行判断,而非post传入的参数)看是否为admin

  • 对通过pw参数传入的值进行MD5加密后与查询结果中的MD5值进行比较,若相等则返回结果

关键在与通过-1'union select构造了所需要的数据库查询结果