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

Posted kali_Ma

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次小有成就的代码审计相关的知识,希望对你有一定的参考价值。

一 前言

前不久逛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 是 全 局 的 变 量 , 包 含 系 统 所 有 的 变 量 数 据 , 打 印 下 可 以 看 到 输 出 了 网 站 的 所 有 参 数 , 可 以 看 到 _L 是全局的变量,包含系统所有的变量数据,打印下可以看到输出了网站的所有参数,可以看到 L,_L包含了系统所有的变量数据

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

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

【资料领取】

七 总结

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

以上是关于记一次小有成就的代码审计的主要内容,如果未能解决你的问题,请参考以下文章

PHP代码审计 | 记一次CMS代码审计

网络安全记一次代码审计

网络安全记一次代码审计

记一次腾讯SDK源代码审计后的CSRF攻击

全!记一次从代码审计到拿下内网edr的过程

记一次小程序之旅