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。

猜你喜欢

转载自blog.csdn.net/heiseweiye/article/details/82735640