目次
はじめに
手順
監査オブジェクト
変更
目的
ソースとシンクの決定
シンクの定義
ソース定義
最终脚本
ホームページ 運用・保守 安全性 Codeql が Cookie が httponly を有効にしない問題を分析する方法

Codeql が Cookie が httponly を有効にしない問題を分析する方法

May 17, 2023 pm 05:25 PM
cookie httponly codeql

はじめに

今日は、codeql を使用して「Cookie が httponly で有効になっていない」などのセキュリティ問題を分析し、codeql の使用法を深めます。うまく機能する場合は、Vulnerability-goapp の他の脆弱性を修正することを検討できます。

go プログラムを分析する場合は、codeql-go をさらにダウンロードする必要があります

手順

監査オブジェクト

Vulnerability-goapp: 教育用の脆弱な golang Web アプリケーション。

変更

このプロジェクトのすべての Cookie には http のみの属性が設定されていないため、比較する前にまずそれらを変更する必要があります。以下は元の文を書き直したものです。 レコードの変更: 一部の Cookie 設定に http のみのオプションを追加します。

pkg\admin\admin.go を次のように変更します。
Codeql が Cookie が httponly を有効にしない問題を分析する方法

pkg\login\login.go を次のように変更します。
Codeql が Cookie が httponly を有効にしない問題を分析する方法

pkg\register\register.go を次のように変更します。
Codeql が Cookie が httponly を有効にしない問題を分析する方法

変更後に必ずデータベースを再生成してください (古い 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
ログイン後にコピー

実行後、次の結果が得られます。任意の項目をクリックすると、その項目にジャンプします。
Codeql が Cookie が httponly を有効にしない問題を分析する方法

次のように 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 が Cookie が httponly を有効にしない問題を分析する方法Codeql が Cookie が httponly を有効にしない問題を分析する方法

したがって、最初に見つける必要があります。まずはプロジェクト内のすべての構造をリストします。

codeql-go の構造について本文の定義は次のとおりです。たとえば、クエリ スクリプトです。

import go

from StructLit source
select source
ログイン後にコピー
Codeql が Cookie が httponly を有効にしない問題を分析する方法 には、予想どおりすべての構造もリストされています。

次に、他の無関係なコンテンツを削除し、タイプを制限します。
Codeql が Cookie が httponly を有効にしない問題を分析する方法 hasQualifiedName メソッドについては、さまざまな Codeql-go のさまざまな型が同じメソッドを持っていますが、定義は次のようになります マークされたオブジェクトはどのパッケージに属し、その名前は何であるかということです。

よくわからない場合は、たとえば getPackage や getName を通じて関連するフィールドを出力できます。

import go

from StructLit source
// where source.getType().hasQualifiedName("net/http", "Cookie")
select source.getType().getPackage(), source.getType().getName()
ログイン後にコピー
結果は次のとおりです。


Codeql が Cookie が httponly を有効にしない問題を分析する方法

たとえば、ソース定義を見つけます。

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)
  }
}
ログイン後にコピー
Codeql が Cookie が httponly を有効にしない問題を分析する方法TaintConfig 定義

単純なデータ フロー

Source と Sink では、TaintConfig を定義するだけで、Source から Sink へのすべてのデータ フローを取得できます。 Codeql が Cookie が httponly を有効にしない問題を分析する方法

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
ログイン後にコピー
結果は次のとおりです。

削除

ただし、httponly=true が設定されている部分はまだ削除されていません。したがって、制限条件を追加する必要があります。つまり、HttpOnly 属性が true に設定されているデータ ストリームを結果から除外します。


CodeQL が提供する TaintTracking::isSanitizer を使用して、無害なノードをフィルタリングできます: Codeql が Cookie が httponly を有効にしない問題を分析する方法

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
    )
  }
ログイン後にコピー

运行结果如下,但有一处地方需要注意。
Codeql が Cookie が httponly を有効にしない問題を分析する方法红框中实际有对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 を有効にしない問題を分析する方法

以上がCodeql が Cookie が httponly を有効にしない問題を分析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Google ChromeでRoblox 403 Forbiddenエラーを修正する方法 Google ChromeでRoblox 403 Forbiddenエラーを修正する方法 May 19, 2023 pm 01:49 PM

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

コンピューター上の Cookie はどこにありますか? コンピューター上の Cookie はどこにありますか? Dec 22, 2023 pm 03:46 PM

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

Cookie はどこに保存されますか? Cookie はどこに保存されますか? Dec 20, 2023 pm 03:07 PM

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

モバイル Cookie はどこにありますか? モバイル Cookie はどこにありますか? Dec 22, 2023 pm 03:40 PM

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

クッキーの仕組み クッキーの仕組み Sep 20, 2023 pm 05:57 PM

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

ブラウザの Cookie が保存される場所の詳細な説明 ブラウザの Cookie が保存される場所の詳細な説明 Jan 19, 2024 am 09:15 AM

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

Cookie 漏洩の危険性は何ですか? Cookie 漏洩の危険性は何ですか? Sep 20, 2023 pm 05:53 PM

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

Cookie をクリアすると何か影響がありますか? Cookie をクリアすると何か影響がありますか? Sep 20, 2023 pm 06:01 PM

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

See all articles