记一次MD5验证绕过

格式:flag:{xxx}

解题链接: ctf5.shiyanbar.com/web/

via:shiyanbar.com/ctf/2036

本文将借助实验吧中的一道web题来简单的说明如果在特定条件下绕过MD5加密的密码验证。

首先,打开题目链接,进入一个登录页面:

载入超时,点击重试

随便输入几个万能密码进行测试,不成功。然后想到了查看网页源代码,看看有没有存在源码泄漏的情况:

注释可以说暴露了一切,稍后简单分析下。

$password=$_POST[password];
$sql = "SELECT * FROM admin WHERE username = admin and password = ".md5($password,true)."";
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0){
echo flag is :.$flag;
}
else{
echo 密码错误!;
}

密码以post方法接收,算是常规操作。而查询密码的SQL语句却有漏洞可以利用。在SQL语句的后半部分,即password后面调用了一个MD5函数,以便与资料库中加密的密码进行对照。一般的MD5值是被认为极难破解的,但是该出的MD5函数第二个参数为true,这里便有文章可做了。

MD5函数第二个参数默认值为false,表示会产生一个32位的常规MD5值。而true,则是原生的16字元的二进位格式,这意味著,这里有可能人为输入一个字元串,经加密后的值以二进位格式生成,又被当字元串处理,很可能新的字元串中含有可以构造SQL万能密码的or的部分。

正好网上有两个这样的字元串,一个是和解题链接的文件名一样的字元串:ffifdyop,另一个是:129581926211651571912466741651878684928。将任意一个输入进去,即可绕过验证。(很明显,这里更倾向于让你用ffifdyop)

(这道题感觉好神奇啊,黑客真是无孔不入,这都可以)

一些说明

  1. 关于PHP的MD5函数的一些具体内容,可以参考这里:w3school.com.cn/php/fun
  2. 文中两个字元串构造出的字元串是什么样的:

content: 129581926211651571912466741651878684928
hex: 06da5430449f8f6f23dfc1276f722738
raw: x06xdaT0Dx9fx8fo#xdfxc1or8
string: T0Do#or8
content: ffifdyop
hex: 276f722736c95d99e921722cf9ed621c
raw: or6xc9]x99xe9!r,xf9xedbx1c
string: or6]!r,b

2中的内容摘自:lovews.xin/index.php/20 3. 关于MD5的一些介绍,可以参考这里:baike.baidu.com/item/MD

小感慨

漏洞的产生可能来自方方面面,比如此处,因为参数传递的问题便导致了SQL注入漏洞的产生,导致看似无法破解的MD5值也沦陷了。可以说,任何疏忽都能给整个系统带来短板,拉低整个系统的安全性。我觉得每个站长在建站时都要多考虑下安全问题,尽可能降低安全隐患。

推荐阅读:

查看原文 >>
相关文章