[脆弱性]練習-Day10 FengCms 1.32とシンプルLog1.6ウェブサイトの脆弱性をリロード

彼は、PHP-監査-Labsのコード監査Day10の練習の[赤]チームに始まった
リンク:https://github.com/hongriSec/PHP-Audit-Labs
練習に行くことができます興味のある学生
予備知識:
コンテンツのタイトルが来るPHPセキュリティ2017 CALENDAR
10日目-次のように期待コードは次のとおりです。

extract($_POST);

function goAway() {
  error_log("Hacking attempt.");
  header('Location: /error/');
}

if (!isset($pi) || !is_numeric($pi)) {
  goAway();
}

if (!assert("(int)$pi == 3")) {
  echo "This is not pi.";
} else {
  echo "This might be pi.";
}

脆弱性分析:
この質問は実際にするときということであると言う检测到攻击時には、対応があるが防御操作、しかし、プログラムはしていない立即停止退出につながった程序继续执行問題。プログラムが第一行处使用するextract機能、POST登録済みのすべての変数に要求されたデータを。

エキス()関数:

(PHP 4、PHP 5、PHP 7)

特長:

エキス()関数は、シンボルテーブル内の現在の配列変数に導入されます。

定義:
extract(array,extract_rules,prefix)
説明:
パラメータ 説明
アレイ 必須。使用する配列を指定します。
extract_rules オプション。エキス()関数は、各キーの名前は、法的な変数名でチェックするだけでなく、競合が既に存在しているため、変数名とシンボルテーブルをチェックします。紛争とキー名の不正な取り扱いは、このパラメータに基づいて決定されます。
接頭辞 オプション。パラメータの値がextract_rules EXTR_PREFIX_SAME、EXTR_PREFIX_ALL、EXTR_PREFIX_INVALIDまたはEXTR_PREFIX_IF_EXISTSある場合は、接頭辞が必要です。

例:

ここに画像を挿入説明
結果:

$a = Original; $b = Dog; $c = Horse; 
$dup_a = Cat

だから我々がコントロールできること第8行pi変数。

if (!isset($pi) || !is_numeric($pi)) {

プログラムのpi変数の簡単な検証、そうでない場合は数や設定されていないpi変数を、プログラムの実行goAway方法、直接にリダイレクト記録されたエラーメッセージ/error/ページ。ここは、プログラマが、処理の一定量を操作することは違法であると思われます。しかし、キーは処理後のプログラムは、プログラムはまたに、プロセスに従って実行するために行くだろうだから、すぐに終了していないということです陳述。第12行assert

if (!assert("(int)$pi == 3")) {

上記のためにpi、ユーザが制御することができる変数、このラインにあり远程代码执行漏洞

例如我们的payload为:pi=phpinfo() (这里为POST传递数据),然后程序就会执行这个 phpinfo 函数。当然,你在浏览器端可能看不到 phpinfo 的页面,而是像下面这样的图片:

ここに画像を挿入説明
ここに画像を挿入説明
理解を容易にするためには、赤チームの首長は、プログラムのデバッグプロセスを記録:ポイントをここに

実際には、これはまた、実環境多くの場合です。例えば、いくつかのCMSがあるかどうかをチェックすることにより、install.lockプログラムがインストールされているかどうかを判断するためにファイルが。インストールされている場合、ユーザーはWebサイトのホームページに直接リダイレクトされますが、脆弱性が発生し、再インストールするようにサイトを引き起こして、プログラムを終了するのを忘れました。ここでは、二つの実世界の例を見て。

ケーススタディ:

  • FengCms 1.32は、ウェブサイトの脆弱性をリロード

ケーススタディでは、我々はFengCms 1.32を選択しました。

セキュリティツールを提供するために、脆弱性のPOCサイト、手続き(メソッド)のみご自身の責任で安全研究と教育の目的のために、攻撃運ぶことができます!

脆弱性分析:

对于一个已经安装好的 FengCms ,当用户再次访问 install/index.php 时,就会导致网站重装。我们来具体看下程序的逻辑:
现在正常页面:
ここに画像を挿入説明
install/index.php(25-135行)
ここに画像を挿入説明
我们可以看到,如果是第一次安装网站,程序会在 upload目录下(27行)生成一个 INSTALL 文件,用于表示该网站已经安装过(对应上图 25-28行 代码)。当我们再次访问该文件时,程序会先判断upload目录下是否有INSTALL文件。如果存在,则弹窗提示你先删除 INSTALL 文件才能进行网站重装(对应上图 1-4行 代码)。但是这里注意了,网站在弹出告警信息后,并没有退出,而是继续执行,所以我们在不删除 INSTALL 文件的情况下,仍可以重装网站

比较有趣的是,原本网站网站安装成功后,程序会自动删除upload目录下的所有文件,来防止攻击者重装网站,然而这段代码却在注释当中,具体原因不得而知。

/****
    case '6': //删除安装目录

		if(rmdirs(ROOT_PATH.'/install') or rmdir(ROOT_PATH.'/install')){

			  echo '<script type="text/javascript">alert("删除成功!");close();</script>';
			  exit();

		}else{
			  echo '<script type="text/javascript">alert("删除失败,请手工删除网站根目录下install目录!");close();</script>';
			  exit();
		}

	break;
***/

漏洞利用:

漏洞利用就极其简单了 ,我们直接访问 install/index.php 页面,无视弹出来的警告:

ここに画像を挿入説明
ここに画像を挿入説明

  • Simple-Log1.6网站重装漏洞

漏洞分析:

我们再来看 Simple-Log1.6网站重装的例子。其install\index.php 文件中,对网站安装成功的处理有问题,其代码是在下图 17-20行 ,程序只是用 header 函数将其重定向到网站首页,然而程序还是会继续执行下去。
ここに画像を挿入説明
而且程序的安装逻辑其实是有问题的,安装步骤由 $setup变量控制,而 $setup变量可以被用户完全控制(如上图 第10行 代码),攻击者完全可以控制网站的安装步骤。

漏洞利用:

シンプルログイン的重装利用:
http://10.211.55.2:100/Simple-Log1.6/upload/install/index.php
ここに画像を挿入説明
ホスト= localhostの&DBNAME = day9&DBUSER =ルート&DBPASS =ルート&dbprefix =&ADMIN_USER =管理&admin_pass = 123456&BLOGNAME =管理&blogdesc =&セットアップ=仕上げ&ボタン=%E5%以下のBC%80%E5%A7%8B%E5%AE%89%E8%A3%85

アドバイス:

実際には、限り、我々は正しい場所にいるように、このタイプの脆弱性を修復する退出程序ことができます。この例の例を見てみましょう、私たちは必要な检查到非法操作直接加え、時間を退出函数発生し、脆弱性を回避するために、。例えばdieexit次のように他の機能は、特定の修復コード可能です。
ここに画像を挿入説明

エピローグ

おかげで再び[赤チーム]

公開された35元の記事 ウォン称賛19 ビュー5191

おすすめ

転載: blog.csdn.net/zhangpen130/article/details/104008350