目錄
說明
稽核物件
修改
#目的
#確定Source和Sink
Sink定義
最终脚本
首頁 運維 安全 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:Vulnerable golang Web application for education。

修改

由於在該專案中所有的 Cookie 都沒有設定 http-only 屬性,因此我們需要先修改才能進行比較。以下是對原句的重寫: 記錄修改:在某些cookie設定中增加http-only選項。

pkg\admin\admin.go修正如下。
Codeql如何分析cookie未啟用httponly的問題

pkg\login\login.go修正如下。
Codeql如何分析cookie未啟用httponly的問題

pkg\register\register.go修改如下。
Codeql如何分析cookie未啟用httponly的問題

修改後記得重新產生一次database(如果需要覆蓋舊的DATabase的話,則需要先刪除舊的再產生新的。

#目的

就是透過codeql腳本來發現其中未設定httponly和設定了httponly的但httponly的值為false(一般不會這樣,但保不齊有)的這樣存在漏洞的點。

#確定Source和Sink

Sink定義

Sink很簡單,設定Cookie時,需要用到http.SetCookie方法,而需要設定的Cookie值是這個函數的第二個參數,然後我們可以寫出找到類似這樣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
登入後複製
運行後會獲得同樣的結果。

Source定義

然後我們再來確定Source,從http.SetCookie方法接收的參數來看,實際第二個參數是接收一個Cookie的結構體的指標。


Codeql如何分析cookie未啟用httponly的問題Codeql如何分析cookie未啟用httponly的問題

所以我們先要找出這樣一個結構體,我們可以先把專案中所有的結構體列出來。

codeql-go中關於結構體的定義如下。


Codeql如何分析cookie未啟用httponly的問題

所以我們的查詢腳本例如。

import go

from StructLit source
select source
登入後複製
也如我們預期的一樣列出了所有的結構體。


Codeql如何分析cookie未啟用httponly的問題

然後接下來就是剔除其他不相干的內容,對型別做限制。

關於hasQualifiedName方法,在各種Codeql-go中的各種型別都有相同的方法,定義如下,標記物件的是在屬於哪個包,叫什麼名。


Codeql如何分析cookie未啟用httponly的問題

如果不確定的話,可以通過,getPackage和getName列印相關字段,例如。

import go

from StructLit source
// where source.getType().hasQualifiedName("net/http", "Cookie")
select source.getType().getPackage(), source.getType().getName()
登入後複製
結果如下。


Codeql如何分析cookie未啟用httponly的問題

我們可以找到source定義,例如。

import go

from StructLit source
where source.getType().hasQualifiedName("net/http", "Cookie")
select source
登入後複製

同樣轉換成DataFlow::Node的子類別。Codeql如何分析cookie未啟用httponly的問題

private class Source extends DataFlow::Node {
  Source() {
    exists(StructLit s | s.getType().hasQualifiedName("net/http", "Cookie") and this.asExpr() = s)
  }
}
登入後複製
TaintConfig定義

簡單的資料流

有了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如何分析cookie未啟用httponly的問題

剔除

#然而,我們仍未移除設定了httponly=true的部分。因此需要加入限定條件,即將設有HttpOnly屬性為true的資料流從結果中排除。

我們可以 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
    )
  }
登入後複製

运行结果如下,但有一处地方需要注意。
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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何修復 Google Chrome 上的 Roblox 403 禁止錯誤 如何修復 Google Chrome 上的 Roblox 403 禁止錯誤 May 19, 2023 pm 01:49 PM

許多Windows用戶最近在嘗試存取GoogleChrome瀏覽器中的網站URL時遇到了一個不尋常的錯誤,稱為Roblox403禁止錯誤。即使在多次重新啟動Chrome應用程式後,他們也無能為力。此錯誤可能有幾個潛在原因,我們在下面概述並列出了其中一些。 Chrome的瀏覽歷史記錄和其他快取以及損壞的資料不穩定的互聯網連接網站網址不正確從第三方來源安裝的擴展在考慮了上述所有方面之後,我們提出了一些修復程序,可以幫助用戶解決此問題。如果您遇到相同的問題,請查看本文中的解決方案。修復1

cookie存在哪裡 cookie存在哪裡 Dec 20, 2023 pm 03:07 PM

Cookie通常儲存在瀏覽器的Cookie資料夾中的,瀏覽器中的Cookie檔案通常以二進位或SQLite格式存儲,如果直接開啟Cookie文件,可能會看到一些亂碼或無法讀取的內容,因此最好使用瀏覽器提供的Cookie管理介面來檢視和管理Cookie。

電腦上的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 22, 2023 pm 03:40 PM

手機上的Cookie儲存在行動裝置的瀏覽器應用程式中:1、在iOS裝置上,Cookie儲存在Safari瀏覽器的Settings -> Safari -> Advanced -> Website Data中;2、在Android裝置上,Cookie儲存在Chrome瀏覽器的Settings -> Site settings -> Cookies中等等。

Cookie工作原理是什麼 Cookie工作原理是什麼 Sep 20, 2023 pm 05:57 PM

Cookie運作方式涉及到伺服器發送Cookie、瀏覽器儲存Cookie以及瀏覽器對Cookie的處理和儲存。詳細介紹:1、伺服器發送Cookie,伺服器會傳送一個包含Cookie的HTTP回應標頭給瀏覽器。這個Cookie包含了一些訊息,例如使用者的身份認證、偏好設定或購物車內容等,瀏覽器接收到這個Cookie後,會將它儲存在使用者的電腦上;2、瀏覽器儲存Cookie等等。

清除cookie有什麼影響嗎 清除cookie有什麼影響嗎 Sep 20, 2023 pm 06:01 PM

清除cookie產生的影響有重置個人化設定和偏好、影響廣告體驗、破壞登入狀態和記住密碼功能。詳細介紹:1、重置個人化設定和偏好,如果清除了cookie,購物車將被重置為空,需要重新添加商品,同樣清除cookie還會導致在社群媒體平台上的登入狀態遺失,需要重新輸入使用者名稱和密碼;2、影響廣告體驗,如果清除了cookie,網站將無法了解我們的興趣和偏好,會顯示無關的廣告等等。

瀏覽器cookie的儲存位置詳解 瀏覽器cookie的儲存位置詳解 Jan 19, 2024 am 09:15 AM

隨著網路的普及,我們使用瀏覽器進行上網已經成為一種生活方式。在日常使用瀏覽器過程中,我們常會遇到需要輸入帳號密碼的情況,如網購、社交、郵件等。這些資訊需要瀏覽器記錄下來,以便下次造訪時不需要再次輸入,這時候Cookie就派上了用場。什麼是Cookie? Cookie是指由伺服器端發送到使用者瀏覽器上並儲存在本地的一種小型資料文件,它包含了一些網站的使用者行為

cookie洩漏有什麼危害 cookie洩漏有什麼危害 Sep 20, 2023 pm 05:53 PM

Cookie洩漏的危害有導致個人識別資訊被竊、個人線上行為被追蹤、帳戶被竊等。詳細介紹:1、個人識別資訊被盜竊,例如姓名、電子郵件地址、電話號碼等,這些資訊可能被不法分子用於進行身份盜竊、欺詐等違法行為;2、個人在線行為被追踪,通過分析cookie中的數據,不法分子可以了解用戶的瀏覽歷史、購物偏好、興趣愛好等;3、帳戶被盜,繞過登入驗證,直接存取用戶的帳號等等。

See all articles