提示
- 与平常的sql注入不同
- 这里需要通过php验证账户密码的 错误逻辑 绕过
尝试万能密码
显示是黑客, 这里对or还有=和#以及 ' 都测试一下, 看是过滤了哪个
想试试闭合, 结果直接报错弹出来了, 闭合是'
这里需要说的是像这种会报错的在真实情况下都是一般不会出现的, 这个是网站搭建者的测试有没有问题以后, 没有删除才会出现这样的报错情况
现在fuzz一下, 看看哪些语句还可以用 (如果需要我自用的字典可以在文章末尾自取)
这里把information_schema的所有数据库都禁了
- =可以用like绕过
- 这题只是匹配了小写的or, 尝试以后可以大小写绕过(其他的同理)
- 但是这里还禁用了括号, 这我属实不知到咋搞, 先继续测试
这里尝试order by
到4的时候报错, 说明只有三个字段, 这里就可以尝试联合查询了
没有回显
这里查看一下源码
这里发现union select 1,2,3里, 2这个位置时admin, 3这个位置时md5加密后的密码
到这里就好办了
首先接受俩变量, 我们通过name变量执行sql语句查询我们的输入账户密码然后返回给result, 此时result接受的账户密码是我们通过语句查询的账户密码
此时进入if判断里, 到红标指的地方能看到他会查看result里的账户是否是admin(这里就需要我们通过username进行sql语句的时候就放进去)
通过以后就会将接受的password和result里我们插入的密码进行对比, 对的话就能得到flag
这里有两种方法
- name='union%20select%201,'admin','202cb962ac59075b964b07152d234b70'#&pw=123 !!!!!md5加密后的必须要小写的32位, 不然不行 (这里admin后面的一长串时md5加密后的123, 只要让我们输入的密码md5加密后等于我们插入的密码就能成功得到flag)
- name = 'unino select 1,'admin',null#pw[]=123 md5加密数组会报错返回null也能成功绕过得到flag
现在实践理论的时候
先bp抓包
成功获得flag
第二种方式
这里似乎把null给ban了, 虽说失败了, 但是也是一种不错的发散思维方式