0x00:KKCMS介绍
KKCMS是基于PHP+MYSQL开发的开源CMS。可以直接在GitHub上下载就可以了。
0x01: 分析全局过滤
位置:WWW/system/library.php
跟MKCMS的全局过滤代码一样,该CMS对传参的内容使用了addslashes转义保护函数。然而忽略了$_SERVER这类传参,并未在列表上可能会造成漏洞
位置:/ucenter/reg.php
关键点出在第8行
username = stripslashes(trim(_POST['name']));前面有提到过输入的内容会用addslashes函数转义输入的内容,然而这里又用了stripslashes函数去掉转义内容。这就导致了可以直接注入
在注册页面随便输入点注册内容然后抓包
保存到txt文件,sqlmap很容易就跑出来了
同理,只需要搜索stripslashes这个参数,排除无法控制输入内容的还有repass和active这两个地方也有注入漏洞
位置:
WWW/template/wapian/vlist.php
首先这里产生漏洞的原因是参数?cid过滤不严谨,由于不属于用户输入所以addslashes函数转义是无效的。同时这条SQL语句
where c_pid='.$_GET['cid'].' order by c_sort desc,c_id asc'); 这里面的SQL语句可以直接进行拼接没有任何过滤保护如单双引号和括号之类的防护措施
直接用SQLMAP跑就可以跑出来了
位置:WWW/admin/cms_ad_edit.php
WWW/admin/cms_book_edit.php
WWW/admin/cms_channel_edit.php
由于后台这个漏洞的参数基本都是相同的,这里拿其中一个例子,漏洞出在第42行,跟上面的一样_GET[‘id’]参数没有任何的防护措施直接拼接,所以造成漏洞,不过这里需要用BURP抓个包才可以跑出来,直接丢SQLMAP跑不出来
同理,直接全局搜索_GET['id']可以发现,后台很多地方其实也存在注入,只要包含result,基本存在漏洞
位置:
WWW/template/wapian/dongman.php
WWW/template/wapian/movie.php
WWW/template/wapian/dongman.php
WWW/template/wapian/tv.php
WWW/template/wapian/zongyi.php
对应的URL:
http://192.168.3.43/dongman.php?m=/dongman/list.php?area=10&page=1
这里举其中一个其它的都是类似的
这里首先如果正常翻代码的话应该是WWW/dongman.php,然而主要还是指向/template/wapian/dongman.php这里
漏洞主要出现的地方主要还是$_GET['m']/?m=,首先URL里面http://192.168.3.43/dongman.php?m=/dongman/list.php?cat=all&page=1的?m就是一个类似指向某些具体数据的东西。
同时按F12发现有<a href=”xxxxxx”>可能存在”>闭合然后弹窗
进入到代码后面在第113行第一次出现了$_GET['m']这个变量
继续跟进到下面144行,总算明白了?m就是echo出具体的数据类容,然而这里似乎过滤不太严格。可以直接用单引号闭合
定位getPageHtml函数到function.php里面,仍然可以看到里面并没有过滤函数闭合然后进行弹窗
Payload:”><script>alert(1)</script>直接弹窗
同理,直接全局搜索,排除重复的,还有其它地方也存在反射型XSS漏洞
位置:
WWW/admin/cms_link.php
WWW/admin/model/link.php
对应URL:
http://192.168.3.43/admin/cms_link.php
这里先演示一波,在分析代码
首先来到后台友情链接这里
然后在名称这里输入XSS语句<script>alert(1)</script>,剩下的内容随便写点然后抓包,点击制作POC
复制一下,然后用浏览器打开
点击submit 以后可以看到添加链接成功
去回前台成功弹窗
回到后台发现添加链接成功
先说XSS漏洞产生漏洞的原因,一开始我是直接对着路径找/admin/cms_link,在第139行这里,输入的内容没有任何的过滤如htmlspecialchar,直接回显出来。所以可以直接用<script>alert(1)</script>进行反弹
然后在全局搜索了’l_name’这个变量才发现采用的是前台html后台PHP这样的写法。在admin/model/link.php是后台文件,在这里首先是在第14行里,接受传参的数据,然后在第19行里面直接插入数据库里面,没有对传入的数据直接进行验证,所以产生了XSS漏洞
同时用seay监控了一下刚才输入的内容在insert 那行并没有出现/转义。所以确认这里存在XSS反弹
CSRF原理:
这里先假设友链=a页面,burp生成的csrf.html为b页面。A页面需要管理员登陆的情况下,黑客诱惑管理员点击b页面,这时候b页面有我们的恶意代码,可以借用a页面中的管理员去执行b页面中的恶意payload
执行b页面的原因:
A页面管理员在已经登陆的情况下是会有个cookie的,如果你再打开一个后台页面是不需要登陆一遍的。CSRF就是借用管理员的cookie,去执行添加友链的表单,所以就打出CSRF了。
核心代码
第一个isset 判断里面的数据是否已设置并且不为NULL
第二然后已POST类型进行传参
然后就是下面的$sql insert into 把数据传到数据库里面
sql = 'insert into xtcms_link (' . str[0] . ') values (' .
然后下面就是判断,最后就是回显内容了。用BURP抓了个输入内容的数据包可以知道这边没有token, 而且也没有二次校验,导致了XSS,这也导致了即存在XSS也存在CSRF漏洞
位置:WWW/book.php
对应URL: http://192.168.3.43/book.php
这里验证码出现了点问题加载不出来
只能在代码里面把
if (_SESSION['verifycode'] != _POST['verifycode'])
改为if (_SESSION['verifycode'] = _POST['verifycode'])直接忽略验证码提交
这里的流程就是在前台/book.php留言,然后传到后台的求片留言cms_book.php里面去
先从代码这里看,从第10行这里开始判断用户的名称是否匹配正规则表达式的内容[\x7f-\xff]。其中\x7f代表的是ASCII码表(里面有字母和数字) \xff代表中文。总的意思就是如果名称不匹配到字母/数字/中文则返回名称不合法。
然后到输入的内容(content),这里的ctype_space意思就是检测输入的内容是否包含空白。不过第16行总的意思也是要求输入的内容不得为空才能进行下一步If循环
下面的正规则匹配也是一样,输入的内容必须是ASCII码表的内容+汉字,否则则返回内容填写不合法。这里有个问题,输入的内容并没有htmlspecialchar 过滤保护,可以存在XSS
由于一开始全局过滤里面有提及输入的变量里面会有addslashes转义内容,为此我输入点东西,发现并没有在输入的值附近里面加/转义
这里用到一个XSS平台
然后在留言板输入XSS语句
输入完以后点提交,在XSS平台这里,可以看到打到admin的cookie了。
如果觉得这个方法不靠谱可以直接输入我<script>alert(1)</script>,直接弹窗
后台也是可以看到的