freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

小白代码审计开山篇
2019-10-18 08:00:12

最近小白一直在学习代码审计,对于我这个没有代码审计的菜鸟来说确实是一件无比艰难的事情。但是着恰恰应了一句老话:万事开头难。但是小白我会坚持下去。何况现在已经喜欢上了代码审计,下面呢小白就说一下appcms后台模板Getshell以及读取任意文件,影响的版本是2.0.101版本。其实这个版本已经不用了,小白也是拿这个来说一下自己理解的php的代码审计。开源的CMS就是舒服,不仅可以对最新版的来做代码审计,进而获取到cnvd证书,这样对自己的经验添加了不少光彩。话不多说,下面来开始进行本地的代码审计。

环境准备

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,那我们去getshell一下,我们先写一个php文件,内容为:<?php eval($_POST['cmdback']);?>,看看能不能getshell.这样我们就可以获取到webshell。

任意文件读取漏洞

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

我们看一下第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文件的内容,这个漏洞的代码审计有点简单,但是简单归简单,危害性有的时候就特大,如果读取到网站的服务器以及数据库信息,那就不用搜索别的信息,直接就可以横扫内网。

个人总结

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

*本文原创作者:cmdgaga,本文属于FreeBuf原创奖励计划,未经许可禁止转载

# 代码审计 # 审计分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者