0x01 前言
无意间发现一个代码审计的以前文章,是审计一篇cms的文章,然后就想着还没有认真的审计过一次呢,就跟着这篇文章的路子走一次吧,来开启我代码审计的篇章。
0x02 审计之旅
首先在站长之家下载了熊海CMS v1.0的源代码,本地搭建好环境之后,将项目拖到Seay代码审计系统中,来一波自动审计~
咳咳,经然后34个漏洞发现。。。好吧,毕竟小站源码,也很正常。
然后就开始一个一个查看了,看看是否有误报和漏报。
0x03 文件包含
首先,index.php中的代码如下,明显就是一个文件包含漏洞嘛,这里参数r没有任何过滤直接放到include()函数中了,但是这里include是在files目录下的,所以需要../进行目录改变。我们可以在根目录下新建一个shell.php,写入<?php phpinfo();?>,然后尝试包含一下
果然成功了!嘻嘻
0x04 越权漏洞
看了一下其他的漏洞,发现除了admin没看,其他的都是误报,但是现在我们还没有办法得到管理员的账号和密码,因此admin的先不看,看一下inc目录下的文件。inc目录下的都是配置文件,很重要,要每一个文件都仔细查看。
在看到checklogin.php的时候,发现了一个越权漏洞。
这里是从cookie中判断时候是管理员的机制,如果cookie中的user为空,就为跳转到?r=login页面,这个页面是后台登陆页面
那么如果我们抓包后将user的值修改成不为空会怎么样呢?
这里用wzlist.php试一下
http://127.0.0.1/admin/?r=wzlist
然后就发现进入了后台。。。
并且只要保证每次cookie中user参数都有值就可以访问后台的所有内容。
之后再看其他的配置文件就看不出来什么了....那么记下来就是看一下admin目录下的文件吧。
0x05 SQL注入1
首先肯定要看登陆页面了,如果能够爆出用户名和密码就完美了。
查看login.php,入眼的就是一段令人激动的代码
这里user和password是直接获取POST传来的参数,并没有进行任何过滤,很容易想到万能密码的使用,但是继续看代码我们发现,这里是先进行user的查询,如果user在数据库中存在,那么就进行password的比较,是将我们输入的password进行md5哈希一下,然后与数据库中的进行比对,所以说万能密码在这里是没有用的,但是我们却可以用报错注入得到用户名和密码。
user=123' or extractvalue(1,concat((select concat(0x7e,password,0x7e) from manage)))#&password=
或者
user=123' or updatexml(1,concat((select concat(0x7e,password,0x7e) from manage)),0)#&password=
但是这里有一点比较坑的是,这里注出来的password最多只有27位,但是数据库存的是password的MD5值,有32位,所以说得到的md5是不对的,需要进行两次注入才能得到完整的密码,以extractvalue()函数为例,payload需要这样写
user=123' or extractvalue(1,concat((select concat(0x7e,password) from manage)))#&password=
user=123' or extractvalue(1,concat((select concat(password,0x7e) from manage)))#&password=
两次自己拼接一下就得到了完整的password的md5值了,拿去解密一下就好了~
0x06 SQL注入2
进入后台之后,可以看一下之前自动审计报的后台的SQL注入漏洞,拿newlink.php为例
这里的变量都是直接POST传进来并且没做任何过滤,那么就存在了SQL注入问题。
利用之前的报错注入验证一下
得到结果
验证成功。
0x07 CSRF漏洞
这里的内容管理中有一个删除文章的功能,点击后抓包得到url
http://localhost/code_audit/xhcms/admin/?r=wzlist&delete=16
退出管理员账号,根据之前的越权漏洞分析,这里应该会转跳到login的界面,试一下,果然如此。
然后重新登陆管理员后点击该url,真的删除了该文章
验证成功。