-
- /**
- * パラメータフィルタリングコード
- * bbs.it-home.org を編集
- */
- if (@get_magic_quotes_gpc ()) {
- $_GET = sec ( $_GET );
- $_POST = sec ( $_POST );
- $_COOKIE = sec ( $_COOKIE );
- $_FILES = sec ( $_FILES );
- }
- $_SERVER = sec ( $_SERVER );
- function sec(&$array) {
- //配列の場合は配列を走査するそしてそれを再帰的に呼び出します
- if (is_array ( $array )) {
- foreach ( $array as $k => $v ) {
- $array [$k] = sec ( $v );
- }
- } else if ( is_string ( $array )) {
- //addslashes 関数を使用して処理します
- $array = addlashes ( $array );
- } else if (is_numeric ( $array )) {
- $array = intval ( $array );
- }
- return $array;
- }
- ?>
コードをコピー
1.
入力パラメータ YY が整数の場合、通常、abc.asp 内の元の SQL ステートメントはおおよそ次のようになります。
select * from table name where field=YY なので、次の手順を使用して SQL インジェクションが存在するかどうかをテストできます。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(シングルクォーテーション付き) このとき、abc.ASP内のSQL文は次のようになります。
select * from table name where field=YY’ の場合、abc.asp が異常実行します。
②HTTP://xxx.xxx.xxx/abc.asp?p=YY かつ 1=1 の場合、abc.asp は正常に実行され、結果は HTTP://xxx.xxx.xxx/abc.asp?p と同じになります。 =YY;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY かつ 1=2 の場合、abc.asp が異常実行します。
上記の 3 つの手順が完全に満たされている場合は、abc.asp に SQL インジェクションの脆弱性が存在するはずです。
整数フィルター関数、コードは次のとおりです。
-
-
function num_check($id) { - if (! $id) {
- die ( 'パラメータを空にすることはできません!' );
- } // かどうかempty 判定
- else if (inject_check ( $id )) {
- die ( 'illegalparameter' );
- } // インジェクション判定
- else if (! is_numetic ( $id )) {
- die ( 'illegalparameter' );
- }
- //数値判定
- $id = intval ($id);
- //整数化
- return $id;
- }
//文字フィルタ関数
- function str_check($str ) {
- if (inject_check ( $str )) {
- die ( 'illegalparameter' );
- }
- //インジェクション判定
- $str = htmlspecialchars ( $str );
- // html変換
- return $str;
- }
- function search_check($str) {
- $str = str_replace ( "_", "_", $str );
- //"_" を除外
- $str = str_replace ( "%", "%", $ str );
- //「%」を除外
- $str = htmlspecialchars ( $str );
- //htmlを変換
- return $str;
- }
- //フォームフィルター関数
- function post_check($str, $min, $max) {
- if (isset ( $min ) && strlen ( $str ) < $min) {
- die ( '最小 $min バイト' );
- } else if (isset ( $max ) && strlen ( $str ) > $ max) {
- die ( '$max バイトまで' );
- }
- returntripslashes_array ( $str );
- }
- ?>
-
コードをコピー
入力パラメータ YY の場合は文字列です。通常、abc.asp 内の元の SQL ステートメントはおおよそ次のとおりです。
select * from table name where field='YY' なので、次の手順を使用して SQL インジェクションが存在するかどうかをテストできます。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(シングルクォーテーション付き) このとき、abc.ASP内のSQL文は次のようになります。
select * from table name where field=YY’ の場合、abc.asp が異常実行します。
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb … 39;1'='1'、abc.asp は正常に動作し、HTTP://xxx.xxx.xxx/abc と同じです.asp ?p=YY の実行結果は同じです。
③HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb … 39;1'='2'、abc.asp が異常実行します。
上記の 3 つの手順が完全に満たされている場合は、abc.asp に SQL インジェクションの脆弱性が存在するはずです。
SQL インジェクションを防ぐ関数をアタッチします。
-
- //アンチインジェクション関数
- function inject_check($sql_str) {
- return eregi ( 'select|inert|update|delete|'|/*|*|../|. / |UNION|into|load_file|outfile', $sql_str );
- // bbs.it-home.org へのインジェクションを防ぐフィルター
- }
- functiontripslashes_array(&$array) {
- if (is_array ( $array )) {
- foreach ( $array as $k => $v ) {
- $array [$k] = ストリップスラッシュ_配列 ( $v );
- }
- } else if (is_string ( $array )) {
- $array = ストリップスラッシュ ( $ array );
- }
- return $array;
- }
- ?>
コードをコピー
|