この記事では、SQL インジェクションについての知識を提供します。SQL インジェクションとは、サーバーがクライアントから送信されたデータを厳密に検証せず、サーバー側の SQL ステートメントが悪意を持って変更され、正常に実行される動作です。誰にとっても役立ちます。
#SQL とは何ですか?
構造化照会言語 (SQL) は、データベースの標準データ クエリに使用される特別なプログラミング言語です。 1986 年 10 月、米国規格協会は SQL を標準化し、リレーショナル データベース システムの標準言語として使用しました。 1987年に国際標準化機構の支援を受けて国際標準となった。 SQL インジェクションとはSQL インジェクションとは、サーバーがクライアントから送信されたデータを厳密に検証せず、その結果サーバーの SQL ステートメントが悪意を持って変更され、正常に実行される動作です- プログラマがプログラムやデータベースと対話するとき、文字列の連結を使用して SQL ステートメントを構築します。
- ユーザー制御可能なパラメータのフィルタリングが不十分です。パラメータの内容が結合されます。
- #脆弱性の原因
- 入力チェックが不十分なため、SQL文が不正に実行されるユーザーによって送信された不正なデータは、ステートメントの一部として実行されます。
- SQL インジェクションがある理由
- フレームワークのセキュリティ構成が有効になっていません。例: PHP の magic_quotes_gpc #フレームワークのセキュリティ クエリ メソッドが使用されていません
- #テスト インターフェイスが削除されていません
- ファイアウォールは有効になっていません
- 他のセキュリティ保護機器は使用されていません ##注入ポイントの考えられる場所
- #SQL の原則によるインジェクションの脆弱性では、ユーザーが「制御可能なパラメーター」に SQL を挿入します。言い換えれば、Web アプリケーションがユーザー入力を取得する場所では、それがデータベース クエリに取り込まれる限り、SQL インジェクションの可能性があります。これらの場所には通常、次のような場所が含まれます。
- ##GET データ #POST データ
#Cookie データ
HTTP ヘッダー (HTTP ヘッダーのその他のフィールド)
- #脆弱性の危険
- データベース情報の漏洩、機密データの取得、改ざん:データベースに保存されているユーザーの個人情報(アカウント、パスワード)の漏洩
- ログイン認証のバイパス: Web サイトのバックエンドなどにログインするためのユニバーサル パスワード。
- ファイル システム操作: ディレクトリの一覧表示、ファイルの読み取り、書き込みなど。
- システム コマンドの実行: コマンドをリモートで実行
- サーバーはリモートで制御され、トロイの木馬が仕掛けられます。ハッカーはオペレーティング システムを変更または制御することができます
- 提出方法
- 提出方法には、取得、投稿、Cookie、リクエストなどがあります。
- その中で: リクエストのサポートが優れており、get メソッド、post メソッド、cookie メソッドが使用できます 送信が可能です
- インジェクションポイントを決定します
- でデータを送信しようとします疑わしいインジェクションポイントまたはパラメータの背後にあるパラメータを調べて、SQL インジェクションの脆弱性があるかどうかを判断します。
テストデータ
-1 または 1 | 前または次のページをエコーできるかどうか (エコーがあるかどうかを判断するため) | ジョイント インジェクション | |||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
または ##" | データベース エラー メッセージが表示されるかどうか、エコーされたページが異なるかどうか (文字型か数値型か) | エラー挿入 | |||||||||||||||||||||||||||||||||||||
and 1=1 または and 1=2 エコーされたページが異なるかどうか (ページがブール型ステータスを持つかどうかを決定)
| Booleanブラインド インジェクション #and sleep(5) | ||||||||||||||||||||||||||||||||||||||
遅延インジェクション | \ | ||||||||||||||||||||||||||||||||||||||
##secure_file_priv=NULL | mysqld を制限してインポートとエクスポートを許可しないOperations | ||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
は、mysqld のインポートおよびエクスポート操作を固定ディレクトリに制限し、サブディレクトリは有効です | |||||||||||||||||||||||||||||||||||||||
mysqld のインポートおよびエクスポート操作に制限はありません | |||||||||||||||||||||||||||||||||||||||
SQLServer |
Oracle | PostgreSQL | アクセス | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
# ###### - ############ - ############ - #########なし#### | ##複数行のコメント |
/**/
|
/**/
|
/**&*/
| なし|||||||||||||||||||||||
3306 | 1433 1521 |
5432 はファイル データベースです。したがって、ポート番号は必要ありません |
数据库文件后缀名
特有的数据库
查看当前用户或权限
查询当前用户 select user(); select substring_index(user(), '@', 1) ; 查询当前用户的权限 select * from mysql.user where user = substring_index(user(), '@', 1) ;
判断是否是SA权限select is_srvrolemember('sysadmin') 判断是否是db_owner权限 select is_member('db_owner')判断是否是public权限select is_srvrolemember('public')
查看当前用户select * from user_users;查看当前用户拥有的角色 select * from session_roles;查看当前用户拥有的权限select * from session_privs;
select user #查看用户select current_user #查看当前用户
Access数据库是文件类型数据库,没有用户和权限的概念 ASCII转换函数
不同数据库注入结果的区别⭐
Sql注入中连接字符串常用函数在select数据时,我们往往需要将数据进行连接后进行回显。很多的时候想将多个数据或者多行数据进行输出的时候,需要使用字符串连接函数。在sqli中,常见的字符串连接函数有 concat()函数不使用字符串连接函数时: 但是这里存在的一个问题是,当使用union联合注入时,我们都知道,联合注入要求前后两个选择的列数要相同,这里id,username是两个列,当我们要一个列的时候,(当然不排除你先爆出id,再爆出username,分两次的做法)该怎么办?答案就是
concat_ws 函数使用方法:
注意:如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。 group_concat 函数基本查询 mysql> select * from aa; +------+------+ | id| name | +------+------+ |1 | 10| |1 | 20| |1 | 20| |2 | 20| |3 | 200 | |3 | 500 | +------+------+ 6 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,逗号分隔(默认) mysql> select id,group_concat(name) from aa group by id; +------+--------------------+ | id| group_concat(name) | +------+--------------------+ |1 | 10,20,20| |2 | 20 | |3 | 200,500| +------+--------------------+ 3 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,分号分隔 mysql> select id,group_concat(name separator ';') from aa group by id; +------+----------------------------------+ | id| group_concat(name separator ';') | +------+----------------------------------+ |1 | 10;20;20 | |2 | 20| |3 | 200;500 | +------+----------------------------------+ 3 rows in set (0.00 sec) 以id分组,把去冗余的name字段的值打印在一行, mysql> select id,group_concat(distinct name) from aa group by id; +------+-----------------------------+ | id| group_concat(distinct name) | +------+-----------------------------+ |1 | 10,20| |2 | 20 | |3 | 200,500 | +------+-----------------------------+ 3 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序 mysql> select id,group_concat(name order by name desc) from aa group by id; +------+---------------------------------------+ | id| group_concat(name order by name desc) | +------+---------------------------------------+ |1 | 20,20,10 | |2 | 20| |3 | 500,200| +------+---------------------------------------+ 3 rows in set (0.00 sec) 补充知识—数据库结构数据库结构:数据库 —> 表名 —> 列名 —> 数据
use dvwa; # 选中dvwa数据库 show tables; # 查看dvwa数据库中有哪些表
补充知识—关于SQL的一些常识注释
点数据库中,符号 常用语句和函数推荐阅读:SQL注入必备知识初级
5:select 函数名; 查询某内容 防御措施防御SQL注入的核心思想是对用户输入的数据进行严格的检查,并且对数据库的使用采用最小权限分配原则。目前SQL注入的防御手段有以下几种: 代码层
强迫使用参数化语句。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击
例如Mybatis中使用 Thinkphp框架的安全写法 安全的替换写法 $data=M('Member')->where(array('id'=>$_GET['id']))->find();//使用数组方式将自动使用框架自带的字段类型检测防止注入 $data=M('Member')->where(array('id'=>(int)$_GET['id']))->find();//类型约束 $data=M('Member')->where('id='.intval($_GET['id']))->find();//类型转换 $data=M('Member')->where(array('id'=>I('get.id','','intval')))->find();//$data=M('Member')- >where(array('id'=>':id'))->bind(':id',I('get.id'))->select();//PDO驱动可以使用参数绑定 $data=M('Member')->where("id=%d",array($_GET['id']))->find();//预处理机制 //不安全的写法举例 $_GET['id']=8;//希望得到的是正整数 $data=M()->query('SELECT * FROM `member` WHERE id='.$_GET['id']);//执行的SQL语句 $_GET['id']='8 UNION SELECT * FROM `member`';;//隐患:构造畸形语句进行注入; 数据库加固主要包括:
其他例如,避免网站显示SQL执行出错信息,防止攻击者使用基于错误的方式进行注入;每个数据层编码统一,防止过滤模型被绕过等。使用WAF。 相关推荐:《mysql教程》 |
以上がSQL インジェクションを理解するためのガイド (詳細)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

SQLの制約を削除するには、次の手順を実行します。削除する制約名を特定します。 ALTER TABLEステートメントを使用してください:Table Table Name Drop Constraint Constraint Nameを変更します。削除を確認します。

SQLトリガーは、特定のイベントが指定されたテーブルで実行されたときに特定のアクションを自動的に実行するデータベースオブジェクトです。 SQLトリガーをセットアップするには、トリガー名、テーブル名、イベントタイプ、トリガーコードを含むCreate Triggerステートメントを使用できます。トリガーコードは、ASキーワードを使用して定義され、SQLまたはPL/SQLステートメントまたはブロックが含まれます。トリガー条件を指定することにより、Where句を使用して、トリガーの実行範囲を制限できます。トリガー操作は、インサート、更新、または削除ステートメントを使用してトリガーコードで実行できます。新しいキーワードと古いキーワードを使用して、トリガーコードの影響を受けるキーワードを参照できます。

インデックス作成は、データ列を並べ替えてデータ検索を加速するデータ構造です。 SQLクエリにインデックスを追加する手順は次のとおりです。インデックス化する必要がある列を決定します。適切なインデックスタイプ(Bツリー、ハッシュ、またはビットマップ)を選択します。 Create Indexコマンドを使用して、インデックスを作成します。インデックスを定期的に再構築または再編成して、その効率を維持します。インデックスの追加の利点には、クエリパフォーマンスの改善、I/O操作の削減、最適化された並べ替えとフィルタリング、および並行性の改善が含まれます。クエリが特定の列を使用することが多い場合、ソートまたはグループ化する必要がある大量のデータを返し、大きい複数のテーブルまたはデータベーステーブルが含まれます。インデックスの追加を検討する必要があります。

Ifelseステートメントは、条件付き評価結果に基づいて異なる値を返す条件付きステートメントです。その構文構造は次のとおりです。if(条件)then return_value_if_condition_is_true elsen return_value_if_condition_is_false end if;。

SQLデータベースエラーを表示する方法は次のとおりです。1。エラーメッセージを直接表示します。 2。エラーを表示し、警告コマンドを表示します。 3.エラーログにアクセスします。 4.エラーコードを使用して、エラーの原因を見つけます。 5.データベース接続とクエリ構文を確認します。 6.デバッグツールを使用します。

個別の演算子は、SQLクエリの重複行を除外し、一意の値のみを返すために使用されます。一意の値のリストを取得したり、一意の値の数を数えたり、グループと組み合わせて使用したりするなどのシナリオに適しています。

SQLで候補キーを設定する方法:一意の識別列を決定します。主キーの制約を使用して主キーを作成します。一意の制約を使用して一意の制約を追加します。一意のインデックスを作成します。候補キーの設定により、データの整合性が確保され、クエリのパフォーマンスが向上し、データの複製が防止されます。

SQLの更新ステートメントは、既存のレコードを変更するために使用されます。Syntax:Update Table_name set column1 = new_value1、column2 = new_value2、...条件の使用法:テーブル名を指定して、設定句と更新する列をリストし、更新する新しい値をリストします。 Where句を使用して、更新条件を指定します(オプション)


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

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

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

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

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ホットトピック



