[Bugku]sqli-0x1
一、解题思路
第一次拿到这个题目的时候有点无处下手,以为是普通的SQL注入,尝试利用万能密码登录

登陆后发现(这串英文的意思是你为什么要欺负我)然后此时想起了查看源代码(有时候一些关键信息会藏在源代码之中)

然后打开源代码发现了一个注释中包含的uri

将uri拼接后跳转到该页面查看,得到了如下图所示的源代码
a
接下来就是代码审计了,我们从中间可以发现他设置了黑名单,过滤掉了一些符号,当我们试图存在攻击行为时就会出现之前登陆后显示的错误,但是这段代码缺可以允许类似“a'b”这种形式的合法(即如果出现单引号,则必须被字母或数字包围否则就认为是恶意输入)
同时呢,其密码存储采取了一种手动拼接salt并且使用了hash()函数。所以此时登录逻辑就已经比较明显了。
- 首先判断是否存在黑名单中的语句,如果存在则返回why u bully me;
- 根据传入的username进行在users表中查找其记录;
- 将查询到的记录保存在result里,并取出password;
- 然后再将password进行分割,$前是对password,$后是加密用的盐;
- 再然后将输入的pass和salt进行一个拼接,然后sha256进行加密;
- 最后在对hash后的结果与上一步的加密进行比较,如果相同则登陆成功;反之,则输出wrong password。
于是乎,我们可以通过构造<?php var_dump(hash(sha256,“2”.“2”));?>将加密的结果计算出来,然后使用联合注入做一个拼接,绕过其登陆方式。
进行编译上述的代码得到hash值“785f3ec7eb32f30b90cd0fcf3657d388b5ff4297f2f9716ff66e9b69c05ddd09”此时可做拼接“785f3ec7eb32f30b90cd0fcf3657d388b5ff4297f2f9716ff66e9b69c05ddd09$2”

接着绕过用户名的正则,这里采用内联注释的形式,拼接union select,将自定义的盐和密码的加密字符串注入,覆盖密码查询结果,使用自定义的密码即可通过密码校验,于是可构造:
2'union/**/select/**/2,'785f3ec7eb32f30b90cd0fcf3657d388b5ff4297f2f9716ff66e9b69c05ddd09$2
同时输入的密码也为2,此时登录成功拿到flag

二、总结
1.这里其实一开始做的时候查看文件代码的时候出现了PHP代码高亮显示的问题,一开始不太知道怎么解决,后来发现他在源代码中是藏了一段处理这个问题的代码;
2.对于php代码审计部分大体可以看懂但是具体描述的时候还是说不出来,需要多对代码进行总结记录;
3.思路比较局限于简单的SQL注入,陷入到一种单方面思考的过程,还需要不断地思考与练习。
var code = "b4453311-2d26-4beb-bc0d-e304e5b4d01a"

浙公网安备 33010602011771号