*本文原创作者:ZKAQ聂风,本文属于FreeBuf原创奖励计划,未经许可禁止转载
0x00 前言
大家好,我是聂风,在此,我做一个简单的代码审计文章分享来方便同学们学习。BlueCMS v1.6 sp1一直以来就是PHP代码审计入门的最佳良品。这次我们就选择这一个案例进行学习。我先声明,我的代码审计方法是针对代码基础较为薄弱较薄弱的人群进行代码审计。
0x01 环境搭建
Phpstudy
BlueCMS v1.6 sp1源码
代码审计工具(Seay源代码审计系统)
0x02 代码审计过程
拿到一个CMS,有诸多审计方法,我这里的审计方法是黑盒+白盒测试,偏黑盒较多的代码审计。拿到代码后我们应该先对其进行功能点的分析,看一看该CMS存在哪些功能,因为我们寻找漏洞,肯定是从网站中的正常功能进行测试,这是黑盒测试的一个方法,挖掘漏洞的核心我认为在于传参,知道每个传参的意义是不是就等于知道了代码会做什么,要做什么呢?
这是我总结的BlueCMS v1.6 sp1的功能点:
正常而言,我们先将CMS进行一个安装,正常而言CMS的源码放入web目录下后我们会访问install目录,然后进行安装。安装完后我们是不是应该以安全工程师的身份去想一想,我们是否能够再次访问install目录,进行重新安装呢?如果能够进行重新安装,是不是就可以将整个网站的数据全部重装,然后拿到设置新的管理员账号,然后通过后台拿到webshell?
然后我们去访问该页面,正常,可以重装:
于是我们审计出了代码的第一个问题,可以重复安装呢!是不是很简单?
然后我们再来看这个网站,一般而言网站有展示类和功能类:
展示类(比如新闻站、门户站)
功能类(比如商城、OA、系统)
但是无论是展示类还是功能如果我们可以拿到一个普通用户的权限是不是更加容易渗透测试?测试的点是不是更多?
那么我们去注册一个账户吧!
注册一个账号,我们想一想,是不是可以尝试进行一个XSS,我们先注册一个账号,然后抓包看看,然后我们输入了用户名后,我们发现burp抓了一个包:
很明显这个数据包是用来检测你的用户名是否有人注册过,那么我们是不是可以通过爆破user_name传参进行爆破出用户名。(爆破出用户名后爆破密码更容易)
然后填完所有内容,提交,然后抓到了数据包,我们发现是被提交到user.php:
然后我们通过代码审计工具去找那个文件。
在传参中我们看到了我自己输入的“账号|密码|邮箱|验证码”,然后最后出现了一个act传参,打开这个user.php我们可以看出这个文件有好几个功能,act就是决定我的数据包是干什么的传参,于是乎复制这个传参值去源码中寻找这个传参:
这段源码就是关于你的注册,我们可以看到INSERT INTO插入,然后我们看是否存在过滤,很明显这里没有过滤,那么我们尝试进行XSS以及SQL注入。
我们就先看XSS。
先抓包,正常的填写注册,然后将数据包拦截(这是为了防止前端检测)
修改数据包,加入XSS语句,我是在邮件的地方加的。
成功弹窗:
事实证明这里存在一个存储型XSS,然后我们再去看看SQL注入:
这很明显是他的SQL语句,然后我们尝试使用updatexml的报错。
构建下语句:
' or updatexml(1,concat(0x7e,(SELECT database())),1),1,1)#
然后执行,居然成功执行了。没有过滤?居然能成功执行,说明单引号没有起作用,是不是存在魔术引号?试试宽字节!
%df' or updatexml(1,concat(0x7e,(SELECT database())),1),1,1)#
然后成功报错:
很明显这里存在SQL注入,但是这里神奇的很,我这里报错说语法错误,我直接去本地执行却没问题!源码中对报错做了限制。只能通过盲注来解决,难受!
我们仔细思考,这里是一个插入语句,那么我们是不是可以尝试插入多行数据,我们通过语句构建,再建立一个用户,然后用子查询填充邮箱处,然后我们登陆这个账号是不是就可以看到邮箱字段里面的内容,走,说干就干!!
构建语句:
%df',1,1),(100,0x6162717765,md5(123456),(select database()),1,1)#
闭合原本的语句,然后再插入一条数据,然后执行,成功执行了!!
数据被插入了,走,登陆账号:
很明显,库名在邮箱处显示了,与似乎我们可以通过这样的方法利用这个点!!
我们结束了注册功能在看看登录功能,登录处会不会存在SQL注入?
老样子,登录,然后抓包看传参到那个文件:
还是那个文件,就是act变为了index_login:
登录还定义了函数,右键函数追踪一下:
还是老样子,没有任何过滤,那么试试万能密码吧:
payload:%df’) or 1=1#
万能密码成功登录。
万能密码就是存在POST类型的SQL注入,可以尝试使用SQLMAP。
我是跑数据包,在pwd字段。
然后登录后修改资料处也存在SQL注入和XSS。
然后我们看到了别人的文章,我们看到我们可以评论:
然后果断评论,我尝试了不登录也是可以评论,然后我们抓包看看吧!
去看看这个文件:
这里似乎有一个过滤。
Htmlspecialchars会将尖括号转化为HTML实体,那么不能出现尖括号。
然后呢这里我们来玩一个骚套路,我们看到传参里面有ip对吗?
留言记录IP这个是留言系统中经常存在的套路。那我们看到了他实际上插入了ip的值是特意拼接是,是由这个自定义函数设定getip()。
走,我们去找找这个函数的定义:
找到了定义的函数,这里有一个getenv,实际上就是获取系统的环境变量。
第一个HTTP_CLIENT_IP这个环境变量没有成标准,很多服务器完全没法获取。
第二个X-Forwarded-For这个东西可以通过HTTP请求头来修改。
那么问题来了!
我们似乎可以控制请求头中的X-Forwarded-For控制ip的传参,ip的传参会直接被拼凑到SQL语句,走!我们SQL注入去(类似的问题挺多的,黑盒白盒我都遇到过)。
设置X-Forwarded-For为1'#。
然后直接报错了:
因为这个不是输入,连宽字节都省了,如果这里没有宽字节注入就可以这样来注入:
里面还有些SQL注入和XSS的漏洞我就不一一列举了。
我们看一点不一样的,在后台我看到了可以备份数据库:
发现他是按照日期生成备份文件,我们尝试爆破地址:
然后成功访问,里面有管理员账号密码(密码就是MD5,解密下就行)。
我们再来讲一个更有深度的漏洞--文件包含。
还记得前面看了好几次的user.php吗?
通过全局寻找include,我发现里面有一些有趣的东西:
我们可以通过传参pay来控制包含的文件。
我们先尝试正常操作让act传参pay,然后我发现这个传参是在充值中心的购买充值卡的地方的选择支付方式:
然后我们先在网站根目录留一个1.txt,内容写:
<?php phpinfo();?>
然后尝试拼接。
通过../跳转到上层目录,但是我们发现这个语句后面有一个index.php的拼接。那该怎么办呢?在这里我们可以尝试一个字符串截断的方法(Windows的路径不能超过256个字符)。
那么我们是不是可以尝试在传参的后面加点进行阶段,因为点最后会被windows给处理掉,但是填充了点之后,只会保留包含前面的1.txt,在传参后的index.php因为路径超过256个字符后的东西都会被舍弃,于是乎我们直接传参后加256个点就可以截断了。
Payload:
pay=../../1.txt................................................................................................................................................................................................................................................................
那么我们该如何利用,看看有没有地方可以上传,找到头像上传,然后上传图片马:
然后包含这个文件就行:
0x03 总结
其实该CMS所存在的漏洞不仅仅只有这些,我文章中的这些也只是一个抛砖引玉,只是说出一个更适合代码基础薄弱的同学进行代码审计的方法,如果我文章中有什么写的可以再改进的地方,可以随时联系我!谢谢大家花费了时间来读在下的粗鄙小文,谢谢大家。
*本文原创作者:ZKAQ聂风,本文属于FreeBuf原创奖励计划,未经许可禁止转载