之前已經簡單介紹了sql注入的基本原理,接下來會按照sql注入的各種型別一一進行梳理,sql注入的常見主要分為回顯注入、報錯注入、bool盲注、延時注入、堆疊注入、二次注入、寬位元組注入、http頭注入、dns load注入。
sql注入的報錯注入利用的是頁面返回了資料庫報錯的內容,當回顯注入無法使用時使用報錯注入,可用的報錯函式有很多,我會介紹常用的三種報錯注入以及原理。floor報錯,updatexml以及extarctvalue
輸入單引號發現有sql報錯,可以使用報錯注入
floor報錯注入
**括號有些多,我們逐一來理解,首先我們將最外層的括號去掉,不管第二層括號的內容,那麼payload就變成 select 1 from ()a ,這句查詢語句的意思是在a中查詢1,a就是將括號中的內容變為乙個整體,這就是乙個普通的簡單查詢語句,然而是什麼導致了他報錯呢?
我們在來看內層括號的內容
select count(*
),concat((
database()
),floor
(rand(0
)*2)
)x from information_schema.tables group by x
我們再將**簡化,不看concat括號內的內容
select count(*
),concat
()x from information_schema.tables group by x
這樣就明了很多了,就是在information_schema.tables表中查詢乙個內容,並group by, group by 就是按照某種排序來建立乙個虛擬表。查詢到的內容逐個插入到這個虛擬表中並將這個內容設定為主鍵,如果出現內容重複,那麼前面的count(*)計數器就會+1。
比如乙個簡單的表圖左進行了select name group by name的操作,那麼虛擬表就會如右圖所示
如果說,右表**現了兩個相同的主鍵,那麼資料庫就會進行主鍵衝突的報錯,再看我們之前省略掉的concat括號中的內容
concat((
database()
),floor
(rand(0
)*2)
)
其中floor為向下取整,rand()為隨機數在0到1之間,而乘以2後就在0-1或者1-2之前,floor向下取整後這個數就是0或者1,比如database()為security那麼括號中的內容就為security0或者security1。然後就按照內容不斷插入到gourp by的虛擬表中。
然而當這個操作在進行的過程中,假如第一次隨機並插入了security1並設定主鍵,
floor函式有乙個特性
第二次隨機出的為security0,那麼floor發現這個數之前沒有出現過,就會在插入表之前迅速地再次隨機出乙個數,如果說隨機出了security1,gourp by不會認為他是security1直接計數器加一,而是以為他還是security0,插入到表並設定主鍵,然而表中已經有乙個security1了,在資料庫表中主鍵是不能重複的,所以就會爆出主鍵衝突的錯誤。
但是我們不能保證第二次隨機出的一定是0,所以就不會絕對出現報錯,這也是floor又叫薛丁格報錯的原因。但是我們在rand()中加入基數0變成rand(0),那麼隨機出的數就會有規律,就會絕對報錯。
所以說在這個sql語句中主要是rand、floor、group by、concat這幾個函式共同起作用導致的主鍵衝突報錯
SQL注入 floor 報錯注入
基礎知識 floor 去除小數部分 rand 產生隨機數 rand x 每個x對應乙個固定的值,但是如果連續執行多次值會變化,不過也是可 的 floor報錯payload and select 1 from select count concat database floor rand 0 2 x ...
注入攻擊之sql注入
在1998年,一位名為rfp的黑客發表了一篇題為 nt web technology vulnerabilities 的文章 注入攻擊的兩個條件 1 使用者能夠克制資料的輸入 在這裡,使用者能夠控制變數 2 原本要執行的 憑藉了使用者的輸入 一般輸入乙個 單引號就能引起執行查詢語句的語法錯誤,有些伺...
SQL注入之報錯注入
固定語句公式 union select 1 from select count concat floor rand 0 2 注入爆資料語句 a from information schema.tables group by a b 假如id輸入存在注入的話,可以通過如下語句進行報錯。mysql se...