Codeql が Cookie が httponly を有効にしない問題を分析する方法
はじめに
今日は、codeql を使用して「Cookie が httponly で有効になっていない」などのセキュリティ問題を分析し、codeql の使用法を深めます。うまく機能する場合は、Vulnerability-goapp の他の脆弱性を修正することを検討できます。
go プログラムを分析する場合は、codeql-go をさらにダウンロードする必要があります
手順
監査オブジェクト
Vulnerability-goapp: 教育用の脆弱な golang Web アプリケーション。
変更
このプロジェクトのすべての Cookie には http のみの属性が設定されていないため、比較する前にまずそれらを変更する必要があります。以下は元の文を書き直したものです。 レコードの変更: 一部の Cookie 設定に http のみのオプションを追加します。
pkg\admin\admin.go を次のように変更します。
pkg\login\login.go を次のように変更します。
pkg\register\register.go を次のように変更します。
変更後に必ずデータベースを再生成してください (古い DATAbase を上書きする必要がある場合は、まず古い DATAbase を削除してから、新しい DATAbase を生成する必要があります。
目的
codeql スクリプトを使用して、httponly が設定されていない、および httponly が設定されているが httponly の値が false である抜け穴を見つけることです (通常はそうではありませんが、保証されません)。
ソースとシンクの決定
シンクの定義
シンクは非常にシンプルで、Cookie を設定するときは、http.SetCookie メソッドを使用する必要があります。設定するのはこの関数の 2 番目のパラメータで、Sink のクエリ ステートメントを次のように記述します。
import go from DataFlow::Node sink where exists(DataFlow::CallNode c | c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = sink ) select sink
実行後、次の結果が得られます。任意の項目をクリックすると、その項目にジャンプします。
次のように Sink クラスに変換されます
private class Sink extends DataFlow::Node { Sink() { exists(DataFlow::CallNode c | c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = this ) } }
このように変数を Sink として定義すると例:
import go private class Sink extends DataFlow::Node { Sink() { exists(DataFlow::CallNode c | c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = this ) } } from Sink s select s
実行後、同じ結果が得られます。
ソース定義
次に、ソース。http.SetCookie メソッドで受け取ったパラメータから判断すると、実際の 2 番目のパラメータは、Cookie を受け取る構造体へのポインタです。
したがって、最初に見つける必要があります。まずはプロジェクト内のすべての構造をリストします。
codeql-go の構造について本文の定義は次のとおりです。たとえば、クエリ スクリプトです。
import go from StructLit source select source

次に、他の無関係なコンテンツを削除し、タイプを制限します。 hasQualifiedName メソッドについては、さまざまな Codeql-go のさまざまな型が同じメソッドを持っていますが、定義は次のようになります マークされたオブジェクトはどのパッケージに属し、その名前は何であるかということです。
import go from StructLit source // where source.getType().hasQualifiedName("net/http", "Cookie") select source.getType().getPackage(), source.getType().getName()
import go from StructLit source where source.getType().hasQualifiedName("net/http", "Cookie") select source
DataFlow::Node のサブクラスにも変換されます。
private class Source extends DataFlow::Node { Source() { exists(StructLit s | s.getType().hasQualifiedName("net/http", "Cookie") and this.asExpr() = s) } }

単純なデータ フロー
Source と Sink では、TaintConfig を定義するだけで、Source から Sink へのすべてのデータ フローを取得できます。
import go private class Source extends DataFlow::Node { Source() { exists(StructLit s | s.getType().hasQualifiedName("net/http", "Cookie") and this.asExpr() = s) } } private class Sink extends DataFlow::Node { Sink() { exists(DataFlow::CallNode c | c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = this ) } } class Configuration extends TaintTracking::Configuration { Configuration() { this = "HttpOnly" } override predicate isSource(DataFlow::Node source) { source instanceof Source } override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } } from Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink where cfg.hasFlowPath(source, sink) select source, sink
CodeQL が提供する TaintTracking::isSanitizer を使用して、無害なノードをフィルタリングできます:
override predicate isSanitizer(DataFlow::Node node) { exists(Write w, Field f, DataFlow::Node rhs | f.hasQualifiedName("net/http", "Cookie", "HttpOnly") and w.writesField(node, f, rhs) and rhs.getBoolValue() = true ) }
运行结果如下,但有一处地方需要注意。红框中实际有对HttpOnly进行设置,但我们的脚本并不能识别这样的一个数据流。后面试了各种方法,最终找到一种解决方式,将isSanitizer修改成以下内容。
override predicate isSanitizer(DataFlow::Node node) { exists(Write w, Field f, DataFlow::Node n, DataFlow::Node rhs | f.hasQualifiedName("net/http", "Cookie", "HttpOnly") and w.writesField(n, f, rhs) and rhs.getBoolValue() = true and node = n.getAPredecessor*()n ) }
其中node=n.getAPredecessor*()
是说node是n的前置数据流节点,数据可以在0个或多个步骤中从node流到n。
最终脚本
加上一些信息,模仿官方的示例,最终脚本如下。
/** * @name Cookie未设置httponly * @description Cookies包含一个HTTPOnly的设置选项,可以使此cookie不能被js读取,而只能用于HTTP请求。 * @kind path-problem * @problem.severity error * @precision low * @id go/Cookie-not-set-httponly * @tags security */ import go import DataFlow::PathGraph private class Source extends DataFlow::Node { Source() { exists(StructLit s | s.getType().hasQualifiedName("net/http", "Cookie") and this.asExpr() = s) } } private class Sink extends DataFlow::Node { Sink() { exists(DataFlow::CallNode c | c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = this ) } } class Configuration extends TaintTracking::Configuration { Configuration() { this = "HttpOnly" } override predicate isSource(DataFlow::Node source) { source instanceof Source } override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } override predicate isSanitizer(DataFlow::Node node) { exists(Write w, Field f, DataFlow::Node n, DataFlow::Node rhs | f.hasQualifiedName("net/http", "Cookie", "HttpOnly") and w.writesField(n, f, rhs) and rhs.getBoolValue() = true and node = n.getAPredecessor*() ) } } from Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink where cfg.hasFlowPath(source, sink) select sink.getNode(), source, sink, "Cookie-not-set-httponly in $@.", source.getNode(), "here"
最终筛选出存在问题的内容。
以上がCodeql が Cookie が httponly を有効にしない問題を分析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホット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)

ホットトピック









最近、多くの Windows ユーザーが、Google Chrome ブラウザで Web サイトの URL にアクセスしようとしているときに、Roblox403 Forbidden Error と呼ばれる異常なエラーに遭遇しました。 Chrome アプリを何度再起動しても、何もできませんでした。このエラーにはいくつかの潜在的な原因が考えられますが、そのうちのいくつかを以下に概説し、リストします。 Chrome の閲覧履歴やその他のキャッシュ、および破損したデータ 不安定なインターネット接続 間違った Web サイトの URL サードパーティのソースからインストールされた拡張機能 上記のすべての側面を考慮した結果、ユーザーがこの問題を解決できるようにいくつかの修正を考え出しました。同じ問題が発生した場合は、この記事の解決策を確認してください。修正1

コンピュータ上の Cookie は、使用するブラウザとオペレーティング システムに応じて、ブラウザ上の特定の場所に保存されます。 1. Google Chrome、C:\Users\YourUsername\AppData\Local\Google\Chrome\User Data\Default \Cookies に保存されます。等

Cookie は通常、ブラウザの Cookie フォルダに保存されます。ブラウザの Cookie ファイルは通常、バイナリ形式または SQLite 形式で保存されます。Cookie ファイルを直接開くと、文字化けしたり判読できないコンテンツが表示される可能性があるため、使用することをお勧めします。 Cookie を表示および管理するためにブラウザによって提供される Cookie 管理インターフェイス。

携帯電話上の Cookie は、モバイル デバイスのブラウザ アプリケーションに保存されます: 1. iOS デバイスでは、Cookie は Safari ブラウザの [設定] -> Safari -> [詳細] -> [Web サイト データ] に保存されます; 2. Android デバイスでは、Cookie は保存されますChromeブラウザの設定→サイト設定→Cookieなど

Cookie の動作原理には、サーバーが Cookie を送信し、ブラウザが Cookie を保存し、ブラウザが Cookie を処理して保存することが含まれます。詳細な紹介: 1. サーバーは Cookie を送信し、サーバーは Cookie を含む HTTP 応答ヘッダーをブラウザーに送信します。この Cookie には、ユーザーの本人認証、設定、ショッピング カートの内容などの情報が含まれており、ブラウザがこの Cookie を受信すると、ユーザーのコンピュータに保存されます。2. ブラウザは Cookie などを保存します。

インターネットの普及により、ブラウザを使用してインターネットを閲覧することが生活様式になりました。ブラウザを日常的に使用する中で、オンラインショッピング、ソーシャルネットワーキング、電子メールなど、アカウントのパスワードを入力する必要がある場面に遭遇することがよくあります。この情報は、次回アクセスするときに再度入力する必要がないようにブラウザによって記録される必要がありますが、このような場合に Cookie が役に立ちます。クッキーとは何ですか? Cookie とは、サーバーからユーザーのブラウザに送信され、ローカルに保存される小さなデータ ファイルを指し、一部の Web サイトでのユーザーの行動が含まれています。

Cookie 漏洩の危険には、個人識別情報の盗難、個人のオンライン行動の追跡、アカウントの盗難などが含まれます。詳細な導入: 1. 名前、電子メール アドレス、電話番号などの個人識別情報が盗まれます。この情報は、犯罪者によって個人情報の盗難、詐欺、その他の違法行為を実行するために使用される可能性があります。2. 個人のオンライン行動が追跡され、 Cookie を介して分析される アカウント内のデータを使用して、犯罪者はユーザーの閲覧履歴、ショッピングの好み、趣味などを知ることができます; 3. ログイン認証をバイパスし、ユーザーのアカウントに直接アクセスするなどして、アカウントが盗まれます。

Cookie をクリアすると、パーソナライズ設定と環境設定のリセット、広告エクスペリエンスへの影響、ログイン ステータスとパスワードの記憶機能の破壊などの影響が生じます。詳細な紹介: 1. 個人設定と環境設定をリセットします。Cookie をクリアすると、ショッピング カートが空にリセットされ、商品を再度追加する必要があります。Cookie をクリアすると、ソーシャル メディア プラットフォームでのログイン ステータスも失われるため、再追加. ユーザー名とパスワードを入力してください; 2. 広告エクスペリエンスに影響します. Cookie をクリアすると、Web サイトは私たちの興味や好みを理解できなくなり、無関係な広告などが表示されます。
