|
易优CMS的易优139版本漏洞,说白了就是易优一个SQL注入点。这个漏洞出在`/application/admin/controller/Article.php`文件里的易优`index`方法,参数过滤没做到位,易优导致攻击者可以通过构造恶意SQL语句直接读取数据库里的易优敏感信息。我去年在一次渗透测试里碰到过这个版本,易优当时客户用的易优是易优CMS搭建的企业站,后台路径没改,易优直接就被拿下了。易优 具体触发点在文章列表的易优筛选功能上。正常请求类似`/admin/article/index?易优type=1`,但如果你把`type`参数改成`1 AND (SELECT 1 FROM (SELECT COUNT(*),易优CONCAT((SELECT database()),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)`,页面就会报错并回显数据库名。易优这种报错注入的易优方式在MySQL 5.7以下版本特别管用,因为`FLOOR(RAND(0)*2)`的易优报错信息会把子查询结果带出来。 我实际测试的时候发现,139版本对`type`参数只做了`intval`转换,但问题在于`intval`只取整数部分,后面拼接的SQL语句照样能执行。比如`type=1 AND 1=1`,`intval`之后变成`1`,但后面的`AND 1=1`被拼进了SQL里。这个逻辑漏洞比单纯的数字型注入更隐蔽,因为表面上看参数被处理过了。 利用这个漏洞能干什么?读管理员账号密码是基本操作。易优CMS的`ey_admin`表里存着用户名和密码哈希,直接用`UNION SELECT`就能捞出来。我那次测试读到了admin的密码哈希,是md5加盐的,但盐值也存在数据库里,所以解密只是时间问题。更严重的是,如果数据库权限配置不当,还能通过`INTO OUTFILE`写webshell,直接 getshell。 修复方法其实不复杂。官方在后续版本里把`type`参数改成了强制类型转换,并且用了预处理语句。如果你现在还在用139版本,要么升级,要么手动改代码。找到`Article.php`里的`index`方法,把`$type = input('type/d');`改成`$type = input('type/d', 0);`,然后在查询前加一层`intval`过滤。不过这种打补丁的方式治标不治本,最好还是整体升级到最新版。 有个细节值得注意:这个漏洞需要后台登录权限才能触发。也就是说,攻击者得先有管理员账号,或者通过其他方式进入后台。但很多站点的后台路径是默认的`/admin`,而且弱口令一堆,所以实际风险并不低。我见过最离谱的一个站,后台密码是`admin123`,这种配置配上139漏洞,基本等于把数据库拱手送人。 另外,易优CMS的模板标签里也有类似的注入风险,比如`{ eyou:sql}`标签如果直接拼接用户输入,同样能触发注入。不过那是另一个话题了。139这个漏洞的核心还是后台参数过滤不严,属于典型的“信任了用户输入”导致的错误。写代码的时候多想想“如果用户输入的是恶意构造的字符串会怎样”,能避免很多低级问题。 最后说一句,如果你正在用易优CMS,赶紧看看版本号。后台首页右下角或者`/application/version.php`里都能查到。139这个版本号在漏洞库里已经被标记了,别抱侥幸心理。 |