哈希长度拓展攻击
哈希长度拓展攻击(Hash Length Extension Attacks)的实现就是基于初始链变量的值被新的覆盖。
易受长度扩展攻击:
- 准备了一个密文和一些数据构造成一个字符串里,并且使用了MD5之类的哈希函数生成了一个哈希值(也就是所谓的signature/签名)
- 让攻击者可以提交数据以及哈希值,虽然攻击者不知道密文
- 服务器把提交的数据跟密文构造成字符串,并经过哈希后判断是否等同于提交上来的哈希值
攻击者可以构造出{secret || data || attacker_controlled_data}的哈希值。
https://blog.csdn.net/yalecaltech/article/details/88753684
条件
1.secret(salt)(攻击者未知)(已知长度)
2.data(攻击者已知)
3.应用采用md5算法,签名算法是hash(secret||data)(||为拼接符,可以为空),已知一个对应项为
hash(secret || data) (攻击者已知)
4.追加字符为”append”(攻击时使用)
HashPump是一个借助于OpenSSL实现了针对多种散列函数的攻击的工具,支持针对MD5、CRC32、SHA1、SHA256和SHA512等长度扩展攻击。而MD2、SHA224和SHA384算法不受此攻击的影响,因其部分避免了对状态变量的输出,并不输出全部的状态变量。
HashPump https://www.cnblogs.com/pcat/p/5478509.html
jarvis oj flag在管理员手里
role=s:5:“guest”;
hsh可能是role的md5加密,但是不是直接加密
index.php~有源码,改为.index.php.swp,输入命令vi -r index.php
恢复index.php文件
有段
$role = unserialize($_COOKIE["role"]);
if ($role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"])))
strrev()反转字符串
构造role==admin而且hsh是反转后加盐的role
unserialize()会忽略多余字符串
flag获取的要求是:传进hsh
等于md5($salt.strrev($_COOKIE["role"]))
需要用MD5扩展攻击
不知道salt值长度,还需要爆破
找了别人的代码。。。
#!/usr/bin/python
# -*- coding=utf -*-
import requests,hashpumpy,urllib
def webre():
url = 'http://web.jarvisoj.com:32778/'
sha = '3a4727d57463f122833d9e732f94e4e0'
string0 = ';"tseug":5:s'
string1 = ';"nimda":5:s'
for i in range(15):# 爆破长度
digest, message = hashpumpy.hashpump(sha,string0,string1,i)
payload ={'role':urllib.quote(message[::-1]), 'hsh':digest} # quote()用于把'\x00'都变成'%00' ,message需要反转回正常role
print(i,payload)
html = requests.get(url,cookies=payload).content#提交答案
if 'Welcome' in html:
print(html)
webre()