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']
変数の公式ドキュメントは次のとおりです:
簡単に言えば、この変数は、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の最後に
/*
を追加することができます。つまり、ファイル名の後にスペース + /*
を追加して、ファイル名を破棄して、ファイル名の後にデータを取得できます。
テストでは、
'(一重引用符)"(二重引用符)、;(セミコロン)<>(角カッコ)()(カッコ)
などのペイロードで一般的に使用される記号はフィルタリングされません。 一般的なCMSでは、一般にGET、POST、COOKIEの3つの変数のみがフィルタリングされます.GPCのグローバルエスケープが有効になっていても、$_SERVER
変数はエスケープされません。
特別な注意が必要なのは、ペイロードに
?
(疑問符)は表示されません、疑問符が切り捨てられ、ファイル名の後にデータを取得できなくなります。0x02 使用方法
私はかつてこのCMSに遭遇し、
$_SERVER['SCRIPT_NAME']
をページに直接書きました。 このようにして、反射的なxss攻撃を実行できます。 さらに、CMSはヘッダを保護せずにphpファイルとして直接ページをキャッシュします。 言い換えれば、私たちが書くPHP文もキャッシュファイルにキャッシュされます。 WebShellを直接生成します。
コード監査中に
$_SERVER['SCRIPT_NAME']
変数を追跡して、変数の値がデータベースに渡されるか、ページに直接渡されるかどうかを調べることができます。0x03 ケーススタディ - XSS
index.php
コードは次のとおりです:
exp:
http://localhost/index.php/ /*
0x04 ケーススタディ - SQLインジェクション
index.php
コードは次のとおりです:
exp:
この 作品 は クリエイティブ・コモンズ 表示 - 非営利 - 継承 3.0 非移植 ライセンスの下に提供されています。