-
第一次使用建议使用样例进行加解密流程的https://mp.weixin.qq.com/s/B-lBbVpJsPdCp1pjz2Rxdg
-
加解密的时候核对一下三个地方的参数:
【明文关键字与密文关键字不可重复,否则取密文关键字的判断优先】
加解密的域名
只有出现该域名的请求包会进行加解密操作(autoDecoder
选项卡与此参数有关)
明文关键字
当请求体内出现该关键字即进行加解密操作(换行符为分隔符,支持多个关键字)
密文关键字
当请求体内出现该关键字即不进行加解密操作(换行符为分隔符,支持多个关键字)
-
有代码基础的建议使用接口进行加解密,可以自定义请求的内容,自由替换;工具本身自带加解密满足不了现在大部分应用的加解密需求。
-
可以参考下列文章进行使用,配合加解密靶场 https://github.com/SwagXz/encrypt-labs
- 加密对抗靶场enctypt-labs通关 https://flowus.cn/share/a1d890c2-f72b-4534-93cf-37db6dab5d21
- 加密对抗靶场enctypt-labs通关 https://mp.weixin.qq.com/s/ZgD7qAQAsNlZgLtdZVCoFw
进入Burp Suite
的logger
模块(或者logger++
模块)查看当前请求的实际数据包(在repeater
内的数据包被autoDecoder处理过,所以会提示解密失败),进而分析是什么原因
- 可能使用了工具自带的加解密,目前工具仅支持请求包、响应包同时加解密,一旦响应包为非加密的,就会报解密的错误,而使用接口加解密,就可以很好解决此问题
- 使用了接口加解密,考虑代码编写问题,如函数的入参、函数的返回值等错误
参考示例见flasktestheader.py(处理请求头)与flasktest.py(DES加解密示例)脚本
参数解释如下:
正常POST格式(application/x-www-form-urlencoded)
ImmutableMultiDict([('dataBody', 'a=1&b=2&c=3')])
(原始数据为a=1&b=2&c=3)
JSON格式(application/json)
ImmutableMultiDict([('dataBody', '{"f0ng":"onlysecurity"}')])
(原始数据为{"f0ng":"onlysecurity"})等
ImmutableMultiDict([('dataBody', '{"id":"1"}'), ('dataHeaders', 'POST /0828/testsql.php HTTP/1.1\r\nHost: 10.211.55.4\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 39\r\n')])
原始数据为(数据包的换行分隔符为\r\n
)
POST /0828/testsql.php HTTP/1.1
Host: 10.211.55.4
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
{"id":"1"}
获取相应参数的代码如下(flask框架的读取参数方法,也可以用其他框架,这里仅以flask进行举例):
body = request.form.get('dataBody') # 获取 post 参数 必需
headers = request.form.get('dataHeaders') # 获取 post 参数 可选
3.requestorresponse
标识为请求包还是响应包(可选为request和response),使用reqresp = request.form.get('requestorresponse')
获取参数,以下示例为整个flask对象[打印request.form]:
ImmutableMultiDict([('dataBody', 'dCtLdlmk7wI='), ('requestorresponse', 'response')])
传入的为请求体,传出的为处理后的请求体
I9z1fsH5QQ2NUbJi/7a8lw==
传入的为请求头与请求体,传出的为处理后的请求头与请求体(这里未处理请求体,所以请求体是未处理过的)
这里的\r\n\r\n\r\n\r\n
是为了区分开headers与body,是必需的
POST /0828/testsql.php HTTP/1.1
Host: 10.211.55.4
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
aaaa:bbbb
f0ng:test
{"id":"1"}
实际上是已经实现的,因为AES并没有64位的块, 如果采用PKCS5, 那么实质上就是采用PKCS7
需要配置生效的域名
需要修改一下burp的设置,具体修改如下:
- 勾选User options->Character Sets中的
Use the platform default(UTF-8)
[Mac],或者勾选Display as raw bytes
[Windows]
## 0x07 调试模块有换行存在 0.31版本删除
这里是为了方便调试,自动加的换行,在repeater、intruder模块是没有换行的,所以不必担心
- 调试模块是textarea数据包是字符串格式,而在repeater里是http包格式,所以在repeater、proxy模块中会有\r\n,在获取字符串的时候可以进行\r\n的替换即可
- 关键字问题,调试模块不会受到关键字的影响,只会根据使用者的按钮进行加密、解密,而在实际运用中,在repeater、proxy模块,会受到关键字的影响
- 明文关键字
即解密后是明文的关键字,可以配合手工进行测试,当标识为明文关键字后,手动请求明文,会经过插件加密为密文再发送到服务端,服务端返回密文,插件自动解密至选项卡,做到明文请求,明文响应 ,明文关键字可以是明文框里的任意一个字符,但是为了和字符区分开,一般取 { 或者 " 这种json数据的
- 密文关键字
即标示为密文的关键字,这里设置了密文关键字以后,任何标示为密文的请求体就不会进行加密,防止二次加密的产生,比如上图中的,就无法进行密文关键字标识,因为密文是字符,不可预测
两个关键字设置的初衷,就是为了在同一种环境中,既有加密的包,又有不加密的包,来进行区分;也为了在加密环境下,应用程序会取上一个数据包的密文作为下一个数据包的参数进行发送请求,如果自动解密成明文下一个数据包的参数就无法获取,导致应用程序无法正常运行,而设置了明文关键字、密文关键字,可以很好解决该问题
问题出现于2021.10.1以后(可能往前几个版本也有),目前不知道什么原因,解决方法是把数据包粘贴在repeater模块的raw
中,进行发包,不要在autodecoder
选项卡中发包
0x11 自带的sm4加解密有问题?
sm4模块确实有问题,特别是一些不可见字符的,目前用的是原生的代码实现的,用不了现成的三方库,用sm4的建议还是用接口加解密
正则模块只对请求体、响应体有效,不作用于数据头,且正则需要按照案例中正则进行参考编写
勾选对数据头进行处理,python-flask代码中示例dataHeaders
请求头,使用headers = request.form.get('dataHeaders')
获取