• [代码审计]DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入


    0x00 前言

    本来呢,这套CMS都不想审的了。下载下来打开一看,各种debug注释,排版烂的不行。

    贴几个页面看看

    感觉像是新手练手的,没有审下去的欲望了。

    但想了想,我tm就是新手啊,然后就继续看了下去。

    随便点了一下seay工具自动审出来的几个关键点。发现有注入,既然有注入,就好好看看了。

    phpstorm,seay源代码审计,本地demo搭起来~

    看完之后,想写篇文章总结一下,标题都写好了:

    DM企业建站系统v201710 存在sql注入

    可能是因为代码格式不想写了,又或者其他原因

    。。。

    不知多少分钟之后,无意在cnvd上看到有人提交了这个系统的相关报告,而且还是两个?!

    这才下定决心想捋一捋这个系统。

    0x01 CNVD 的报告和厂商的补丁

    先看看 CNVD 上的报告是怎么写的吧?

    报送时间 10-23 号,挺早的呀。。。

    get 到一个点,后台登录处存在sql注入~

    在看看另外一份怎么写的?

    哎呀,24 号,你两真有缘。

    这份报告应该是系统的审了,发现了多个参数。怕是日穿了,厂商也出了补丁。

    最新版是 12.1 号的。

    0x03 新旧版本对比

    因为我之前已经看过了旧版本的代码,也知道旧版本多参数存在注入的问题所在。

    旧版本的参数过滤都是使用了这么个函数

    这个函数是作者自定义的,跟进去

    global.common.php

    会发现用的是 htmlentities来过滤,注意函数后面第二个参数用得是 ENT_NOQUOTES。这意味着什么呢?

    用函数 htmlentitiesdm 过滤的都是只将<,>编码为实体字符而已。而单双引号完美被忽视了。

    那么这个过滤有何意义啊?或许作者是想着来防xss的?!

    也就是说用这个函数过滤的输入,只要带到数据库前没有做过滤的都是存在注入的。。

    比如CNVD第一份报告说的,后台登陆存在注入??

    看到代码login.php

    只是用 htmlentitiesdm 过滤了一下就不再过滤了,直接带进数据库,注入杠杠的。

    还有第二份报告所说的多个参数注入,怕就是用了这个函数进行过滤的各个参数吧,这里就不再一一去找了。

    让我们把目光放到新版本上。

    打开神器beyond compare,加载新旧两个版本。

    会发现做了很多更改。

    我们单刀直入直接看看 global.common.php,看看函数 htmlentitiesdm 有没有做修改?

     会发现从 ENT_NOQUOTES 变成了 ENT_QUOTES。

    也就是从不编码任何引号变成了编码所有引号。

    也就是说这一改变把CNVD上面的两个洞都修复了。

    login.php 后台登陆注入的

     以及其他的输入参数,都是换成了用 htmlentitdm 来过滤了。

    不一一举例。

    0x04 新版依旧存在sql注入

    在对比完新旧版本之后,我就开始笑了。因为我找的几个sql注入漏洞,都没有修复。

    哈哈,我也有手握0day的时候了!

    1,常见的getip()函数过滤不全或者没有过滤,导致sql注入

    先看旧版的 global.common.php , 很明显没有任何过滤

    看看哪里用了这个函数?在前台找到两个地方

    其中 file_formpost_concat 是用来留言的,file_order_post.php是用来下单的。‘

    在我测试发现,只有留言这个功能可以用。

    看代码,旧版是content和tokenhour参数都有注入的

    新版的过滤掉了。

    但获取ip这里是没有变的。

    那么这里是可以拿到一个布尔类型的注入。(因为这里没有回现位)

    直接 sqlmap 跑了

    2,后台认证判断存在注入,可直接绕过登陆

     看最新版本后台认证处 admindm-yourname/config-a/common.inc2010.php

    左新右旧,可以看到是没有什么改变的。

    而我们仔细分析一下这段代码:

    因为这里的cookie是可控的,我们可以直接进行注入,甚至不用注出密码,直接进行绕过登陆了。

    我们分析代码,可以得出这样的结论。

    为什么userps 也是可控的呢?因为这里存在注入啊。

    通过注入,我们可以让返回的密码为我们自己输入的。

    那么就可以直接构造cookie,以管理员的身份登陆进去了。

    比如,我们用ps 为1 ,id 为 注入语句的cookie。

    根据公式

    usercookiecompare = userid-md5(userps,cookiesecet)

    先构造md5部分:

    那么我们的usercookie就是

    7' and 1=2 union select null,null,null,null,null,1,null,null,null,null,null,null,null #-7b0bbade54ef65e2a830c034d0d14e61

    把三个cookie搬上,访问一下/admindm-yourname/mod_common/index-welcome.php?lang=cn 便可直接进入后台

    时间原因,就不再看其他问题了。

    肯定还有其他很多问题,代码这么乱,出错的几率也增高了不少。

    0x05 总结

    总的来说,这是一套比较简单的cms,适合我们这种新手。

    不知道为什么这么简单的CMS,还可以刷CNVD,CNVD真的这么简单吗?!

  • 相关阅读:
    Python基础(一)
    计算机编程和编程语言
    初始Markdown
    Python模块
    Python递归以及面向过程编程
    Python推导式和匿名函数
    Python学闭包函数和装饰器
    Python函数的特点
    Python文件高级应用和如何使用函数
    Python字符编码和文件处理
  • 原文地址:https://www.cnblogs.com/r00tuser/p/8006929.html
Copyright © 2020-2023  润新知