ctfshow-web9(奇妙的ffifdyop绕过)

尝试万能密码登录,没有任何回显

ctfshow-web9(奇妙的ffifdyop绕过)_第1张图片

尝试扫描目录,这里不知道为啥御剑什么都扫不到,使用dirsearch可以扫到robots.txt

ctfshow-web9(奇妙的ffifdyop绕过)_第2张图片查看robots协议

ctfshow-web9(奇妙的ffifdyop绕过)_第3张图片

访问下载index.phps

ctfshow-web9(奇妙的ffifdyop绕过)_第4张图片 查看index.phps

ctfshow-web9(奇妙的ffifdyop绕过)_第5张图片 简单审计一下php代码:

$password=$_POST['password'];
if(strlen($password)>10){
    die("password error");
}

首先验证用户提交的密码是否超过10个字符,如果超过,就终止脚本并显示密码错误消息

我们可以去登录页面实际验证一下,输入长度超过10字符的密码,果然报错

ctfshow-web9(奇妙的ffifdyop绕过)_第6张图片

接着看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

可选。一个常量。可以是下列值中的任意一个:

  • MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)
  • MYSQLI_STORE_RESULT(默认

这里执行了 SQL 查询并将结果存储在 $result 变量中,然后通过 mysqli_num_rows($result) 检查返回的结果集中是否有行数大于0的数据,如果有,表示登录成功,就会输出flag

关于md5这个函数:md5(string,raw)

参数 描述
string 必需。规定要计算的字符串。
raw

可选。规定十六进制或二进制输出格式:

  • TRUE - 原始 16 字符二进制格式
  • FALSE - 默认。32 字符十六进制数

如果成功则返回已计算的 MD5 散列,如果失败则返回 FALSE。 

这里用到一个很奇妙的字符串 ffifdyop

ctfshow-web9(奇妙的ffifdyop绕过)_第7张图片

经过md5加密后为 276f722736c95d99e921722cf9ed621c 

在转为16进制的字符串时会出现乱码 'or'6É]é!r,ùíb

ctfshow-web9(奇妙的ffifdyop绕过)_第8张图片

or后面的第一个字母只要不是0,都会被认为是true,从而实现sql注入的绕过

使用该密码成功登录,拿到flag

ctfshow-web9(奇妙的ffifdyop绕过)_第9张图片

ctfshow{eec0857d-9b09-4196-b033-7b0e34f09147} 

你可能感兴趣的:(web,SQL,CTF,前端,md5,sql,web安全,数据库)