クラスを注入する
データベースインジェクション
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=1select * from news where news_id=12. キャラクターインジェクションhttp://test.com/show.php?name=appleselect * from Fruit where name= ' apple '
SQL インジェクションのタイプをテストします。
オラクル:JAVADB2:JAVASQLサーバー:C#、ASP、.NETMySQL: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 frominformation_schema.tables where table_schema=database() #テーブル名の取得id=-1 Union select 1,group_concat(個別の列名),3,4 frominformation_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 frominformation_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インジェクションの防止策:
-
パラメータ化されたクエリを使用する
-
パラメータのタイプと形式を厳密に制限し、パラメータ検査の境界を明確にし、サーバーが正式に処理する前に送信されたデータの有効性をチェックします。
-
入力/パラメータのフィルタリングを検証します。つまり、ホワイトリスト/ブラックリストの検証。
SQL インジェクションの危険性:
-
データベース情報漏洩:データベースに保存されているユーザーの個人情報が漏洩すること。
-
Webページ改ざん:データベースを操作して特定のWebページを改ざんすること。
-
Web サイトは馬にリンクされており、マルウェアを拡散します。データベースの一部のフィールドの値を変更し、インターネットの馬へのリンクを埋め込み、馬を吊るすことによる攻撃を実行します。
-
データベースが不正に操作され、データベースサーバーが攻撃され、データベースのシステム管理者アカウントが改ざんされます。
-
サーバーはリモート制御されており、バックドアがインストールされています。データベース サーバーによって提供されるオペレーティング システムのサポートにより、ハッカーがオペレーティング システムを変更または制御できるようになります。
-
ハードディスクのデータを破壊し、システム全体を麻痺させます。
クロスサイトスクリプティング攻撃 xss
クロスサイト スクリプティング攻撃: Web 開発者がアプリケーションを作成するとき、ユーザーが送信したステートメントと変数をフィルターしたり制限したりしません。基本的に、データは静的スクリプト コード(HTML や Javascript など)に挿入され、ブラウザーが HTML ドキュメント全体をレンダリングするときに挿入されたスクリプトがトリガーされ、XSS 攻撃が発生します。
分類
1.反射型XSS:跨站代码一般存在于链接中,请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码一般不存储到服务端。
2.存储型XSS: 存储型XSS,它和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库和文件中。通常是因为服务器端将用户输入的恶意脚本没有经过验证就存储在数据库中,并且通过调用数据库的方式,将数据呈现在浏览器上。
3.DOM型XSS:一种基于DOM的跨站,这是客户端脚本自身解析不正确导致的安全问题
反射性XSS:
- 用户正常登录
- 攻击者向客户发送恶意的url
- 客户使用浏览器访问恶意的url
- 服务端对攻击者的js做出回应
- 攻击中的js代码进行执行
- 用户的浏览器向攻击者发送会话令牌
- 攻击者劫持会话用户
存储型XSS:
- 用户正常浏览服务器的信息
- 通过发帖向服务器发送包含恶意代码的帖子
- 用户向服务器请求帖子的内容
- 服务器返回了包含恶意代码的帖子
- 客户端服务器执行了恶意的代码
DOM型XSS
与反射型 XSS 、存储型 XSS 的区别就在于 xss 代码并不需要服务器解析响应的直接参与,触发XSS 靠的是浏览器端的DOM解析
XSS的防范措施
对用户提交内容进行合法性校 验对用户提交内容进行转义处理对用户输入的长度进行限制Cookieの有効期限を制限するHtmlEncoder を使用して出力データの一部の文字をエスケープする
CSRF クロスサイト リクエスト フォージェリ
サーバーは攻撃者の偽装リクエストをブラウザから受信し、実行します。
クロスサイト スクリプティング (XSS) と比較すると、XSS は Web サイトに対するユーザーのブラウザーの信頼を使用し、CSRF はユーザーのブラウザーに対する Web サイトの信頼を使用します。
CSRF攻撃を完了するために必要な条件
1. アカウントからログアウトできない
2. 双方が同じブラウザを使用する必要がある
攻撃プロセス• 攻撃者が XSS 脆弱性を発見 - コードを構築 - 送信被害者 - 被害者オープン - 攻撃者が被害者のものを入手Cookie - 攻撃を完了します• 攻撃者は CSRF 脆弱性を発見 - コードを構築 - 送信被害者—被害者オープン— 被害者がコードを実行 —終了攻撃
• 攻撃者は攻撃を完了するためにバックグラウンドでログインする必要があり、管理者はログを調べることで攻撃者を見つけることができるため、XSS は簡単に見つけられます。• CSRF は異なります。その攻撃は管理者自身によって実装されており、攻撃者はコードの構築のみを担当します。
CSRF保護
HTTP リファラーはヘッダーの一部であり、ブラウザが Web サーバーにリクエストを送信するとき、通常はリファラーを呼び出して、どのページからリンクしているかをサーバーに伝えます。request.getHeader("REFERER");Refererの値をチェックすることでリクエストが合法か違法かを判断し、CSRF攻撃の発生を監視することができます。
ファイルアップロードの脆弱性
違法なファイルアップロードの主な理由は、ユーザーがアップロードしたファイルタイプが検証されていないか、サーバー側で検証が不完全であるため、ユーザーが悪意のあるスクリプトをサーバーにアップロードできることです。この欠陥を利用して、 Webshell 、ウイルス、その他の悪意のあるコードをアップロードし、権限をさらに昇格させることができます。データベース情報 (ドラッグ ライブラリ) を取得し、サーバー権限をダウンすることもできます
ファイルアップロード保護
パストラバーサル - 任意のファイルのダウンロード
サーバー側では、ブラウザからファイル名を受け取り、サーバー側でファイルの絶対パスをつなぎ合わせ、出力ストリームとともにダウンロードします。
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() メソッドを通じてオブジェクトを読み取ります。
攻撃者は悪意のある構築を実行して、逆シリアル化により予期しないオブジェクトを生成することができ、生成プロセス中に任意のコードが実行される可能性があります。