尝试万能密码登录,没有任何回显
尝试扫描目录,这里不知道为啥御剑什么都扫不到,使用dirsearch可以扫到robots.txt
查看robots协议
访问下载index.phps
查看index.phps
简单审计一下php代码:
$password=$_POST['password'];
if(strlen($password)>10){
die("password error");
}
首先验证用户提交的密码是否超过10个字符,如果超过,就终止脚本并显示密码错误消息
我们可以去登录页面实际验证一下,输入长度超过10字符的密码,果然报错
接着看sql查询语句:
$sql="select * from user where username ='admin' and password ='".md5($password,true)."'";
这段代码构建了一个 SQL 查询,但是它没有对用户输入进行适当的过滤或净化,很可能存在SQL注入,并且密码在数据库中储存为 MD5 散列值。
继续往后看:
$result=mysqli_query($con,$sql);
关于mysqli_query()函数的定义和用法:
mysqli_query( connection,query,resultmode) ;
参数 | 描述 |
---|---|
connection | 必需。规定要使用的 MySQL 连接。 |
query | 必需,规定查询字符串。 |
resultmode | 可选。一个常量。可以是下列值中的任意一个:
|
这里执行了 SQL 查询并将结果存储在 $result 变量中,然后通过 mysqli_num_rows($result) 检查返回的结果集中是否有行数大于0的数据,如果有,表示登录成功,就会输出flag
关于md5这个函数:md5(string,raw)
参数 | 描述 |
---|---|
string | 必需。规定要计算的字符串。 |
raw | 可选。规定十六进制或二进制输出格式:
|
如果成功则返回已计算的 MD5 散列,如果失败则返回 FALSE。
这里用到一个很奇妙的字符串 ffifdyop
经过md5加密后为 276f722736c95d99e921722cf9ed621c
在转为16进制的字符串时会出现乱码 'or'6É]é!r,ùíb
or后面的第一个字母只要不是0,都会被认为是true,从而实现sql注入的绕过
使用该密码成功登录,拿到flag
ctfshow{eec0857d-9b09-4196-b033-7b0e34f09147}