德阳市网站建设_网站建设公司_自助建站_seo优化
2025/12/18 1:49:59 网站建设 项目流程

点进网页,发现是一个登录界面,提示“管理员认证”,并且账号输入框默认设置了“admin”,随便输入密码提交发现并有什么响应显示

但是有一次输入密码,发现有密码错误的显示,但是有的有,有的没有。反复尝试后发现是密码的长度问题,当密码长度大于10的时候,会有密码错误的回显

密码长度回显再加上“管理员认证”的提示,打消了准备使用BP爆破的密码的打算(密码长度不一定就是10位以上,但是综合考虑感觉不太会是爆破,可以先尝试其他的方法)
尝试SQL万能密码注入也没有回显,源码中也也没有什么提示,使用dirsearch扫一下网址目录结构,扫出一个robots.txt文件

python dirsearch.py -u https://0817ad67-681d-4a6d-9eba-348070b79e3d.challenge.ctf.show/

查看robots.txt文件,提示index.phps

访问index.phps文件,使用记事本打开,是一段php代码

分析代码: 1. 从POST请求中获取一个名为'password'的参数。 2. 检查密码的长度是否大于10,如果是,则输出"password error"并终止脚本。 3. 构造一个SQL查询语句,查询user表中username为'admin'且password等于`md5($password, true)`的结果。 - 注意:`md5($password, true)`中的第二个参数设置为true,这意味着md5函数返回原始二进制格式(16字节),而不是通常的32字符十六进制字符串。这个二进制数据可能会在拼接进SQL语句时产生问题,因为其中可能包含特殊字符,如单引号等。 4. 执行查询,如果查询返回的行数大于0(即找到了匹配的用户),则输出"登陆成功"和`$flag`

也就是说,我们需要让SQL查询的条件成立,让查询返回至少一行才能输出flag。

我们需要构造一个password值,使得md5($password, true)的二进制结果包含SQL注入 payload,从而让查询条件恒真。

常见的用于SQL注入的md5值:有一个著名的例子是:md5("ffifdyop", true)的结果是:or'6<乱码>。实际上,md5("ffifdyop", true)的二进制结果为:'or'6�]��!r,��b,当这个字符串被放入SQL查询时,由于其中有'or',并且后面有字符,可能会形成一个永真条件。(这个可以作为经验记小本本)

尝试输入密码为ffifdyop,最终得到flag

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询