用户
搜索
  • TA的每日心情
    奋斗
    2018-11-2 11:19
  • 签到天数: 13 天

    连续签到: 2 天

    [LV.3]经常看看I

    i春秋-脚本小子

    Rank: 2

    1

    主题

    3

    帖子

    247

    魔法币
    收听
    0
    粉丝
    0
    注册时间
    2016-10-20
    发表于 2018-10-11 19:13:43 138710

    0x01 前言

    PHPMyWind是一个品牌,一款基于PHP+MySQL开发符合W3C标准的建站引擎。它将带给人们一系列高效的,成熟的企业网站建设解决方案,让您的信息以更健康的形式高速传递给需要它的人们,同时让您感受通过PHPMyWind带给您畅快体验。

    0x02 环境搭建

    CMS官网:http://phpmywind.com
    程序源码:PHPMyWind_5.5
    源码下载:http://phpmywind.com/

    0x03 前台SQL注入

    代码分析

    /include/common.inc.php

    46行-58行的代码作用是将提交的参数注册为变量,并经过addslashes函数过滤参数。

    /include/mysql.class.php

    在sql语句的执行函数中,参数经过了CheckSql函数过滤。此过滤函数是由80sec提供。所以当时候在网上找到了对应的绕过方法。

    这些就是前台对提交数据所做的所有处理。

    接下来看漏洞文件:/templates/default/mobile/show.php

    这里存在一个逻辑问题,也就是当$row['infotype']这个参数值不是1也不是2的时候,那么$tbname这个参数是没有值的。最后就直接拼入了update语句进行执行。前面看到这个cms是会将所有提交的参数注册为变量的,那么说明这个$tbname这个参数是可控的,而且拼入的位置并不需要单引号来闭合,那么我们只需要考虑CheckSql函数的绕过。经过百度得到绕过的方法。

    payload: /4g.php?m=show&cid=2&tbname=pmw_adminset password=char(@%27)%20where%20id=1 and (updatexml(1,concat(0x7c,(select user())),0))%23%27`

    如果没开启报错,也可以直接把管理员的密码给重置掉

    payload: /4g.php?m=show&cid=2&tbname=pmw_adminset password=char(51,48,52,57,97,49,102,48,102,49,99,56,48,56,99,100,97,97,52,102,98,101,100,48,101,48,49,54,52,57,98,49%20,@%27) where id=1%23%27`

    将管理员密码重置为111

    0x04 后台代码执行getshell

    /admin/web_config.php

    这里将提交的POST参数经过函数过滤,过滤函数采用的是addslashes,然后全部写入对应的配置表。然后调用WriteConfig()函数。

    跟入WriteConfig()函数

    这个函数将数据库中的配置信息取出,替换掉单引号,还有最后的转义符\,然后进行字符串拼接最后用Writef()函数写入到配置文件。
    这里需要注意的是
    1.这里写入的信息是从数据库中取出来的,提交的参数经过addslashesa转义过后放入数据库再取出来是没有转义符的。产生二次注入的原理就是这个。所以也就是说这里的我们提交的参数,是会不变的进行字符串拼接,然后写入配置文件。
    2.这里进行了单引号替换,和去除转义符。但是只去除了一次,所以我们可以写入\\,还是可以写入转义符。
    3.第一行的代码会导致我们不能直接访问该文件,那么就可以用文件写入函数,写入一句话到目录某个文件。

    0x05  总结

    第一次写审计文章,希望大家多多支持,有不当指出,可以指出来一起讨论讨论。
    发表于 2018-10-12 14:13:49
    厉害了,原来就听到说5.5被挖了一个重置管理员密码的,没想到是通过注入。
    关于代码执行那个,反斜杠吃掉一个单引号后,后面没有单引号来闭合,脚本肯定爆错啊,不过倒是可以控制type=number,倒是没有单引号包裹。仅手机看,没有测试
    使用道具 举报 回复
    发表于 2018-10-12 14:27:30
    学习了。。。。
    http://www.anonymou5.com
    使用道具 举报 回复
    发表于 2018-10-12 15:49:48
    w_uai 发表于 2018-10-12 14:13
    厉害了,原来就听到说5.5被挖了一个重置管理员密码的,没想到是通过注入。
    关于代码执行那个,反斜杠吃掉一 ...

    转义掉一个单引号过后有下一个的参数开始的单引号闭合的。代码会变成这样
    1.png

    所以是不会报错的,当然通过number也是可以的。在写帖子的时候忘记传了,抱歉。
    使用道具 举报 回复
    发表于 2018-10-12 19:23:55
    本帖最后由 Chaffee 于 2018-10-12 19:36 编辑

    感谢分享,问下如果不知道表前缀,该怎么办呢?

    恩。。。发现以下代码可以利用:
    [PHP] 纯文本查看 复制代码
    function SetQuery($sql)
    {
        $prefix = '#@__';
        $this->querystring = str_replace($prefix, $this->db_tablepre, $sql);
    }

    使用道具 举报 回复
    发表于 2018-10-12 20:41:14
    Chaffee 发表于 2018-10-12 19:23
    感谢分享,问下如果不知道表前缀,该怎么办呢?

    恩。。。发现以下代码可以利用:

    能具体说说吗
    使用道具 举报 回复
    发表于 2018-10-12 23:03:31
    flat9 发表于 2018-10-12 15:49
    转义掉一个单引号过后有下一个的参数开始的单引号闭合的。代码会变成这样

    嗯,第一时间看错了,看成键写入的是$row['varname'],因为有单引号干扰,导致没办法闭合了,没注意到是双引号包裹的。
    使用道具 举报 回复
    发表于 2018-10-12 23:04:38
    本帖最后由 w_uai 于 2018-10-12 23:07 编辑

    他意思是你不知道表前缀你怎么补全语句,后头才发现是自动替换的只用传入#@__即可。
    使用道具 举报 回复
    发表于 2018-10-13 22:00:58
    SELECT * FROM `1111` WHERE `id`=15‘ 这种的怎么绕过注入
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    发表于 2018-10-14 21:19:47

    exp /4g.php?m=show&cid=2&tbname=pmw_admin` set password=char(@`%27`) where id=1 and (updatexml(1,concat(0x7c,(select user())),0))%23%27`、
    使用道具 举报 回复
    发表于 2018-10-21 18:40:34
    老哥牛逼了。
    使用道具 举报 回复
    发表于 2018-10-22 18:17:41
    我来看看隐藏内容啊
    使用道具 举报 回复
    发表于 2018-10-25 10:28:56
    思路清晰,值得学习
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册