当前位置: 首页 > news >正文

怎么做免费网站上海新闻最新消息今天

怎么做免费网站,上海新闻最新消息今天,网红营销的策略,建设网站如何给页面命名Emlog 6.0 beta版本#xff0c;这可能是最后一篇关于PHP语言CMS的代码审计文章#xff0c;此次将详细记录完整的审计过程。 文章基本上完整记录小东的对此CMS审计过程#xff0c;或许显得繁琐#xff0c;但代码审计的过程就是这样#xff0c;发现可能项#xff0c;然后精… Emlog 6.0 beta版本这可能是最后一篇关于PHP语言CMS的代码审计文章此次将详细记录完整的审计过程。 文章基本上完整记录小东的对此CMS审计过程或许显得繁琐但代码审计的过程就是这样发现可能项然后精心构造去验证这过程中我们会遇到很多次碰壁坚持测试思维活跃一些基本都会有所收获诚挚希望后来者能够耐心阅读下去当然最好也能够有所启发。 大家需要注意的一点是代码审计是为了学习并在SDL中避免发生类似的错误同时也是帮助开源系统修复相关问题并不是去为了获得什么0day~ 0×00 Emlog 6.0 beta 官网地址https://www.emlog.net/ Emlog 6.0 beta下载地址https://www.emlog.net/download 由于官方限制论坛会员(注册付费)才可下载这里提供一个原版下载地址https://www.lanzous.com/i1l5gad 文件校验 文件: C:\Users\stdy\Desktop\emlog_6.0.0.zip 大小: 607725 字节 修改时间: 2018年8月6日, 20:53:50 MD5: 7844FE6FEAE7AF68052DC878B8811FAC SHA1: E06A050D2A0AA879DB9F5CFCAA4703B6AC7B8352 CRC32: 4963E489 博主的博客就是基于此套博客系统其实很多圈内大佬都在使用对于本款CMS的审计文章却并没有小东就来以此CMS作为PHP代码审计的封笔之作。 0×01 初步测试 首先我们得先安装安装成功后的首页界面 默认后台登陆地址./admin/ 登陆成功后 闲话一句感觉6.0比5.3.1版本好看太多了~ 安装过后我们应该尽可能全面搜集关于此CMS的信息这对于我们审计代码有很大的帮助。 所以分析得到此CMS的大致结构Emlog是一个 MVC 的设计模式大致的结构如图 因此我们主要会分析 admin 和 include 文件夹下的文件。 数据库表 在根目录的init.php 文件中 报错等级指定为7 ?php //禁用错误报告 error_reporting(0);//报告运行时错误 error_reporting(E_ERROR | E_WARNING | E_PARSE); //报告所有错误 error_reporting(E_ALL); error_reporting(7); /* 设置php错误检测级别 E_ERROR - 致命性运行时错 (1) E_WARNING - 运行时警告非致命性错(2) E_PARSE - 编译时解析错误 (4) 124 7 */ ? 0×02 使用漏洞扫描器 可能有朋友就会说你为什么要使用“漏扫”呐不是代码审计吗 这里要纠正一下这个观点漏扫其实就是一个自动化黑盒测试在本地环境下我们不会影响任何的业务。 通过漏扫出的漏洞能够方便我们快速定位漏洞位置这样是一种高效的方式这也是在团队里的成员通过漏扫Get了百度的几个高危漏洞给小东的启示。 这里使用了一款重型扫描器 AWVS 得到的报告如下 不过在本地扫描时使用的是 XAMPP windows10 PHP5.6的环境所以导致漏洞报告中很多误报漏扫主要扫描出了几个XSS漏洞和CSRF漏洞 所以我们首先验证这两类的漏洞 0×03 文章编辑器储存性XSS 在后台的编辑器处编辑文章./admin/admin_log.php 成功发布后来到首页 进入文章页后 都弹窗了这里大家可能要说没法儿利用但是emlog设计了 会员/作者 功能在emlog中的某些模版中可以前台注册会员会员登录后可以编辑发表文章评论等等功能。Emlog官方还提供了文章投稿插件都是调用了官方默认的Kindeditor编辑器这个编辑器自带HTML编辑模式就算不带这个模式攻击者也可以抓包修改达到攻击目的。 为什么前台没过滤呐为了文章有支持HTML代码输出所以对于kindeditor的保存输出内容并没有转义。 修复建议参考其他CMS做好文章内容关键词的检测并做好过滤或者转义 0×04 Uploadify SWF XSS Emlog使用了 uploadify.swf 的方式上传文件文件路径 /include/lib/js/uploadify/uploadify.swf 构造Payload:http://www.test.com//include/lib/js/uploadify/uploadify.swf?uploadifyID00%22%29%29;}catch%28e%29{alert%281%29;}//%28%22movieName%22])}catch(e){if(!window.x){window.x1;alert(document.cookie)}}//.swf 效果可无视浏览器filter 0×05 反射型XSS 此处的XSS主要发生在cookie上因为某些页面如 admin/admin_log,admin/sort.php,admin/link.php页面需要在表单中添加了hidden属性的token值而这个token值直接从用户的cookie中取得导致了一个反射型XSS 拦截抓包修改cookie中的token值如下 效果 其次验证了 CSRF 漏洞这个是前台的搜索框的CSRF根本没什么价值 然后是管理员添加友情链接的XSS经过验证并不存在后台函数会限制字数 然后就是我们开始进行原始的代码审计工作了主要借用了Seay代码审计工具和Rips这种审计工具主要依靠正则匹配可能导致危险的php函数来作为可能存在漏洞的判断半自动化的方式在一定程度上缓解了代码审计的压力。 0×06 基本函数 首先看了一下文件操作相关的函数发现经常用到 View::getView 这一方法 在include/lib/view.php 文件中源码如下 ?php /*** 视图控制* copyright (c) Emlog All Rights Reserved*/class View { public static function getView($template, $ext .php) { if (!is_dir(TEMPLATE_PATH)) { emMsg(当前使用的模板已被删除或损坏请登录后台更换其他模板。, BLOG_URL . admin/template.php); } return TEMPLATE_PATH . $template . $ext; } public static function output() { $content ob_get_clean(); ob_start(); echo $content; ob_end_flush(); exit; } } 同时作为权限控制的 LoginAuth::checkToken()在 \include\lib\loginauth.php下约209行开始 /** * 生成token防御CSRF攻击 */ public static function genToken() { $token_cookie_name EM_TOKENCOOKIE_ . md5(substr(AUTH_KEY, 16, 32) . UID); if (isset($_COOKIE[$token_cookie_name])) { return $_COOKIE[$token_cookie_name]; } else { $token md5(getRandStr(16)); setcookie($token_cookie_name, $token, 0, /); return $token; } } /** * 检查token防御CSRF攻击 */ public static function checkToken(){ $token isset($_REQUEST[token]) ? addslashes($_REQUEST[token]) : ; if ($token ! self::genToken()) { emMsg(权限不足token error); } } 验证了Rips扫描出的文件包含问题第一次使用Rips发现无法复现因为Rips扫描的时候是以文件形式并没有参照程序的严格逻辑导致的误报 来到 \admin\admin_log.php 文件从第78行开始 //操作文章 if ($action operate_log) {$operate isset($_REQUEST[operate]) ? $_REQUEST[operate] : ; $pid isset($_POST[pid]) ? $_POST[pid] : ; $logs isset($_POST[blog]) ? array_map(intval, $_POST[blog]) : array(); $sort isset($_POST[sort]) ? intval($_POST[sort]) : ; $author isset($_POST[author]) ? intval($_POST[author]) : ; $gid isset($_GET[gid]) ? intval($_GET[gid]) : ; LoginAuth::checkToken(); if ($operate ) { emDirect(./admin_log.php?pid$piderror_b1); } if (empty($logs) empty($gid)) { emDirect(./admin_log.php?pid$piderror_a1); } switch ($operate) { case del: foreach ($logs as $val) { doAction(before_del_log, $val); $Log_Model-deleteLog($val); doAction(del_log, $val); } $CACHE-updateCache(); if ($pid draft) { emDirect(./admin_log.php?piddraftactive_del1); } else{ emDirect(./admin_log.php?active_del1); } break; case top: foreach ($logs as $val) { $Log_Model-updateLog(array(topy), $val); } emDirect(./admin_log.php?active_up1); break; case sortop: foreach ($logs as $val) { $Log_Model-updateLog(array(sortopy), $val); } emDirect(./admin_log.php?active_up1); break; case notop: foreach ($logs as $val) { $Log_Model-updateLog(array(topn, sortopn), $val); } emDirect(./admin_log.php?active_down1); break; case hide: foreach ($logs as $val) { $Log_Model-hideSwitch($val, y); } $CACHE-updateCache(); emDirect(./admin_log.php?active_hide1); break; ...//中间的代码要验证管理身份故省略 case uncheck: if (ROLE ! ROLE_ADMIN) { emMsg(权限不足,./); } $Log_Model-checkSwitch($gid, n); $CACHE-updateCache(); emDirect(./admin_log.php?active_unck1); break; } } 那么我们尝试越权删除文章 http://www.test.com/admin/admin_log.php?actionoperate_logoperatedelblog29token994132a26661c8c244a91063c4701a7e 失败了提示权限不足来到\include\model\log_model.php 发现 /*** 删除文章** param int $blogId*/ function deleteLog($blogId) { $author ROLE ROLE_ADMIN ? : and author . UID; $this-db-query(DELETE FROM . DB_PREFIX . blog where gid$blogId $author); //这里和上一句限制了作者只能删除自己的文章 if ($this-db-affected_rows() 1) { emMsg(权限不足, ./); } // 评论 $this-db-query(DELETE FROM . DB_PREFIX . comment where gid$blogId); // 标签 $this-db-query(UPDATE . DB_PREFIX . tag SET gid REPLACE(gid,,$blogId,,,) WHERE gid LIKE % . $blogId . % ); $this-db-query(DELETE FROM . DB_PREFIX . tag WHERE gid, ); // 附件 $query $this-db-query(select filepath from . DB_PREFIX . attachment where blogid$blogId ); while ($attach $this-db-fetch_array($query)) { if (file_exists($attach[filepath])) { $fpath str_replace(thum-, , $attach[filepath]); if ($fpath ! $attach[filepath]) { unlink($fpath); } unlink($attach[filepath]); } } $this-db-query(DELETE FROM . DB_PREFIX . attachment where blogid$blogId); } 这个越权漏洞不存在同时看了下面的函数判断也是做了类似的处理 到这里其实我们对于整个 CMS 的架构已经较为熟悉了基本能根据对应函数功能直接手动找到对应的函数位置。 令人伤心的是通过 Rips 代码审计工具得到的结果一个都没复现成功… ###0×07 Seay辅助审计 相信很多人都知道法师的这款工具主要还是因为中文用着方便但是完全依靠正则的方式去匹配函数只能发现那些函数直接的控制漏洞逻辑漏洞有时候可以根据逆推可以发现但这种情况很少。 使用这款工具扫描出来共120个可能的情况根据经验98%以上都是没法复现的然后一个个排查有的例如SQL语句反单引号这样的很容易就可以判断给忽律就不需要考虑。 在 /admin/store.php 看到这样一串代码 这里我的思考是如果在emlog官网有URL跳转链接的话那么就可以构造下载远程任意的文件到网站但是测试了官网没有跳转链接那么我们尝试下载别的插件链接跳转等或者有黑客精心构造了一个插件或者模版然后再利用这也算是一个可行的方案。 此处需要管理员权限作为代码审计的一个参考思路不是要发现什么0day而是希望大家能够在代码审计方面有所收获。 (1). SQL注入 对于SQL注入Seay工具一直都没准过这里小东推荐方式使用全局搜索 $_GET[ 或 $_PSOT[然后看看是否代入了SQL查询然后一一验证。 然后我发现了这样一个没有过滤IP参数 然后到 admin/comment.php 中查看 再看 delCommentByIp($ip) 函数 由此我们可以确定了SQL注入的存在 验证如下 (2).一个CSRF任意文件删除 $_GET[]型分析完以后就寻找$_POST[]的然后在admin/data.php文件中找到了如下代码 这里我们发现并没有验证toknen那么可以构造csrf页面这里小东就不演示了直接BURP验证一下任意文件删除吧关于CSRF只要没有调用上面基础函数部分说到的 LoginAuth::checkToken() 方法的都存在CSRF 这里就成功删除了文件 (3).TAG SQL注入 在POST参数中发现此处并没有过滤同时在 deleteTag() 函数中代入了SQL查询因此又是一个SQL注入 但是此处并没有回显。可以采用时间盲注的方式 至此利用工具的半自动化审计已经结束下面准备手工测试 0×08 手工测试 手工测试也不是单纯的翻文件应当以灰盒测试为主导从逻辑、权限、敏感信息等方面入手 (1).后台登陆存在暴力破解风险 在这里我之前提到过的验证码未及时销毁的历史问题还存在此处不再详细叙述请参考https://blog.csdn.net/dyboy2017/article/details/78433748 (2).报错信息导致物理路径泄漏 大家不要以为这是小事情当sql注入存在的时候我们有机会是可以直接写shell文件安全无小事 一个低权限的方式在游客的条件下测试一下 payload:http://www.test.com/admin/attachment.php?action[] 原因是addslashes() expects parameter 1 (3).Cookie可计算 在include/lib/loginauth.php中134行开始 /*** 写用于登录验证cookie** param int $user_id User ID* param bool $remember Whether to remember the user or not*/ public static function setAuthCookie($user_login, $ispersis false) { if ($ispersis) { $expiration time() 3600 * 24 * 30 * 12; } else { $expiration null; } $auth_cookie_name AUTH_COOKIE_NAME; $auth_cookie self::generateAuthCookie($user_login, $expiration); setcookie($auth_cookie_name, $auth_cookie, $expiration,/); } /** * 生成登录验证cookie * * param int $user_id user login * param int $expiration Cookie expiration in seconds * return string Authentication cookie contents */ private static function generateAuthCookie($user_login, $expiration) { $key self::emHash($user_login . | . $expiration); $hash hash_hmac(md5, $user_login . | . $expiration, $key); $cookie $user_login . | . $expiration . | . $hash; return $cookie; } 可以看到此处的cookie都可以直接计算得到只需要知道根目录下config.php中的 //auth key define(AUTH_KEY,dx1CH^En86GZnxd9CLO7GwC0Q5eYHKM450f598bbd148b6a62f7d263623e31c3); //cookie name define(AUTH_COOKIE_NAME,EM_AUTHCOOKIE_VzfVniPWDqd1LM3BFocnrcjpAGH4lUbz); 即可。 (4).侧边栏存储性XSS 为了同样是为了支持HTML代码的输出没有转义对应的脚本代码标签导致了存储性的XSS存在 0×09 Getshell (1).SQL注入拿到shell 如上所讲有SQL注入的存在同时可以获取到物理路径那么就可以直接写Shell (2).后台插件上传zip 因为后台可以直接上传本地zip文件这里我们去官网下载一个插件同时把我们的shell文件比如dyboy.php加入zip上传安装这个插件就可以了然后shell地址为http://www.test.com/content/plugins/插件名/dyboy.php (3).后台模版上传zip 和插件同样的原理这里的shell地址为http://www.test.com/content/templates/模版名/dyboy.php (4).备份文件拿shell 后台的数据功能处先备份一个然后下载到本地加入SELECT ?php assert($_POST[dyboy])? into outfile D:\\Server\\htdocs\\safe\\dyboy.php; 然后导入备份恢复本地数据即可 这样就在网站个目录生成了一个dyboy.php的shell 0×10 总结 EMLOG是一个非常小巧轻快的博客系统运行占用资源非常低所以非常适合博主用作博客用途其实只要不开启会员功能没有弱口令就没有什么大的威胁。以此文章作为PHP代码审计的终稿文章所述方法同样适用于其他的CMS代码审计和分析创作不易也希望本文章能对大家能有所启示。转载于:https://www.cnblogs.com/h2zZhou/p/9466373.html
http://www.zqtcl.cn/news/510663/

相关文章:

  • 台州企业建站程序网页设计素材网站知乎
  • wordpress视频付费谷歌seo专员是指什么意思
  • 域名续费做网站wordpress模板淘宝客模板
  • 加强政协机关网站建设深圳教育软件app开发
  • 绍兴企业网站推广Django 个人博客网站开发
  • html5 开发网站图门市建设局网站
  • wordpress 建立网站江苏电信网站备案
  • 企业网站能个人备案吗成都蜀美网站建设
  • 网站开发 占位符直播网站开发接入视频
  • 网站 易用性原则义乌进货网平台
  • 做网站的你选题的缘由是什么洛阳网站建设找汉狮
  • 常德住房和城乡建设局网站陕西省建设厅的网站
  • 国外做meta分析的网站开发公司替业主承担物业费承诺书
  • 百度收录网站定位地址wordpress 检测浏览器
  • 学习网站建设优化wordpress 轮播广告
  • 迈诺网站建设wordpress 前台注册登录
  • 网站开发市场成本免费建站网站大全
  • 四川省建设人才网站通过ip访问网站需要怎么做
  • 网站建设需要知道什么财税公司怎么找客源
  • 赣州那里有做网站的公司物流网站建设平台
  • 青色系网站北京的建筑设计公司
  • 纺织品做外贸一般在哪个网站上手机网站qq登录插件
  • 长沙做公司网站有没有免费的云服务器可以用
  • 济南专业网站优化如何制作小程序二维码
  • 建站平台软件猪八戒做网站要多少钱
  • 建设集团网站专业开发网站多少钱
  • 网站制作流程有哪些wordpress众筹
  • 网站打开是建设中手机咋建网站
  • 外贸专业网站的公司建百度网站
  • 北京做网站开发公司有哪些网站技术开发文档模板