[转载] Appcms_2.0.101代码审计

最近一直在学习代码审计,对于我这个没有代码审计的菜鸟来说确实是一件无比艰难的事情。下面呢就说一下appcms后台模板Getshell以及读取任意文件,影响的版本是2.0.101版本。其实这个版本已经不用了,也是拿这个来说一下自己的理解。

环境准备

1、win10—>可选;

2、wamp—>可选;

3、burpt—>抓包工具;

4、Sublime text—>文本;

5、appcms-2.0.101安装包;

注明:在安装完毕我们进入后台后会提示将安装目录下admin目录进行重命名,否则会报错的。我将这个目录重命名为cmdback目录。

直捣黄龙

学习代码审计的时候就听说有这款代码审计神器,这款审计看了一下介绍都是匹配的危险函数,然后罗列出来,生成代码审计报告,代码审计人员再根据可能存在的漏洞进行验证。前期主要是先找一下代码审计的感觉,所以就没有用这样自动化的工具。

环境搭建完毕后,通常会以渗透测试的思维去找网站后台的敏感接口,这些接口一般都会与数据库通信,说不定存在SQL注入、文件上传漏洞、任意文件删除漏洞等。比如数据库备份、模板信息、上传文件等。其实今天看的是后台getshell的一个漏洞,这个漏洞是存在于后台的模块管理,对应的php代码是存在于appcms\upload\admin(原始目录,安装后需要重命名)\template.php文件。

下面来通读一下模板修改的代码:

在代码的第90行定义了一个全局变量$page, $dir = dirname(__FILE__) . ‘/../templates/’ . TEMPLATE,这段代码是来定义目录的,dirname()函数是返回路径中的文件名部分;那么helper :: escape_stripslashes是个什么东东?通过查找在core目录下的一个类文件helper.class.php,文件中定义了一个helper的类。在文件中搜索escape_stripslashes。我们来看一下591–599的代码主要是说的什么

if条件判断语句,在php中,strnatcasecmp()函数是用一种”自然”算法来比较两个字符串,比较字符串不区分大小写。如果两个字符串相等,即一样,函数返回0。如果字符串1小于字符串2,函数返回小于0的数。如果字符串1大于字符串2,函数返回大于0的数;

get_magic_quotes_gpc //判断php中是否打开了gpc;

stripslashes($str) //在代码中删除反斜杠,进行对内容进行过滤;

我们再次返回再次回到template.php文件中,我们使用var_export()函数输出或返回一个变量的字符串表示,找到代码的第93行,在上面一行加入var_export($str . “/” . $page['post'] ['filename']);die;

到此为止,通过代码我们已经找出了这个点可以getshell,构造一个php文件,内容为:<?php eval($_POST['cmdback']);?>,用burp发包

任意文件读取漏洞

这个漏洞代码也是在管理后台的同一个文件中,先附上漏洞代码:

我们看一下第79行后面的代码,这段代码主要是未对用户输入的做过滤条件以及未对文件目录的访问权限做限制,这样用户就可以直接读取网站内部的敏感信息。if语句中的is_file()判断文件是否存在,80行$filecont = helper::get_contents($dir . “/” . $page['get'] ['filename']);这是调用一个类,那好我们去追一下这个类,类的文件还是 helper.class.php。定义一个通过静态函数get_contents,$retry = 3 //定义一个数字型的变量;$content=” //定义一个字符型的变量,while语句来循环判断$content是否为空,并且$restry是否大于0,都满足条件的话就会将整个文件读取到一个一个字符串中,$retry– 是自减一;

下面我们来测试一下是否存在任意文件读取的漏洞,成功读取test.txt文件的内容,这个漏洞的代码审计有点简单,但是简单归简单,危害性有的时候就特大,如果读取到网站的服务器以及数据库信息,那就不用搜索别的信息,直接就可以横扫内网。

个人总结

个人感觉代码审计还是比较有趣的,毕竟自己可以通过代码来看到不同漏洞是怎么发现的,有什么欠缺的地方还望大佬批评。

转载来源:

https://www.freebuf.com/articles/web/216186.html

猜你喜欢

转载自www.cnblogs.com/xyuan7/p/11731527.html