Web アプリケーションのセキュリティの脆弱性

クラスを注入する

データベースインジェクション

SQLインジェクション

構造化照会言語 (Structured Query Language) SQL と呼ばれる、構造化照会言語はデータです
データにアクセスし、リレーショナル データベース システムのクエリ、更新、管理を行うためのデータベース クエリとプログラミング言語
リレーショナル データベースは、 リレーショナル モデルを使用してデータを編成し、データを行と列の形式で格納する データベースを指します。
データは、ユーザーが理解しやすいように、リレーショナル データベースの一連の行と列をテーブルと呼び、テーブルのグループがデータを構成します。
図書館。一般的なリレーショナル データベースには、Oracle、DB2、Microsoft SQL Server、MySQL、Microsoft Access などがあります。

SQL ステートメントは次のように分割できます。

データ クエリ言語 (DQL): テーブルからデータを取得するために使用されます。一般的な予約語: SELECT 、 WHERE 、
ORDER BY、GROUP BY、HAVING
データ操作言語 (DML): テーブル内の行を追加、変更、削除するために使用されます。一般的に使用される予約語: INSERT
更新 削除
トランザクション制御言語 (
TCL): DML ステートメントの影響を受けるテーブルのすべての行が適時に更新されるようにします。一般的に使用される予約語: COMMIT、SAVEPOINT、ROLLBACK
データ制御言語 (DCL): GRANT または REVOKE による権限制御を実現し、個々のユーザーとユーザーを決定します
ユーザーグループによるデータベースオブジェクトへのアクセス
データ定義言語 (DDL): データベース内の新しいテーブルを作成するか、テーブルを変更または削除します。一般的な予約語:
作成、アラート、ドロップ
ポインター制御言語 (CCL): DECLARE CURSOR、FETCH INTO、および UPDATE 経由
現在の場所

  

        SQL インジェクション攻撃は、Web アプリケーションの開発時にユーザー入力データの正当性が判断されないことに起因しており、攻撃者は特別に構築された SQL の一部の特殊文字や命令を使用して、クエリを実行するコードを送信することができますデータベース、機密データを操作および取得します攻撃の対象は次のとおりです: データベース

例:

文字列クエリ = "SELECT * FROM users WHERE userName = '"+ ユーザー名変数 + "' AND パスワード = '"+ パスワード変数 + "'";

ResultSet rs = stmt.execute(query);

攻撃ペイロードを使用する場合:

ユーザー名: admin' または '1'='1

パスワード: admin@123' または '1'='1

        一重引用符で閉じます 

SQLインジェクションの手順        

①Webアプリケーションとデータベースの相互作用の可能性のある入力を特定する(潜在的な注入ポイントを特定する)
②SQL インジェクション文テスト
サーバーからの戻り値に基づいて、挿入されたステートメントが SQL 実行結果に影響を与えているかどうかを判断し、影響があるかどうかを判断します。
SQLインジェクションの場合 

SQLインジェクションの分類

– エラーベースの SQL インジェクション (エラーベースのインジェクション) はエラー情報を返します

– 条件の正否判定によるブールベースのブラインドSQLインジェクション(ブールインジェクション)

– 時間ベースのブラインド SQL インジェクション (時間ベースの遅延インジェクション) により、要求された結果の戻りを遅らせるかどうかを決定します。

注入パラメータの種類に応じて、次のように分類されます。

1. デジタルインジェクション
http://test.com/shownews.php?id=1
select * from news where news_id=1
2. キャラクターインジェクション
http://test.com/show.php?name=apple
select * from Fruit where name= ' apple '

SQL インジェクションのタイプをテストします。 

アプリケーション開発言語に基づいてデータベースの種類を決定する
オラクル:JAVA
DB2:JAVA
SQLサーバー:C#、ASP、.NET
MySQL:PHP、JAVA

独自の関数に基づいてデータベースの種類を決定します

 独自のデータシートに基づく判定

SQLインジェクションはインジェクション方法によって分けられます

インジェクションを表示
ユニオン クエリ #joint クエリ インジェクション、ユニオン ジョイント クエリを通じてクエリ結果を取得します。
エラーベースの#エラーレポート挿入、エラー情報からクエリ結果を取得
盲注
ブールベースのブラインド #Boolean ブラインドインジェクション。アプリケーションの真と偽の条件を推測するために異なる値を返します。
時間ベースのブラインド #タイムブラインド注入。さまざまな時間遅延を通じて真の条件と偽の条件を推測します。
優先順位: ユニオン クエリ≧エラー ベース>ブール ベースのブラインド>時間ベースのブラインド

フェデレーションクエリインジェクション 

ユニオンクエリ
前提条件: ページにデータベース クエリの結果を表示できる
id=1 order by 5 #猜字段数
id=-1 Union select 1,2,3,4,5 #どのフィールドにエコーがあるかをテストする
id=-1 Union select 1,concat(user(),0x2b,database()),3,4 #データベースユーザーとデータベースを取得
名前
id=-1 Union select 1,group_concat(個別のテーブル名),3,4 from
information_schema.tables where table_schema=database() #テーブル名の取得
id=-1 Union select 1,group_concat(個別の列名),3,4 from
information_schema.columns where table_name= 'user' #列名を取得
id=-1 union select 1,concat(id,0x2b,name,0x2b,password),3,4 from user #获取具
体積データ

 エラー挿入

エラーベース
前提: アプリケーションはデータベースのエラー メッセージを出力できます。
床()
and (select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from
information_schema.tables は x)a) でグループ化されます。
updatexml()
および 1=(updatexml(1,concat(0x3a,(select user())),1))
抽出値()
および extractvalue(1,concat(0x5c,(select user())))
exp()
および exp(~(select * from(select user())a))

ブールブラインド

前提: 条件の真のページと偽のページには違いがあり、区別できます。戻りページに従って条件が真か偽かを判断できます
よく使用される substr、ascii、mid などの関数を 1 つずつ推測する必要があります
if(substr(フラグ,1,1)in(0x66),3,0)
select case when ascii(mid((フラグからフラグを選択),1,1))=65 then 'A' else 'B' end

時間盲目
前提: ブラインドタイム注入は、他の注入方法が使用できない場合にのみ考慮され、時間遅延機能または
条件が真か偽かを判断するために時間遅延の効果を実現するその他の方法
if(substr(flag,1,1)in(0x66),sleep(2),0)
ascii(mid((フラグからフラグを選択),1,1))=65 の場合を選択してから
benchmark(100000,sha1('1 ')) else '' 終了

送信パラメータのタイプ

– デジタル

– 文字タイプ

– 検索タイプ

SQLインジェクションの防止策:

  1. パラメータ化されたクエリを使用する

  2. パラメータのタイプと形式を厳密に制限し、パラメータ検査の境界を明確にし、サーバーが正式に処理する前に送信されたデータの有効性をチェックします。

  3. 入力/パラメータのフィルタリングを検証します。つまり、ホワイトリスト/ブラックリストの検証。

SQL インジェクションの危険性:

  • データベース情報漏洩:データベースに保存されているユーザーの個人情報が漏洩すること。

  • Webページ改ざん:データベースを操作して特定のWebページを改ざんすること。

  • Web サイトは馬にリンクされており、マルウェアを拡散します。データベースの一部のフィールドの値を変更し、インターネットの馬へのリンクを埋め込み、馬を吊るすことによる攻撃を実行します。

  • データベースが不正に操作され、データベースサーバーが攻撃され、データベースのシステム管理者アカウントが改ざんされます。

  • サーバーはリモート制御されており、バックドアがインストールされています。データベース サーバーによって提供されるオペレーティング システムのサポートにより、ハッカーがオペレーティング システムを変更または制御できるようになります。

  • ハードディスクのデータを破壊し、システム全体を麻痺させます。

クロスサイトスクリプティング攻撃 xss

クロスサイト スクリプティング攻撃: Web 開発者がアプリケーションを作成するとき、ユーザーが送信したステートメントと変数をフィルターしたり制限したりしません。基本的に、データは静的スクリプト コード(HTML や Javascript など)に挿入され、ブラウザーが HTML ドキュメント全体をレンダリングするときに挿入されたスクリプトがトリガーされ、XSS 攻撃が発生します。

分類

1.反射型XSS跨站代码一般存在于链接中,请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码一般不存储到服务端。

2.存储型XSS: 存储型XSS,它和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库和文件中。通常是因为服务器端将用户输入的恶意脚本没有经过验证就存储在数据库中,并且通过调用数据库的方式,将数据呈现在浏览器上。

3.DOM型XSS一种基于DOM的跨站,这是客户端脚本自身解析不正确导致的安全问题

反射性XSS: 

 

  1. 用户正常登录
  2. 攻击者向客户发送恶意的url
  3. 客户使用浏览器访问恶意的url
  4. 服务端对攻击者的js做出回应
  5. 攻击中的js代码进行执行
  6. 用户的浏览器向攻击者发送会话令牌
  7. 攻击者劫持会话用户

存储型XSS

  1. 用户正常浏览服务器的信息
  2. 通过发帖向服务器发送包含恶意代码的帖子
  3. 用户向服务器请求帖子的内容
  4. 服务器返回了包含恶意代码的帖子
  5. 客户端服务器执行了恶意的代码 

DOM型XSS 

不可控的危险数据,未经过滤被传入存在缺陷的 JavaScript代码处理,最终触发 DOM XSS 漏洞。
与反射型 XSS 、存储型 XSS 的区别就在于 xss 代码并不需要服务器解析响应的直接参与,触发XSS 靠的是浏览器端的DOM解析

XSS的防范措施

对用户提交内容进行合法性校 验
对用户提交内容进行转义处理
对用户输入的长度进行限制
Cookieの有効期限を制限する
HtmlEncoder を使用して出力データの一部の文字をエスケープする

 CSRF クロスサイト リクエスト フォージェリ

サーバーは攻撃者の偽装リクエストをブラウザから受信し、実行します。

クロスサイト スクリプティング (XSS) と比較すると、XSS は Web サイトに対するユーザーのブラウザーの信頼を使用し、CSRF はユーザーのブラウザーに対する Web サイトの信頼を使用します。

CSRF攻撃を完了するために必要な条件

1. アカウントからログアウトできない

2. 双方が同じブラウザを使用する必要がある

CSRFとXSSの違い
攻撃プロセス
攻撃者が XSS 脆弱性を発見 - コードを構築 - 送信
被害者 - 被害者オープン - 攻撃者が被害者のものを入手
Cookie - 攻撃を完了します
攻撃者は CSRF 脆弱性を発見 - コードを構築 - 送信
被害者—被害者オープン— 被害者がコードを実行 —終了
攻撃
違い
攻撃者は攻撃を完了するためにバックグラウンドでログインする必要があり、管理者はログを調べることで攻撃者を見つけることができるため、XSS は簡単に見つけられます。
CSRF は異なります。その攻撃は管理者自身によって実装されており、攻撃者はコードの構築のみを担当します。

CSRF保護

HTTP リファラーはヘッダーの一部であり、ブラウザが Web サーバーにリクエストを送信するとき、通常はリファラーを呼び出して、どのページからリンクしているかをサーバーに伝えます。
  request.getHeader("REFERER");
Refererの値をチェックすることでリクエストが合法か違法かを判断し、CSRF攻撃の発生を監視することができます。

 ファイルアップロードの脆弱性

違法なファイルアップロードの主な理由は、ユーザーがアップロードしたファイルタイプが検証されていないかサーバー側で検証が不完全であるため、ユーザーが悪意のあるスクリプトをサーバーにアップロードできることです。
  この欠陥を利用して、 Webshel​​l 、ウイルス、その他の悪意のあるコードをアップロードし、権限をさらに昇格させることができます。
データベース情報 (ドラッグ ライブラリ) を取得し、サーバー権限をダウンすることもできます

ファイルアップロード保護 

1. アップロードされるファイルの種類「ホワイトリスト」をサーバー側に追加します。検証機能。ビジネス要件タイプのアップロードのみを許可します
2. サーバー側は、特殊文字によって引き起こされるファイル解析の脆弱性を防ぐために、ファイル名をアップロードするための特殊文字フィルタリング メカニズムを追加します。
3. サーバー側は、ファイル接尾辞形式の名前変更など、アップロードされたファイルの名前変更メカニズムを追加します。
4. サーバー側は、アップロードされたファイルのコンテンツ識別メカニズムを追加し、悪意のあるファイルが偽装画像やその他の種類のファイルとしてアップロードされるのを防ぎます。
5. サーバー側は別のアップロード ディレクトリを作成し、Web タイプのファイルのディレクトリ分析を防ぐためにディレクトリ分析のアクセス許可を制限します。

パストラバーサル - 任意のファイルのダウンロード

サーバー側では、ブラウザからファイル名を受け取り、サーバー側でファイルの絶対パスをつなぎ合わせ、出力ストリームとともにダウンロードします。
String path = request.getParameter("path");
java.io.OutputStream os = response.getOutputStream();
java.io.FileInputStream fis = new java.io.FileInputStream(path);
byte[] b = new byte[1024];
int i = 0;
while ((i = fis.read(b)) > 0 ){
os.write(b, 0, i);
}
fis.close();
os.flush();
os.close();

构造攻击载荷
../../../../../../../etc/passwd

 パストラバーサル保護

1. ダウンロードするファイルのアドレスをデータベースに保存します。
2.ファイルIDは乱数で命名されます
3. ファイル パスがデータベースに保存され、ユーザーは ID に対応するファイルを送信してファイルをダウンロードします。
4. ファイルをダウンロードする前に許可判定を行います。
5. ファイルのダウンロードログを記録する
ファイル アクセスの場合、ファイル パスへのリンクが直接与えられます。好き:
<a href= “http://xx.xx.xx.xx/upload/file1.jpg”>

壊れた認証 無効な認証

1. ユーザー認証資格情報はハッシュ化または暗号化されません。
2. 認証資格情報が推測される可能性がある
3. SessionId は URL で公開されます
4. SessionId にはタイムアウト制限がありません。
5. パスワード、セッション ID、およびその他の認証資格情報は、暗号化されていない接続を使用して送信されます。

認証情報は暗号化されません:

パスワード情報平文送信、パスワード情報平文保存

セッション管理:

セッションの更新:

認証前後でセッション識別情報が更新されているかどうか。
セッションストレージ:
セッション識別情報が URL リンクやページ情報などの安全でない場所に保存されているかどうか。
セッションの破棄:
セッションが使い果たされた後、または権限がキャンセルされた後に、セッションの終了および破棄操作を実行するかどうか。

壊れたアクセス制御

Web サイトのアクセス許可は、システムによって設定された特定のセキュリティ ルールまたはセキュリティ ポリシーを指し、ユーザーはアクセスでき、自分の独自のもののみにアクセスできます。
認可されたリソース。
不正な攻撃とは、攻撃者が技術的手段を通じて、自分の権限に属さない機能や情報を閲覧または使用することを指します。 

 不正な攻撃

不正な閲覧
攻撃者は、ログインせずに特定のリンク アドレスを介して他人のユーザー情報を閲覧できる
機能の不正使用
攻撃者は、ログインせずに特定のリンク アドレスを介して特定のユーザーまたはシステム機能を使用します。

 ウルトラウイルス

垂直権限昇格の脆弱性 (権限昇格の脆弱性とも呼ばれます)。Web アプリケーションには権限制御がないか、メニュー上の権限のみを制御するため、悪意のあるユーザーは URL を推測する限り、他のロールが所有するデータにアクセスしたり制御したりできます。他の管理ページまたは権限昇格を目的としたページの
攻撃者は、 低い特権のアカウントを使用して、 高い特権のアカウントのみが使用できる情報や機能を 表示または使用します。
水平方向のオーバーリーチの脆弱性 : Web アプリケーションがユーザーのリクエストを受信して​​データを変更する場合、データの所有者を判断できないか、データの所有者を判断するときにリクエスト パラメーター (ユーザーが制御可能) からデータの所有者を取得します。個人 ID を使用すると、悪意のある攻撃者がデータ ID を変更したり、所有者 ID を変更したりすることで、自分に属さないデータを変更することができます。悪意のある
ユーザーは他の人のデータを削除または変更できます
攻撃者は、特定の権限を持つアカウントを使用して、 同じレベルの 他のユーザーのモジュール機能にアクセスまたは使用します。

 不正アクセスからの保護

垂直方向のオーバーリーチの脆弱性: 関数を呼び出す前に、現在のユーザー ID に関連関数を呼び出す権限があるかどうかを確認します (統合権限検証にはフィルターを使用することをお勧めします)。
水平方向の不正アクセスの脆弱性: ユーザーが操作を実行すると、セッションからユーザー ID が取得され、受信パラメータがバインドされ、ユーザーの ID で検証されます。

 Java デシリアライゼーションの脆弱性

シリアル化: ObjectOutputStream クラス --> writeObject()

このメソッドは、パラメータで指定された objオブジェクト をシリアル化し、バイト シーケンスを ターゲット出力ストリームに書き込みます。Java 標準規則に従って 、ファイルには .ser 拡張子が付け られ ます
1) 別のタイプのオブジェクトをラップできるオブジェクト出力ストリームを作成する
ファイル出力ストリームなどの標準出力ストリーム。
2) オブジェクト出力ストリームの writeObject() メソッドを通じてオブジェクトを書き込みます。
逆シリアル化: ObjectInputStream クラス --> readObject()
このメソッドは、ソース入力ストリームから一連のバイトを読み取り、オブジェクト に、それを返します。
1) ファイル入力ストリームなど、別のタイプのソース入力ストリームをラップできるオブジェクト入力ストリームを作成します。
2) オブジェクト入力ストリームの readObject() メソッドを通じてオブジェクトを読み取ります。

 攻撃者は悪意のある構築を実行して、逆シリアル化により予期しないオブジェクトを生成することができ、生成プロセス中に任意のコードが実行される可能性があります。

おすすめ

転載: blog.csdn.net/qq_53633989/article/details/130554037