<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mini Cms &#8211; ChaBug安全</title>
	<atom:link href="/tags/mini-cms/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Fri, 23 Aug 2019 01:24:08 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>[代码审计]Mini CMS V1.1 By小东</title>
		<link>/code/476.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Sun, 29 Jul 2018 04:52:45 +0000</pubDate>
				<category><![CDATA[编程学习]]></category>
		<category><![CDATA[Mini Cms]]></category>
		<category><![CDATA[代码审计]]></category>
		<guid isPermaLink="false">/?p=476</guid>

					<description><![CDATA[为什么最近老是在做代码审计呐？一是想要学习其他优秀开发者的架构和设计模式，二是挖掘一下开发者在开发过程中不严谨之处，作为前车之鉴。 有朋友就在问小东，哪儿找到这么多的CMS审计？这...]]></description>
										<content:encoded><![CDATA[<p>为什么最近老是在做<span class="wpcom_tag_link"><a href="/tags/%e4%bb%a3%e7%a0%81%e5%ae%a1%e8%ae%a1" title="代码审计" target="_blank">代码审计</a></span>呐？一是想要学习其他优秀开发者的架构和设计模式，二是挖掘一下开发者在开发过程中不严谨之处，作为前车之鉴。</p>
<p>有朋友就在问小东，哪儿找到这么多的CMS审计？这里说明一下，因为在代码审计方面还比较菜，只得大面积撒网，找小众的CMS来审计学习，所以就写了一个小爬虫，把CNVD上的CMS列表厂商都给抓下来了。</p>
<p>爬虫源码如下：</p>
<pre class="lang:default decode:true "># title: 抓取CNVD漏洞CMS厂商列表
# description: 不想盲目地找漏洞，点对点爆破！boom！
# author: DYBOY
# blog: https://blog.dyboy.cn/

import requests
import re

#refer:http://www.cnvd.org.cn/asset/selectedManuList?offset=60&amp;max=10&amp;manuName=cms

#全局变量
keyword = 'cms'  #用于获取厂商的关键词
main_url = 'http://www.cnvd.org.cn/asset/selectedManuList?max=2000&amp;manuName='+keyword
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
          'Referer':'http://www.cnvd.org.cn/'
          }
req = requests.Session()

#获取网页
html = req.get(main_url,headers = header,timeout=10)
html.encoding = 'utf-8'
guize = r"bringBack\('(.*?)\'\)"
try:
    factories = re.findall(guize,html.text)
except Exception as e:
    print(e)

f = open("factories.html", 'w+',encoding='utf-8')
for i in factories:
    print(i,file=f)
f.close()
print('OK!请检查当前目录下factories.html')</pre>
<p>今天审计的是<code>Mini CMS v1.1</code>版本，也是最新版（五年没更新了）</p>
<p>官网地址：<a href="http://1234n.com/?projects/minicms/" target="_blank" rel="noopener noreferrer">http://1234n.com/?projects/minicms/</a></p>
<p>项目地址：<a href="https://github.com/bg5sbk/MiniCMS/" target="_blank" rel="noopener noreferrer">https://github.com/bg5sbk/MiniCMS/</a></p>
<p>MiniCMS是一个针对个人网站设计的微型内容管理系统。它的特点是：</p>
<ol>
<li>不需要数据库在支持，只需要一个可以运行PHP的Web环境</li>
<li>只针对个人网站设计，没有复杂的成员管理和权限设置</li>
<li>没有分类只有标签，免除发布文章时到底该怎么分类的纠结</li>
<li>只有“文章”和“页面”两该个系统，没有“评论”、“插件”、“主题”，让你更专注于创造内容</li>
</ol>
<p><a href="https://github.com/idada/MiniCMS/releases/download/v1.10/install.php" target="_blank" rel="noopener noreferrer">下载 MiniCMS V1.10</a></p>
<p><a class="swipebox" href="https://upload-images.jianshu.io/upload_images/6661013-e1ffacdfd335058d.png" target="_blank" rel="noopener noreferrer"><img src="https://upload-images.jianshu.io/upload_images/6661013-e1ffacdfd335058d.png" alt="mini cms" /></a></p>
<p>作者一个人做出来的，很不错啦！</p>
<h3 id="h3-0x01-amp-"><a class="reference-link" name="0x01 安装&amp;简单测试"></a>0x01 安装&amp;简单测试</h3>
<p>下载一个 <code>install.php</code> 文件上传至网站根目录，然后访问就可以按步骤安装了！</p>
<p>令人震惊的是，居然不用数据库！！！</p>
<p>数据存放在 <code>/data/</code> 目录下格式为 <code>.dat</code></p>
<p>在作者项目的 <code>Github</code> 上发现作者修复了一个重要的漏洞，虽然不知道是啥…</p>
<p>所以感觉此次审计，可能漏洞收获不是很大~</p>
<hr />
<h3 id="h3-0x02-"><a class="reference-link" name="0x02 寻找漏洞"></a>0x02 寻找漏洞</h3>
<p>安装完成后，install.php文件自动重命名为install.txt文件，意味着没有重装漏洞！</p>
<p>网站的配置信息保存于 <code>/mc-files/mc-conf.php</code> 如果没有过滤，那么可以通过这个 <code>Getshell</code></p>
<p>没有数据库，保存到一个<code>.dat</code>文件，看看文件名称是否是随机的呐？</p>
<p>简单发了一篇测试文章后，在 <code>./mc-files/posts/data/</code> 路径下生成了一个文件 <code>n0pjip.dat</code>， 博主简单看了一下，是随机生成的，并且在<code>publish.php</code>这个配置文件中有一一对应关系。</p>
<p>但是！！！</p>
<p><a class="swipebox" href="https://ws3.sinaimg.cn/large/9150e4e5ly1fn62kjsz80j204s05it9b.jpg" target="_blank" rel="noopener noreferrer"><img src="https://ws3.sinaimg.cn/large/9150e4e5ly1fn62kjsz80j204s05it9b.jpg" alt="see" /></a></p>
<p>你看：</p>
<p><a class="swipebox" href="https://upload-images.jianshu.io/upload_images/6661013-6bb550477d87f4ab.png" target="_blank" rel="noopener noreferrer"><img src="https://upload-images.jianshu.io/upload_images/6661013-6bb550477d87f4ab.png" alt="你看" /></a></p>
<p>访问：<code>http://www.test.com/mc-files/posts/data/n0pjip.dat</code>, 你懂的！虽然没什么较大影响~</p>
<p>这样就构成了一个任意文章数据下载的算是漏洞吧？？？</p>
<p>查看<code>index.php</code> ,作者将后台与前端展示分离，数据采用配置文件 + 序列化<code>.dat</code>文件组成</p>
<p>这种模式，只适合数据不大的博客网站，一旦数据大了，再加上高并发，文件的读取内容效率不高甚至不稳定，序列化的网站配置这样的功能，采用这种方式是极好的。</p>
<hr />
<h3 id="h3-0x03-"><a class="reference-link" name="0x03 权限问题"></a>0x03 权限问题</h3>
<p>默认管理后台地址：<a href="http://www.test.com/mc-admin/index.php" target="_blank" rel="noopener noreferrer">http://www.test.com/mc-admin/index.php</a></p>
<p>登录后，发现，居然没有注销的按钮~，只好清理一下cookie，才退出的！</p>
<p>看一下登陆逻辑！</p>
<pre class="lang:default decode:true ">&lt;?php
require_once dirname(dirname(__FILE__)).'/mc-files/mc-conf.php';

if (isset($_COOKIE['mc_token'])) {  //如果有cookie
  $token = $_COOKIE['mc_token'];

  if ($token == md5($mc_config['user_name'].'_'.$mc_config['user_pass'])) {   //如果cookie的值是MD5 username+pass后的值，则跳转到管理界面
    Header("Location:{$mc_config['site_link']}/mc-admin/post.php");
  }
}

if (isset($_POST['login'])) {
  if ($_POST['user'] == $mc_config['user_name']
  &amp;&amp; $_POST['pass'] == $mc_config['user_pass']) {
    setcookie('mc_token', md5($mc_config['user_name'].'_'.$mc_config['user_pass']));
    Header("Location:{$mc_config['site_link']}/mc-admin/post.php");
  }
}
?&gt;</pre>
<p>权限判断：</p>
<pre class="lang:default decode:true ">//head.php文件
&lt;?php
ini_set("display_errors", "On"); error_reporting(E_ALL);
require_once '../mc-files/mc-conf.php';

if (isset($_COOKIE['mc_token'])) {
  $token = $_COOKIE['mc_token'];

  if ($token != md5($mc_config['user_name'].'_'.$mc_config['user_pass'])) {   //种方式我们还没法儿绕过~
    Header("Location:index.php");
    exit;
  }
} else {
  Header("Location:index.php");
  exit;
}
...//代码省略
?&gt;</pre>
<p>问题出现了，在<code>mc-admin/post.php</code> 文件中的第188行才引入，但是之前的函数都已经执行了，所以这里有判断越权存在</p>
<p><a class="swipebox" href="https://upload-images.jianshu.io/upload_images/6661013-0743846a4320be2b.png" target="_blank" rel="noopener noreferrer"><img src="https://upload-images.jianshu.io/upload_images/6661013-0743846a4320be2b.png" alt="code" /></a></p>
<pre class="lang:default decode:true ">//delete function
function delete_post($id) {
  global $state, $index_file, $mc_posts;
  $post = $mc_posts[$id];
  $post['prev_state'] = $state;
  unset($mc_posts[$id]);
  file_put_contents($index_file, "&lt;?php\n\$mc_posts=".var_export($mc_posts, true)."\n?&gt;");
  if ($state != 'delete') {
    $index_file2 = '../mc-files/posts/index/delete.php';
    require $index_file2;
    $mc_posts[$id] = $post;
    file_put_contents($index_file2, "&lt;?php\n\$mc_posts=".var_export($mc_posts, true)."\n?&gt;");
  } else {
    unlink('../mc-files/posts/data/'.$id.'.dat');
  }
}</pre>
<p>测试一下删除文章：</p>
<p><a class="swipebox" href="https://upload-images.jianshu.io/upload_images/6661013-0390c0b1ae2a1a86.png" target="_blank" rel="noopener noreferrer"><img src="https://upload-images.jianshu.io/upload_images/6661013-0390c0b1ae2a1a86.png" alt="code2" /></a></p>
<p>构造 <code>Payload</code>：</p>
<pre class="lang:default decode:true ">http://www.test.com/mc-admin/post.php?state=delete&amp;delete=n0pjip</pre>
<p>访问后得到效果：</p>
<p><a class="swipebox" href="https://upload-images.jianshu.io/upload_images/6661013-78c8ccbe63c3f49d.png" target="_blank" rel="noopener noreferrer"><img src="https://upload-images.jianshu.io/upload_images/6661013-78c8ccbe63c3f49d.png" alt="delete" /></a></p>
<h4 id="h4-ok-"><a class="reference-link" name="OK! 垂直越权漏洞一枚！"></a>OK! 垂直越权漏洞一枚！</h4>
<hr />
<h3 id="h3-0x04-xss"><a class="reference-link" name="0x04 XSS"></a>0x04 XSS</h3>
<p>在文章处发布一个<code>XSS</code>测试文章</p>
<p>首页访问弹窗，查看源码在<code>content</code>内容中没有转义导致的：</p>
<p><a class="swipebox" href="https://upload-images.jianshu.io/upload_images/6661013-9b7fd7810ba88401.png" target="_blank" rel="noopener noreferrer"><img src="https://upload-images.jianshu.io/upload_images/6661013-9b7fd7810ba88401.png" alt="XSS测试" /></a></p>
<h4 id="h4-ok-xss-"><a class="reference-link" name="OK！存储性XSS一枚！"></a>OK！存储性XSS一枚！</h4>
<p>此外在配置文件的地方也存在存储性XSS，比如在评论框处插入<code>&lt;script&gt;alert(/dyboy/)&lt;/script&gt;</code></p>
<p><a class="swipebox" href="https://upload-images.jianshu.io/upload_images/6661013-017a6f1c438e4250.png" target="_blank" rel="noopener noreferrer"><img src="https://upload-images.jianshu.io/upload_images/6661013-017a6f1c438e4250.png" alt="配置XSS" /></a></p>
<p>在访问文章页面的时候，会弹窗<code>/dyboy/</code></p>
<hr />
<h3 id="h3-0x05-"><a class="reference-link" name="0x05 扩大战果"></a>0x05 扩大战果</h3>
<p>这几个漏洞没啥重大漏洞的感觉！尝试一下 <code>Getshell</code></p>
<p><a class="swipebox" href="https://ws3.sinaimg.cn/bmiddle/9150e4e5ly1fkmowam5qjj205i05imwz.jpg" target="_blank" rel="noopener noreferrer"><img src="https://ws3.sinaimg.cn/bmiddle/9150e4e5ly1fkmowam5qjj205i05imwz.jpg" alt="GETSHELL" /></a></p>
<p><a class="swipebox" href="https://upload-images.jianshu.io/upload_images/6661013-f4586f0bacaea2a2.png" target="_blank" rel="noopener noreferrer"><img src="https://upload-images.jianshu.io/upload_images/6661013-f4586f0bacaea2a2.png" alt="配置" /></a></p>
<p>发现在这个写配置的时候，第一行就请求了<code>head.php</code>权限控制文件，如果你成功登录了后台，那么这个地方就可以通过修改配置文件来<code>Getshell</code></p>
<p>构造 Payload: <code>神秘人');assert($_GET[x]);/*</code></p>
<p>发现单引号会被转义~，找了过滤函数也没找到，自己也测试了一下<code>var_export()</code>函数，原来就是这个函数直接给单引号转义了，学习了，暂时没什么好的姿势~</p>
<p>卒！</p>
<h3 id="h3-0x06-"><a class="reference-link" name="0x06 总结"></a>0x06 总结</h3>
<p><code>var_export()</code> 函数真好用！</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
