taibeihacker
Moderator
(1)注入的分类
基于从服务器接收到的响应 ▲基於錯誤的SQL注入▲聯合查詢的類型
▲堆查詢注射
▲SQL盲注
•基於布爾SQL盲注
•基於時間的SQL盲注
•基於報錯的SQL盲注
基于如何处理输入的SQL查询(数据类型)
•基於字符串
•數字或整數為基礎的
基于程度和顺序的注入(哪里发生了影响)一階注射
二階注射
一階注射是指輸入的注射語句對WEB直接產生了影響,出現了結果;二階注入類似存儲型XSS,是指輸入提交的語句,無法直接對WEB應用程序產生影響,通過其它的輔助間接的對WEB產生危害,這樣的就被稱為是二階注入.基于注入点的位置上的 ▲通過用戶輸入的表單域的注射。
▲通過cookie注射。
▲通過服務器變量注射。 (基於頭部信息的注射)
url编码:一般的url編碼其實就是那個字符的ASCII值得十六進制,再在前面加個%
具體可以看http://www.w3school.com.cn/tags/htm...可以查到每個字符的url編碼,當然自己編程或者用該語言應該也有自帶的函數,去實現url編碼
常用的寫出來吧: 空格是%20,單引號是%27, 井號是%23,雙引號是%22
判断sql注入(显错和基于错误的盲注):單引號,and 1=1 和and 1=2,雙引號,反斜杠,註釋等
判断基于时间的盲注:在上面的基礎上,加個sleep函數,如sleep(5) (函數不同數據庫有所不同)例子: ' and sleep(5) ' and sleep(5)
(2)系统函数
常用函数:1. version()——MySQL版本2. user()——數據庫用戶名
3. database()——數據庫名
4. @@datadir——數據庫路徑
5. @@version_compile_os——操作系統版本
(3)
字符串連接函數函數具體介紹:http://www.cnblogs.com/lcamry/p/5715634.html
concat(str1,str2,)——沒有分隔符地連接字符串
concat_ws(separator,str1,str2,)——含有分隔符地連接字符串
group_concat(str1,str2,)——連接一個組的所有字符串,並以逗號分隔每一條數據
(4)
一般用於嘗試的語句Ps:--+可以用#替換,url提交過程中Url編碼後的#為%23
or 1=1--+
'or 1=1--+
'or 1=1--+
)or 1=1--+
')or 1=1--+
') or 1=1--+
'))or 1=1--+
一般的代碼為:
id=_GET['id'];
$sql='SELECT *
FROM users WHERE id='$id'LIMIT 0,1';
此處考慮兩個點,一個是閉合前面你的' 另一個是處理後面的' ,一般採用兩種思路,閉合後面的引號或者註釋掉,註釋掉採用--+ 或者#(%23)
(5)
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_name1UNION 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' andpassword=''or1=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,然後通過查詢檢查下數據庫:
showdatabases;

這個實驗用到的數據庫名為security,所以我們選擇security來執行命令。
usesecurity;

我們可以查看下這個數據庫中有哪些表
showtables;

現在我們可以看到這裡有四張表,然後我們來看下這張表的結構。
descemails;

在繼續進行前台攻擊時,我們想討論下系統數據庫,即information_schema。所以我們使用它
useinformation_schema;

讓我們來看下表格。
showtables;

現在我們先來查看表的結構:
desctables;

現在我們來使用這個查詢:
selecttable_namefrominformation_schema.tableswheretable_schema='security';

使用這個查詢,我們可以下載到表名。
Mysql有一個系統數據庫information_schema,存儲著所有的數據庫的相關信息,一般的,我們利用該表可以進行一次完整的注入。以下為一般的流程。
猜數據庫
select schema_name
from information_schema.schemata

猜某庫的數據表
select table_name
from information_schema.tables where table_schema='