最近想提升一下自己的代审能力,虽然之前复现分析了挺多漏洞的,TP,Laravel,Typcho,yii,但一直感觉对代码审计能力提升用处不太大,很多时候链子和利用点都非常简单,可是如何发现的这确实一个难题,所以就拿熊海CMS为例,如何自己挖它里面的漏洞,看看自己能否发现和利用,最后在和网上存在的漏洞进行对比,再看哪里没有发现,为什么没有发现,希望这也能给才入门代码审计的师傅们一点思路吧
先看一下入口文件index.php,这个文件一般会定义很多变量,包含很多路径,文件进来,我们只需要注意它和用户的交互的点,入口文件一般会先判断你是否存在安装锁或者配置文件,如果不存在就跳转到安装目录,开始安装整个网站。然后打开文件监控,首先判断是否存在重装漏洞,然后再分析目录结构,大概知道每个文件夹中放的文件功能是什么就行了,比如熊海CMS:
然后安装成功后我习惯先浏览下网站的主要功能,大致了解这些之后就可以静下心来看代码了
重装漏洞可以以下几种类型:
自动删除这个安装文件
通过生成一个 lock 文件来判断程序是否安装过
根本无验证
安装完成后不会自动删除文件,又不会生成 lock 判断是否安装过
安装file
直接用GET提交step绕过,直接进入下一步
变量覆盖导致重装
可以GET,POST,COOKIE任意提交一个变量名 i n s L o c k f i l e , 给 其 赋 空 值 , 覆 盖 掉 insLockfile,给其赋空值,覆盖掉 insLockfile,给其赋空值,覆盖掉insLockfile,从而让file_exists为false就不会退出
判断lock后,无exit
判断是否存在lock文件,如果存在lock文件,就会header到index.php,但是header后并没有exit,所以
并不会退出,类似的还有javascript弹个框
解析漏洞
在安装完成后会将install.php
重命名为index.php.bak,但是由于Apache的解析漏洞:如果无法识别到最后一个后缀的话,就会向上解析,那么就又变成了php了,然后结合安装时的变量覆盖又成重装了。
满足一些条件不会退出的
危害:
install/index.php:
并没有发现存在重装漏洞
首先就要去查看数据库使用的编码方式,如果是GBK则可能造成宽字节注入,从而直接绕过addslashes这类函数,然后去有对数据库操作的地方查看传入数据是否可控,我们可以注意下,在注入前是否对参数进行了解码,如果进行了解码,可以二次编码注入,在熊海CMS安装的时候就发现它有写入管理员信息的操作,而且是在安装前的操作,并没有对参数进行任何过滤,
insatll\index.php:
而且它是有报错输出的,所以可以报错注入:
然后就是安装之后了,
首先就从网站入口跟进,发现是一个单入口模式:
这里就存在文件包含漏洞,只是说暂时还没有发现危险文件能够利用,看道这里那就联想到能不能把后面的php后缀截断,然后去上传一个图片马来包含呢,或者是否存在一个文件写入的点来利用呢,可是我试了一下第一个思路,好像并没有成功,但是存在疑惑,因为在PHP<5.3.4的时候,我们是可以利用%00来截断后缀的,但是当我本地将版本调低到5.3.29,按理说是可以截断后缀从而包含任意文件,但是却出了问题,我先在根目录写了一个phpinfo,
这样是可以的,但是:
这样缺不行,然后我又使用长度截断也未成功
然后就跟进files文件夹下的页面文件,首先就是files/index.php,里面很多都是echo数据库里面的信息,但是我们并不可控,因为里面引进了template里面的文件,所以也先看一下,发现里面有没有能利用的,查看fiels/list.php,看起来存在SQL注入漏洞,但是存在addslashes函数,无法注入,然后继续审计,直到看到fiels/download.php的时候,发现了一个XSS漏洞,然后fiels/list.php同理
XSS也分为反射型、存储型以及DOM型,当我们想挖掘反射型XSS漏洞时,需要重点关注程序的输出,比如echo/print等,当程序直接将未经过滤的用户输入输出除了,就会造成反射型XSS。
而存储型XSS是由于网站将用户输入存储进数据库中,当用户再次浏览某页面时,从数据库中获取之前的输入并输出,如果在输入->数据库这块过程中没有进行实体化编码以及输出->页面的过程中没进行实体化编码,则很容易产生存储型XSS。所以对于这类XSS,重点关注insert,查找insert表内数据的输出位。
fiels/download.php:
直接echo可控变量,所以存在XSS漏洞,
然后继续往后看,点击下载会跳转到files/content.php,跟进,发现存在SQL注入漏洞,
files/content.php:
这里的原因就是没有使用单引号闭合用户可控变量,导致绕过addslashes函数,
继续跟进,发现调用files/submit.php提交评论,
跟进files/submit.php,
都可控,且未经过addslashes函数,
很明显的一个SQL注入漏洞,但是需要注意的是后面还有一个插入语句:
开始我也卡了一下,因为你只闭合前面,后面是会报错的:
闭合后面:
还是不行,但是突然想到只需要用报错注入,让前面报错了,后面自然就不用管了:
name=1&mail=1') or updatexml(1,concat(0x7e,(select(database())),0x7e),1)#&content=哈哈
往后走还有SQL注入,
后面相同利用的地方就不赘叙了,因为发现这里有可控数据插入数据库的操作,那是否存在存储型XSS呢?
分析已经在上面的流程分析了
在files/content.php,我们能提交昵称、邮箱、网址、评论内容,但是在files/submit.php中,
他过滤了$content的HTML代码,所以不能利用,而且在显示评论和留言的地方有昵称,所以我们只能利用昵称处进行存储XSS
还有一个files/contact.php,存在和files/content.php一样的留言框,大概看了下代码,也是存在存储型XSS
最后还有一个files/software.php文件,在下载的时候会跳转到该界面,
审计到这里差不多前端的代码就审完了,漏洞就SQL注入漏洞和XSS漏洞,然后就是去审计后台的代码了
首先对于后台代码,我会先查看是否存在越权漏洞,是否存在CSRF漏洞,然后登录后台,寻找PHP文件写入,寻找命令执行,
首先查看login.php,
又是重复的SQL注入,后面就不重复这些漏洞了,在审计代码的时候,并未发现admin/login.php存在什么越权漏洞,但是后面查看存在漏洞的时候,他却存在这个漏洞,因为在成功登录上admin账号后,他是存在一个user的cookie的,但是退出之后又没有了,所以他就是通过cookie中的user值来判断登录是否成功的,所以只需要伪造一个cookie即可:
成功越权登录
然后就是./inc/checklogin.php中存在越权漏洞了,:
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;
}
?>
所以只要调用了该文件都存在越权漏洞
后面的话其实就是前面提到过的漏洞了,这里就不再赘叙了,
其实这个CMS很简单,我主要想讲的并不是这个CMS如何审计,而是一个思路,希望能帮到刚入门代审的师傅们,其实很多漏洞,利用点都很简单,难的就是去发现它的思路
参考:
https://threezh1.com/2019/05/18/PHP%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E4%B9%8B%E9%87%8D%E8%A3%85%E6%BC%8F%E6%B4%9E/
关注我,持续更新······
私我获取【网络安全学习资料·攻略】