ZZCMS8.1|代码审计
这周的审计任务
ZZCMS8.1是站长招商网内容管理系统。审计这个CMS的原因很多,这里就不详说了(其实是漏洞类型多点
)
环境搭建
1,虚拟机win7 32位,用wamserver或者phpstudy搭建环境。
2,ZZCMS8.1源码(已分享链接)放到WWW目录下面
3,安装,访问( http://127.0.0.1/zzcms8.1/install ),如果提示我们安装向导已经安装过,重安装需删除根目录下的 /install/install.lock 文件。删除之后再重新访问该安装页面( http://127.0.0.1/zzcms8.1/install )。一路选择下一步,直到设置页面,创建数据库......安装完成。

代码审计
审计的时候当然不是漫无目的的直接一个一个看php文件,先拿出来我们的代码审计工具扫一下(上篇文章提到),下面将会通过几个漏洞类型提到
先附图一张工具自动审计的漏洞,不过误报率很高。

XSS漏洞
可以说是最简单的一个漏洞了,先看一下
链接(http://127.0.0.1/zzcms8.1/uploadimg_form.php),问题出在uploadimg_form.php里面输出语句有可控变量,并且没有过滤,从而造成XSS漏洞

value="<?php echo @$_GET['imgid']?>"上图68行可以清楚的看到imgid是没有过滤直接输出的。
因此可以直接构造XSS的payload:http://127.0.0.1/zzcms8.1/uploadimg_form.php?imgid="><script>alert(/orange/)</script><"

这个页面是需要登陆的
登陆验证代码
<?php
if(!isset($_SESSION)){session_start();}
if (!isset($_COOKIE["UserName"]) && !isset($_SESSION["admin"])){
session_write_close();
echo "No Login!";
exit;
}
?>
如果你不想登陆的话,可以注释掉登陆的代码就好。还有其他处存在XSS。这里只写这一处反射型XSS。
存储型XSS漏洞
一般来说存储型XSS漏洞都在留言板什么的地方,没有加以过滤,直接写入数据库中,管理员审核的时候从数据库中提取数据,这里可以构造payload,从而可以进行XSS攻击,有的获取管理员的cookie信息,进而进行下一步攻击。
我们首先黑盒测试一下,打开一个提问问题的页面(http://127.0.0.1/zzcms8.1/ask/askadd.php),提问问题,这个时候就开始写payload然后发布。
payload:"><script>alert(/a/)</script>
然后我们管理员权限登进后台,信息模块-->问答信息管理。但是很无奈,我的显示没有权限,不过没关系,我们去数据库直接进行查看,找到zzcms_ask表,查看其中内容,可以看到标题是经过转义的,然而内容却没有经过转义,直接存在了数据库中,因此这里就有可能造成存储型XSS漏洞


现在查看源码分析一下
打开/ask/askadd.php页面

看到198行对数据库中的content内容进行POST接收
$content=str_replace("'","",stripfxg(trim($_POST["content"])));
首先标题title接收到,经过trim函数移除了两侧的字符,trim()函数的意思是移除字符串两侧的空白字符或其他预定义字符,然后就把title接收到了
其次是content,这个进行了一系列的过滤,首先经过trim函数移除了两侧的字符,然后通过stripfxg函数去除反斜杠,追踪自定义stripdxg函数,在/inc/function.php中528行发现

最后再去content参数通过str_replace()函数进行过滤,这个函数把 ' 替换成空,
后面还有一个$img=getimgincontent($content),getimgincontent()自定义函数这个可以在/inc.function.php中210行找到
正如这个函数名字一样,getimgincontent,从content中得到img文件,getimgincontent()函数通过正则表达式,匹配出gif|.jpg|.png|.bmp文件

不过这里此刻对于content是没什么影响的,最后判断一下title是不是为空,接收到之后进而存入数据库中,
如果看了上面的还不明白为什么会把"><script>alert(/orange/)</script>直接存入数据库,那就好好理解我下面的这段话
首先trim()函数的意思是移除字符串两侧的空白字符或其他预定义字符,然后"><script>alert(/orange/)</script>不存在空白字符或者预定义字符,所以此时$content还是"><script>alert(/orange/)</script>,然后stripfxg()函数去除反斜杠,然而"><script>alert(/orange/)</script>没有反斜杠,所以$content还是"><script>alert(/orange/)</script>,最后str_replace()函数进行单引号替换成空,但是"><script>alert(/orange/)</script>没有单引号,所以经过一系列的"过滤",content的内容还是"><script>alert(/orange/)</script>,然后就存入数据库中,从而造成存储型XSS漏洞。
/ask/show.php是展示上面提问的问题和答案的,追踪过去show.php搜索content,可以看到是没有进行任何过滤的,因此这里极大可能存在存储型XSS漏洞。
SQL注入漏洞
联合查询注入
漏洞所在文件是/admin/help_manage.php,其中在文件的第17行,
$b=isset($_REQUEST["b"])?$_REQUEST["b"]:'';
这里$_REQUEST了变量b过去,zzcms对全局的post,get,request请求变量都做到了转义,引号介入是不存在的,但是问题就出在$sql,变量$id是$_REQUEST的,并没有经过过滤,这就造成了代码注入了。



由于代码中有输出这个查询后数组显示,我们可以用联合查询来直接获取到管理员的账号密码,密码是md5加密的
构造payload:http://127.0.0.1/zzcms8.1/admin/help_manage.php?b=-1+UNION+ALL+SELECT+1,2,3,4,5,6,(SELECT+CONCAT(IFNULL(CAST(database()+AS+CHAR),0x20),0x203a3a20,IFNULL(CAST(user()+AS+CHAR),0x20))+FROM+zzcms.zzcms_admin+LIMIT+0,1)%E2%80%93
上面首先查询出当前数据库和当前用户名,如下面图所示,数据库是zzcms,用户是root。

这个payload则是直接查看用户账号密码的,账号admin,密码21232f297a57a5a743894a0e4a801fc3(admin)
payload:http://127.0.0.1/zzcms8.1/admin/help_manage.php
?b=-1+UNION+ALL+SELECT+1,2,3,4,5,6,(SELECT+CONCAT(0x757365723a20,IFNULL(CAST(admin+AS+CHAR),0x20),0x20706173733a2020,IFNULL(CAST(pass+AS+CHAR),0x20))+FROM+zzcms.zzcms_admin+LIMIT+0,1)%E2%80%93

文件上传漏洞
上传漏洞导致getshell。上传点(http://127.0.0.1/uploadimg_form.php或http://127.0.0.1/zzcms8.1/uploadimg_form.php)
这个上传,检测后缀名,只允许jpg,png,gif,bmp文件上传,但是这里我们可以利用图片马进行伪造上传从而getshell。
图片马制作这里提一下:CMD命令行制作,首先准备一个图片.jpg,一个一句话php文件.php,然后用以下命令:copy 1.jpg/b+1.php 2.jpg
上面就制作成了图片马2.jpg。

图片马制作成功,接下来上传,由于我的虚机是没有JAVA环境的,所以我在本机进行上传(本机浏览器输入x虚拟机IP就可访问,前提是在同一网段,这个时候需要虚拟机进行桥接设置),上传burpsuite进行抓包,将上传的2.jpg改成2.phtml,再进行上传,进而上传成功。
这个漏洞的根本在于apache会把phtml后缀的文件当成php文件来执行。



源码分享(链接: https://pan.baidu.com/s/1pLr7w6Z 密码: r326)
本文链接(http://www.cnblogs.com/Oran9e/p/7812106.html),转载请注明。
ZZCMS8.1|代码审计的更多相关文章
- 2020/2/17 zzcms8.2 PHP代码审计
0x00 看网站结构 ********************************* * * * ZZCMS产品版目录结构 * * * ****************************** ...
- PHP代码审计中你不知道的牛叉技术点
一.前言 php代码审计如字面意思,对php源代码进行审查,理解代码的逻辑,发现其中的安全漏洞.如审计代码中是否存在sql注入,则检查代码中sql语句到数据库的传输 和调用过程. 入门php代码审计实 ...
- 技术专题-PHP代码审计
作者:坏蛋链接:https://zhuanlan.zhihu.com/p/24472674来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一.前言 php代码审计如字面 ...
- 关于PHP代码审计和漏洞挖掘的一点思考
这里对PHP的代码审计和漏洞挖掘的思路做一下总结,都是个人观点,有不对的地方请多多指出. PHP的漏洞有很大一部分是来自于程序员本身的经验不足,当然和服务器的配置有关,但那属于系统安全范畴了,我不太懂 ...
- Kindeditor 代码审计
<?php /** * KindEditor PHP * * 本PHP程序是演示程序,建议不要直接在实际项目中使用. * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置. * */ r ...
- 一个CMS案例实战讲解PHP代码审计入门
前言 php代码审计介绍:顾名思义就是检查php源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞. 1.环境搭建: 工欲善其事必先利其器,先介绍代码审计必要的环境搭建 审计环境 window ...
- php代码审计基础笔记
出处: 九零SEC连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 --------------------------- ...
- 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 3.全局防护Bypass之Base64Decode
0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.同上一篇,我 ...
- 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 2.全局防护Bypass之UrlDecode
0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.遇到这种情况 ...
随机推荐
- ios获取本机网络IP地址方法
#include <ifaddrs.h> #include <arpa/inet.h> - (NSString *)getIPAddress { N ...
- 【特效】手机端仿美团下拉菜单带遮罩层html+css+jquery
写了一个手机端的下拉菜单,类似美团,用相对单位rem写的. 效果截图: 代码很简单,原理有点类似嵌套的选项卡,其中的难点在于弹出下拉菜单后,出现黑色半透明遮罩层,而且下层列表页面禁止滚动了.关键就是给 ...
- php设计模式 工厂模式和单例模式
一.单例模式//让该类在外界无法造对象//让外界可以造一个对象,做一个静态方法返回对象//在类里面通过让静态变量控制返回对象只能是一个. 单例模式的要点有三个: 一是某个类只能有一个实例: 二是它必须 ...
- 赋值运算符函数__from <剑指Offer>
前段时间忙于项目,难得偷得几日闲,为即将到来的就业季做准备.在面试时,应聘者要注意多和考官交流,只有具备良好的沟通能力,才能充分了解面试官的需求,从而有针对性地选择算法解决问题. 题目来源于<剑 ...
- 脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律
脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律 一丶什么是ESP定律 首先我们要明白什么是壳.壳的作用就是加密PE的. 而ESP定律就是壳在加密之前,肯定会保存所有寄存器环境,而出来的时候, ...
- 跟着弦哥学人工智能2—HAND-CRAFTED RULES实现的人工智能及其缺陷
隔壁有个妹纸喷我,好高兴....给她回复了下 哎呀,没想到是个妹纸,其实我就随便那么一说,没合计妹纸还专门写个檄文声讨我,受宠若惊其实你的评论一看就比较专业,所以我就去你博客大概扫了一眼,发现个大问 ...
- JAVA基础知识总结:六
一.不定长参数 1.语法:数据类型... 变量名称 使用注意事项:a.不定长参数就相当于是一个数组 b.不定长参数只能出现在参数列表的最后面 c.一个函数的参数列表中只能出现一次不定长参数 d.对于不 ...
- jstl 中 <c:foreach> 多级循环
- JavaWeb之Eclipse中使用Maven构建SpringMVC项目
为了学习spring和maven我这也是拼了老命了,光使用maven配置springmvc我花了上周一周的时间,下班回来就搞,一直有bug,一个bug接着一个,昨天一整天都在解决配置的问题,让大学同学 ...
- C# Request.InputStream 读取输入流为空的原因处理
今天在手机App测试接口的时候发现一个通过POST方式的接口 获取body中的参数一直为空,但是在数据量小的时候却可以获取到数据,开始怀疑是不是POST的长度有限制,然后在web.config中修改了 ...