0x01はじめに
非常に古いcms、cmsをトレーニングしてくれたMaster Xiaoyangのおかげで、以下はcmsの任意のファイル読み取りの脆弱性と任意のファイルの削除の脆弱性の1つの監査ノートのみです。
0x02カタログ分析
このcmsを入手したとき、thinkphp3.2.3のフレームワーク構造に基づいて開発されていることがわかりました。コード監査の前に、thinkphp3.2.3の開発マニュアルを読みました。カタログ全体とコードの一部を読んだ後、カタログの分析(のみ個人的な意見):
└── uploads_code
├── App 默认应用目录
│ ├── Api (api接口)
│ ├── Common (公共模块,不能直接访问)
│ ├── Home (前台模块)
│ ├── Html (啥也没有)
│ ├── Manage (后台的功能模块)
│ ├── Mobile
│ └── Runtime (缓存)
├── Data 应该是一些后台的插件应用(默认就是那样的)
│ ├── config
│ ├── editor
│ ├── resource
│ └── static
├── Library cms图标
├── Include
│ ├── Common 公共函数目录
│ ├── Conf 配置文件目录
│ ├── Home
│ ├── Lang
│ ├── Library
│ ├── Mode 模型目录
│ ├── Runtime 缓存日志
│ └── Tpl
├── Install cms安装目录
│ ├── css
│ ├── images
│ ├── inc
│ └── tpl
├── Public 资源文件目录
│ ├── Home
│ └── Mobile
├── avatar
│ └── system
└── uploads 应该是一些上传后文件的存储位置
├── abc1
├── file1
├── img1
└── system
-index.php 首页
-xyhai.php 后台
0x03コード分析
3.1任意のファイル読み取りの脆弱性
最初にseayを使用してコードの自動監査を実行し、次に優先順位はappディレクトリの監査結果を確認することです。
seayの監査結果によると、任意のファイル読み取りの脆弱性は/App/Manage/Controller/TempletsController.class.phpの下にあります。
引き続き、seayツールを使用して特定の場所を見つけ、脆弱性が編集機能の下にあることを確認してください。
コードは次のように表示されます。
public function edit() {
$ftype = I('ftype', 0, 'intval');
$fname = I('fname', '', 'trim,htmlspecialchars');
$file_path = !$ftype ? './Public/Home/' . C('CFG_THEMESTYLE') . '/' : './Public/Mobile/' . C('CFG_MOBILE_THEMESTYLE') . '/';
if (IS_POST) {
if (empty($fname)) {
$this->error('未指定文件名');
}
$_ext = '.' . pathinfo($fname, PATHINFO_EXTENSION);
$_cfg_ext = C('TMPL_TEMPLATE_SUFFIX');
if ($_ext != $_cfg_ext) {
$this->error('文件后缀必须为"' . $_cfg_ext . '"');
}
$content = I('content', '', '');
$fname = ltrim($fname, './');
$truefile = $file_path . $fname;
if (false !== file_put_contents($truefile, $content)) {
$this->success('保存成功', U('index', array('ftype' => $ftype)));
} else {
$this->error('保存文件失败,请重试');
}
exit();
}
$fname = base64_decode($fname);
if (empty($fname)) {
$this->error('未指定要编辑的文件');
}
$truefile = $file_path . $fname;
if (!file_exists($truefile)) {
$this->error('文件不存在');
}
$content = file_get_contents($truefile);
if ($content === false) {
$this->error('读取文件失败');
}
$content = htmlspecialchars($content);
$this->assign('ftype', $ftype);
$this->assign('fname', $fname);
$this->assign('content', $content);
$this->assign('type', '修改模板');
$this->display();
}
$ ftype、ファイルタイプ、
$ fname、ファイル名、
$ file_path、ファイルパスの3つの変数が宣言
され、POST送信であるかどうかが判断されます。このコード全体で、ファイルを保存する必要があります。非ポスト送信はこのコードを直接スキップします
下に進み、base64で$ fnameをエンコードして出力し、fnameが空かどうかを判断します。空でない場合は、完全なファイルパスにスプライスされ、ファイルが存在するかどうかを判断してから、ファイルの内容を読み取ります。次に、コンテンツ全体が変更されたテンプレートに表示されます。
使用方法:(
追記:/ App / Manage /はバックグラウンド機能であるため、この脆弱性にはバックグラウンドログイン
が必要です)デフォルトでコンピューター上のphpstudyによって生成されたインデックスの読み取りなど、読み取る必要のあるファイルのbase64エンコーディング。 htmlファイル
…/…/…/…/…/ index.html
http://127.0.0.1/xyhcms3.5/uploads_code/xyhai.php?s=/Templets/edit/fname/Li4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbA==
3.2任意のファイル削除の脆弱性
また、このファイルの下には、任意のファイル削除の脆弱性があります。124行目のdel関数では
、ここでのロジックは、前の編集関数の任意のファイル読み取りに似ています。
fname変数をbase64でエンコードし
、渡されたパラメーターが存在するかどうかを判断し、ファイルアドレススプライシング後の削除などの操作を実行します。同じ使用方法
http://127.0.0.1/xyhcms3.5/uploads_code/xyhai.php?s=/Templets/del/fname/Li4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbA==