md5()弱类型和sha1()函数(绕过姿势)
md5()加密与sha1()函数
1.md5概念
MD5是message-digest algorithm>
5(信息-摘要算法)的缩写,被广泛用于加密和解密技术上,它可以说是文件的“数字指纹”。任何一个文件,无论是可执行程序、图像文件、临时文件或者其他任何类型的文件,也不管它体积多大,都有且只有一个独一无二的MD5信息值,并且如果这个文件被修改过,它的MD5值也将随之改变。因此,我们可以通过对比同一文件的MD5值,来校验这个文件是否被“篡改”过。
有关md5加密的题目链接MD5
我们来看一下源代码
if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b'])
if (md5($_GET['a']) == md5($_GET['b']))
die('Flag: '.$flag);
else
print 'Wrong.';
}
解法一:
b必须存在且值不等,但是经过md5加密之后相等,首先我们能想到的是md5的一个缺陷,也就是说经过md5加密之后以0e开头的,值都为0,那是因为0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。于是上网查了一下以0e开头的md5值
这里是链接构造如下语句:
http://chinalover.sinaapp.com/web17/index.php?a=s878926199a&b=s155964671a
我们来看一下页面的反应
得到flag:nctf{php_is_so_cool}
解法二:
另外我们知道,md5是获取不到数组的值的,会默认数组为0,那么如果输入两个数组并赋予不同的值,不妨试一下
http://chinalover.sinaapp.com/web17/index.php?a[]=0&b[]=1
结果得到的和上面的方法一样。
2.sha1()函数
(1)sha1()函数功能这里是链接
我们来做个题目,看源代码:
<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) {
if ($_GET['uname'] == $_POST['passwd'])
print 'passwd can not be uname.';
else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))
die('Flag: '.$flag);
else
print 'sorry!';
}
分析一下代码,发现GET了两个字段name和password,获得flag要求是:uname和passwd是相通的,虽然看起来这是不可能的,其实可以利用sha1()函数的漏洞来绕过,如果把这两个字段构造为数组:
http://120.24.86.145:8002/web7/?id=margin&uname[]=1
这样在第一处判断时两数组确实是不同的,但在第二处判断时由于sha1()函数无法处理数组类型,将报错并返回false,if 条件成立,获得flag。
上一篇: C语言学习——文件操作
下一篇: 过滤掉字符串中的重复字符