Web请求编码数据的识别、解码及API调用复现技术问询
关于Web请求编码类型、解码及API调用复现的问题
我在研究某Web应用运行机制时,查看服务器请求发现原始数据存在编码情况,具体数据如下:
é£Ü-JM[#ÀóÚÀ5"Ò ¿ eyJ4NXQiOiJOVEF4Wm1NeE5ETXlaRGczTVRVMVpHTTBNekV6T0RKaFpXSTRORE5sWkRVMU9HRmtOakZpTVEiLCJraWQiOiJOVEF4Wm1NeE5ETXlaRGczTVRVMVpHTTBNekV6T0RKaFpXSTRORE5sWkRVMU9HRmtOakZpTVEiLCJhbGciOiJSUzI1NiJ9.eyJtaWJQcml2aWxlZ2VzIjoiRk9SQ0VEX09UUCIsInN1YiI6ImxpbGFwbkBjYXJib24uc3VwZXIiLCJreWNTdGF0dXMiOiJ7XCJXeWlnUENXUjJnRDFveGVKeTJvNXNZXCI6XCJjXCJ9IiwiaXNzIjoiaHR0cHM6XC9cL2xvY2FsaG9zdDoxNDI1N1wvb2F1dGgyXC90b2tlbiIsIm1vYmlsZSI6IjA5MTI3NzkwNTI5IiwiYXVkIjoicmpySko5V2RmUTM3X3VlMENfS3JBVkp6MUN3YSIsIlVzZXJPVFBTdGF0dXMiOiJGSU5BTCIsIlBhcnR5SWQiOiI1MzU3NjY3MSIsImF6cCI6InJqckpKOVdkZlEzN191ZTBDX0tyQVZKejFDd2EiLCJzY29wZSI6Im9wZW5pZCIsIkZvcmNlQ2hhbmdlIjoiRmFsc2UiLCJleHAiOjE2NzU3MDkyMDQsImlhdCI6MTY3NTcwODMwNCwianRpIjoiNzExZjMzMTItMmMyNS00NmI4LWFmN2YtZjQ2ZmEwZmRlZjE1In0.fPGGaVObDPuhYOVhAPAk9mw_Vtiyzq-v43iCGuULLioPpuR73eb8f1ufB6Y5ZnX3zsPp7Mq-XkLC0wwiY_6_-ykDg3huNwmI-bpKxB0szQkolpShE0QyqQ93dS8sB5yaB_qoHvzhsWM1_sRfJB3F246MiYietw9UAqJsmFrXAEq2diX2idjNeAc_SuPqNBtd39qw6cUcchW1n8m5VyLXogO9gN5TzVntvmUIh9r047E87Fdm1mXZEiuLEub2ljrrIrK9-zuPmfQx4FuEr8CQOlwvunmALLVjSRK1WsVEFwSW8pmrXvsu0LZOMgEWoSb7zfYYa4m-gbmvMrsuWYQ7CQB P²> Ü¡©DÓW×}ÿº> J fa_IR
我需要了解:该编码的类型、解码方法,以及如何复现该请求调用目标API。
1. 编码类型分析
- 中间的
eyJ4NXQi...段是JWT(JSON Web Token),采用Base64URL编码(Base64的变种,替换+为-、/为_,去掉末尾=填充)。 - 前后的乱码是二进制数据被错误字符集解码导致的显示异常,大概率是请求附带的二进制元数据(如加密请求体的前缀/后缀、传输层编码残留),被用不匹配的字符集(比如ISO-8859-1/Windows-1252)解析成了可见字符。
2. 解码方法
针对JWT部分
直接提取三段式JWT字符串,用Base64URL解码:
- 将JWT按
.拆分为Header、Payload、Signature三段。 - 对Header和Payload段补全
=填充字符(补至长度为4的倍数),替换Base64URL字符后解码。 - 示例Python代码:
import base64 import json def decode_jwt_part(part): part += '=' * (-len(part) % 4) part = part.replace('-', '+').replace('_', '/') return json.loads(base64.b64decode(part)) jwt = "eyJ4NXQiOiJOVEF4Wm1NeE5ETXlaRGczTVRVMVpHTTBNekV6T0RKaFpXSTRORE5sWkRVMU9HRmtOakZpTVEiLCJraWQiOiJOVEF4Wm1NeE5ETXlaRGczTVRVMVpHTTBNekV6T0RKaFpXSTRORE5sWkRVMU9HRmtOakZpTVEiLCJhbGciOiJSUzI1NiJ9.eyJtaWJQcml2aWxlZ2VzIjoiRk9SQ0VEX09UUCIsInN1YiI6ImxpbGFwbkBjYXJib24uc3VwZXIiLCJreWNTdGF0dXMiOiJ7XCJXeWlnUENXUjJnRDFveGVKeTJvNXNZXCI6XCJjXCJ9IiwiaXNzIjoiaHR0cHM6XC9cL2xvY2FsaG9zdDoxNDI1N1wvb2F1dGgyXC90b2tlbiIsIm1vYmlsZSI6IjA5MTI3NzkwNTI5IiwiYXVkIjoicmpySko5V2RmUTM3X3VlMENfS3JBVkp6MUN3YSIsIlVzZXJPVFBTdGF0dXMiOiJGSU5BTCIsIlBhcnR5SWQiOiI1MzU3NjY3MSIsImF6cCI6InJqckpKOVdkZlEzN191ZTBDX0tyQVZKejFDd2EiLCJzY29wZSI6Im9wZW5pZCIsIkZvcmNlQ2hhbmdlIjoiRmFsc2UiLCJleHAiOjE2NzU3MDkyMDQsImlhdCI6MTY3NTcwODMwNCwianRpIjoiNzExZjMzMTItMmMyNS00NmI4LWFmN2YtZjQ2ZmEwZmRlZjE1In0.fPGGaVObDPuhYOVhAPAk9mw_Vtiyzq-v43iCGuULLioPpuR73eb8f1ufB6Y5ZnX3zsPp7Mq-XkLC0wwiY_6_-ykDg3huNwmI-bpKxB0szQkolpShE0QyqQ93dS8sB5yaB_qoHvzhsWM1_sRfJB3F246MiYietw9UAqJsmFrXAEq2diX2idjNeAc_SuPqNBtd39qw6cUcchW1n8m5VyLXogO9gN5TzVntvmUIh9r047E87Fdm1mXZEiuLEub2ljrrIrK9-zuPmfQx4FuEr8CQOlwvunmALLVjSRK1WsVEFwSW8pmrXvsu0LZOMgEWoSb7zfYYa4m-gbmvMrsuWYQ7CQB" header = decode_jwt_part(jwt.split('.')[0]) payload = decode_jwt_part(jwt.split('.')[1]) print("Header:", header) print("Payload:", payload)
针对前后乱码部分
- 将乱码字符串按
latin-1编码转回字节流(latin-1为单字节编码,不会丢失原始二进制信息)。 - 查看字节流的十六进制表示,分析是否为特定加密/压缩格式。
示例Python代码:
garbled_text = "é£Ü-JM[#ÀóÚÀ5\"Ò \n ¿ " byte_data = garbled_text.encode('latin-1') print(byte_data.hex())
3. 请求复现步骤
- 收集完整请求信息:用抓包工具(浏览器DevTools、Fiddler等)获取:
- 请求方法(POST/GET等)、目标URL
- 所有请求头(重点关注
Content-Type、Cookie、Authorization) - 请求体的原始二进制数据(不要用字符解析后的乱码,直接抓字节流)
- 还原请求体:
- 如果乱码是加密数据,需从JWT Header或应用代码中找到加密算法、密钥,将有效数据重新加密。
- 如果只是字符集解码错误,将正确数据按原始字符集编码为字节。
- 模拟请求:
- curl命令示例:
curl -X POST [目标API URL] \ -H "Content-Type: [原始Content-Type]" \ -H "Cookie: [原始Cookie]" \ --data-binary @request_body.bin - Python requests示例:
import requests url = "目标API URL" headers = { "Content-Type": "原始Content-Type", "Cookie": "原始Cookie" # 补充其他请求头 } with open("request_body.bin", "rb") as f: body = f.read() response = requests.post(url, headers=headers, data=body) print(response.text)
- curl命令示例:
内容的提问来源于stack exchange,提问作者Weston
相关产品推荐
相关产品推荐

