union操作符的介紹UNION 操作符用於合并兩個或多個 SELECT 語句的結果集。請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料類型。同時,每條 SELECT 語句中的列的順序必須相同。
SQL UNION 文法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注釋:預設地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。
SQL UNION ALL 文法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。
(6)sql中的邏輯運算
這裡我想說下邏輯運算的問題。
提出一個問題Select * from users where id=1 and 1=1; 這條語句為什麼能夠選擇出id=1的內容,and 1=1到底起作用了沒有?這裡就要清楚sql語句執行順序了。
同時這個問題我們在使用萬能密碼的時候會用到。
Select * from admin where username=‘admin‘ and password=‘admin‘
我們可以用 ‘or 1=1# 作為密碼輸入。原因是為什嗎?
這裡涉及到一個邏輯運算,當使用上述所謂的萬能密碼後,構成的sql語句為:
Select * from admin where username=‘admin‘ and password=‘‘or 1=1#‘
Explain:上面的這個語句執行後,我們在不知道密碼的情況下就登入到了admin使用者了。
原因是在where子句後,我們可以看到三個條件陳述式 username=‘admin‘ and password=‘‘or 1=1。三個條件用and和or進行串連。在sql中,我們and的運算優先順序大於or的元算優先順序。因此可以看到 第一個條件(用a表示)是真的,第二個條件(用b表示)是假的,a and b = false,第一個條件和第二個條件執行and後是假,再與第三個條件or運算,因為第三個條件1=1是恒成立的,所以結果自然就為真了。因此上述的語句就是恒真了。
?
?
?
?
?
①Select * from users where id=1 and 1=1;
②Select * from users where id=1 && 1=1;
③Select * from users where id=1 & 1=1;
上述三者有什麼區別?①和②是一樣的,表達的意思是 id=1條件和1=1條件進行與運算。
③的意思是id=1條件與1進行&位操作,id=1被當作true,與1進行 & 運算 結果還是1,再進行=操作,1=1,還是1(ps:&的優先順序大於=)
Ps:此處進行的位元運算。我們可以將數轉換為二進位再進行與、或、非、異或等運算。必要的時候可以利用該方法進行注入結果。例如將某一字元轉換為ascii碼後,可以分別與1,2,4,8,16,32.。。。進行與運算,可以得到每一位的值,拼接起來就是ascii碼值。再從ascii值反推回字元。(運用較少)
(7)注入流程
我們的資料庫儲存的資料按照的形式,一個資料庫當中有很多的資料表,資料表當中有很多的列,每一列當中儲存著資料。我們注入的過程就是先拿到資料庫名,在擷取到當前資料庫名下的資料表,再擷取當前資料表下的列,最後擷取資料。
現在做一些mysql的基本操作。啟動mysql,然後通過查詢檢查下資料庫:
show?databases;
這個實驗用到的資料庫名為security,所以我們選擇security來執行命令。
use?security;
我們可以查看下這個資料庫中有哪些表
show?tables;
現在我們可以看到這裡有四張表,然後我們來看下這張表的結構。
desc?emails;
在繼續進行前台攻擊時,我們想討論下系統資料庫,即information_schema。所以我們使用它
use?information_schema
讓我們來看下錶格。
show?tables;
現在我們先來枚舉這張表
desc?tables;
現在我們來使用這個查詢:
select?table_name?from?information_schema.tables?where?table_schema?=?"security";
使用這個查詢,我們可以下載到表名。
Mysql有一個系統資料庫information_schema,儲存著所有的資料庫的相關資訊,一般的,我們利用該表可以進行一次完整的注入。以下為一般的流程。
猜資料庫
select schema_name from information_schema.schemata
猜某庫的資料表
select table_name from information_schema.tables where table_schema=‘xxxxx‘
猜某表的所有列
Select column_name from information_schema.columns where table_name=‘xxxxx‘
擷取某列的內容
Select *** from ****
上述知識參考用例:less1-less4