欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

md5()弱类型和sha1()函数(绕过姿势)

程序员文章站 2022-03-04 19:41:04
...

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

我们来看一下页面的反应
md5()弱类型和sha1()函数(绕过姿势)
得到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

md5()弱类型和sha1()函数(绕过姿势)

这样在第一处判断时两数组确实是不同的,但在第二处判断时由于sha1()函数无法处理数组类型,将报错并返回false,if 条件成立,获得flag。

相关标签: ctf