[PHPコード監査]バックグラウンドで任意のファイルの読み取りと削除の監査を記録します

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==

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/xiaoguaiii/article/details/108095087