写点什么

记一次小有成就的代码审计

发布于: 3 小时前

一 前言

前不久逛 cnvd 的时候看到一款小众 CMS,大型 CMS 咱也审计不出啥漏洞呀,复盘了下上面的漏洞,仔细看了下,又发现了一些其他的问题,小众 cms 可以跟一下具体的流程,了解下漏洞发生的原因,用来练手还是可以的。

二 反射型 XSS 漏洞

其实像这样小众的 CMS 出现 XSS 漏洞是比较常见的,而他出现 XSS 的地方也算是经常遇到的地方,报错时直接把输入的信息在没有任何安全措施的情况下进行了原样输出从而触发了 XSS 漏洞。拿到该 CMS 的第一步首先简单看下看下该 CMS 的 URL 路由情况,方便定位相关函数


$t = @$_GET['t'] ? $_GET['t'] : "sys";$n = @$_GET['n'] ? $_GET['n'] : "index";$c = @$_GET['c'] ? $_GET['c'] : "index";$a = @$_GET['a'] ? $_GET['a'] : "index";define("L_TYPE", $t);define("L_NAME", $n);define("L_CLASS", $c);define("L_MODULE", "admin");define("L_ACTION", "do{$a}");require_once '../core/route.php';
复制代码


包含了/core/route.php 函数,跟进去看一下



定义了一些常量,在最后调用了 load 类中的 module 函数, 该函数位于\core\class\load.class.php 中



然后调用相关函数,该函数会查看传入的文件是否存在



如果文件不存在会将错误信息传入类 LCMS 的 X 函数,该函数位于\core\class\lcms.class.php 中,该函数会调用 template 函数生成模板进行错误的输出



然后生成报错信息模板



在进行输出的时候并没有看到对错误进行的任何过滤行为,直接进行了输出,触发了反射型 XSS




基本上涉及到的这种错误输出都没有过滤,都存在反射型 xss 漏洞

三 存储型 XSS 漏洞

在通过 Seay 代码审计工具自动扫描的时候发现了该 CMS 获取客户端 IP 的方式存在漏洞,可以进行伪造,并且后台记录了登录成功的 IP,但是只会记住登录成功的用户的 IP,所以只能通过拿下一个低权限的账号的时候才有可能触发该存储 XSS。注册一个低权限的账号,然后在登录的时候进行客户端 IP 伪造,发现可以触发存储型 XSS。



管理员登录系统,点击用户中心—用户管理处即可触发储存型 XSS 漏洞



定位到 IP 伪造的相关函数,函数位于\app\sys\login\admin\index.class.php 中,获取客户端的 IP 然后进行数据库的更新



而 CLIENT_IP,根据全局变量可知为 LCMS::IP(),跟进到相关函数,函数位于\core\class\lcms.class.php 中,根据函数可知攻击者可以在客户端伪造 IP



最后将从客户端获取到的 IP 更新到了数据库中



当我们点击用户中心的时候,查看调用的函数\app\sys\user\admin\admin.class.php



从数据库中取数据然后进行模板的渲染输出,触发 XSS 漏洞

四 任意文件删除

在删除备份 SQL 文件的时候



跟进到相关函数,函数位于\app\sys\backup\admin\database.class.php 中


case 'del': $file = PATH_WEB . "backup/data/{$_L['form']['name']}"; if (is_file($file)) { delfile($file); ajaxout(1, "删除成功"); } else { ajaxout(0, "文件不存在"); } break;
复制代码


跟进到 delfile 函数,该函数会调用 path_absolute 函数,该函数在 \core\function\file.func.php 中存在过滤


function path_absolute($path){ $path = PATH_WEB . str_replace([ "../", "./", PATH_WEB, ], "", $path); $path = str_replace("\/", "\\", $path); return is_dir($path) ? path_standard($path) : $path;}
复制代码


过滤为../ ./,在 windows 系统下可以通过..\绕过


五 任意文件上传

很少看到有这么干的 CMS 了,看到的时候还是有些吃惊,有人说这是正常功能,看了写这个 CMS 的上传他的本意应该还是上传非执行性脚本的意思,初衷并不是希望你可以上传 php 文件。在设置中心—>安全性能—>格式白名单添加 php



然后在设置中心—>后台设置—>后台 LOGO 直接上传 php 文件即可




上传函数位于\core\class\upload.class.php 中,只要 php 是允许的后缀名即可实现文件上传 getshell



打印下保存的文件白名单



跟进下相关函数,位于 app\sys\config\admin\admin.class.php 中的 dosafe 函数,该函数会将用户添加的白名单保存在全局变量中,在校验白名单时从全局变量中取值导致触发任意文件上传漏洞



六 SQL 注入漏洞

这个 CMS 应该是全部都没有进行安全检测的,基本上和数据库交互的地方都存在 SQL 注入吧,举一个例子吧,多了都是同类。在用户管理—>添加用户处



payload: admin1'and(select*from(select+sleep(1))a)='
复制代码




通过更改 sleep 时间可以看到 sleep 函数生效了,执行时间相差了大概 1 倍,通过查看 SQL 语句执行记录可知,sleep 函数被拼接到了 sql 语句中,并执行了 sql 语句



根据 url 跟进到漏洞函数,函数位于\app\sys\user\admin\admin.class.php 中的 doiframe。具体代码如下,在没有经过过滤的情况下直接获取了数据



_L 包含了系统所有的变量数据




name 值为拼接了恶意 sql 语句的内容,该值直接拼接到了 SQL 语句中去执行从而触发了 sql 注入漏洞



我是一名网安渗透工程师,不仅仅研究渗透,当然,你想学习网络安全的话可以学习网络安全视频、src 技术文档、工具包、应急响应和代码审计等,分享给大家

【资料领取】

七 总结

也没啥亮点吧,很平常的 cms 流程跟踪一下就得了

用户头像

我是一名网络安全渗透师 2021.06.18 加入

关注我,后续将会带来更多精选作品,需要资料+wx:mengmengji08

评论

发布
暂无评论
记一次小有成就的代码审计