彼は、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
アドバイス:
実際には、限り、我々は正しい場所にいるように、このタイプの脆弱性を修復する退出程序
ことができます。この例の例を見てみましょう、私たちは必要な检查到非法操作
直接加え、時間を退出函数
発生し、脆弱性を回避するために、。例えばdie
、exit
次のように他の機能は、特定の修復コード可能です。
エピローグ
おかげで再び[赤チーム]