一、Web 工作機(jī)制
為什么學(xué)習(xí)這節(jié)課 我們學(xué)習(xí)滲透測試這門課程习劫,主要針對的 Web 應(yīng)用猴仑,所以對 Web 架構(gòu)需要一定的了解
1.1 網(wǎng)頁、網(wǎng)站
我么可通過瀏覽器上網(wǎng)看到精美的頁面损敷,一般都是經(jīng)過瀏覽器渲染的.html 頁面,其中包含 css 等前端技術(shù)深啤。多個(gè)網(wǎng)頁的集合就是網(wǎng)站拗馒。
1.2Web 容器
Web 容器,也叫 Web 服務(wù)器溯街,主要提供 Web 服務(wù)诱桂,也就是常說的 HTTP 服務(wù)。 常見的 Web 容器有:Apache/IIS/Nginx 等苫幢。?
1.3 靜態(tài)頁面
靜態(tài)頁面访诱,都是些.html 文件,是純文本文件韩肝。這些文件中包含 html 代碼触菜。 HTML(HyperText Markup Language,超文本標(biāo)記語言),在瀏覽器中解釋運(yùn)行哀峻。
1.4 中間件服務(wù)器
以上這種涡相,只能單向給用戶戰(zhàn)術(shù)信息。隨著 Web 的發(fā)展剩蟀,信息要雙向流動(dòng)催蝗,產(chǎn)生了交互的 需求,也就是動(dòng)態(tài)網(wǎng)頁的概念育特;所謂動(dòng)態(tài)就是利用 flash丙号、Php先朦、asp、Java 等技術(shù)在網(wǎng)頁中 嵌入一些可以運(yùn)行的腳本犬缨,用戶瀏覽器在解釋頁面時(shí)喳魏,遇到腳本就啟動(dòng)運(yùn)行它。 腳本的使用讓 Web 服務(wù)模式有了雙向交流的能力怀薛,Web 服務(wù)器模式也可以像傳統(tǒng)的軟件 一樣進(jìn)行各種事務(wù)的處理刺彩,如編輯文件、利息計(jì)算枝恋、提交表單等创倔,Web 架構(gòu)的適用面大大 擴(kuò)展。 這些腳本可以嵌入到頁面中焚碌,如 JS 等畦攘。也可以以文件的形式單獨(dú)存放在 Web 服務(wù)器的目 錄里,如.asp呐能、.php念搬、jsp 文件等。這樣功能性的腳本越來越多摆出,形成常用的工具包,單獨(dú)管 理首妖,Web 業(yè)務(wù)開發(fā)時(shí)偎漫,直接使用就可以了,這就是中間件服務(wù)器有缆,它實(shí)際上時(shí) Web 服務(wù)器 處理能力的擴(kuò)展象踊。 weblogic、jboss
1.5 數(shù)據(jù)庫的出現(xiàn)
靜態(tài)網(wǎng)頁與腳本都是事先設(shè)計(jì)好的棚壁,一般不經(jīng)常改動(dòng)杯矩,但網(wǎng)站上的很多內(nèi)容需要經(jīng)常更新, 將這些變動(dòng)的數(shù)據(jù)放在靜態(tài)網(wǎng)頁的程序中顯然不合適袖外,傳統(tǒng)的辦法是數(shù)據(jù)與程序分離史隆,采用 的專業(yè)的數(shù)據(jù)庫。
Web 開發(fā)者在 Web 服務(wù)器后邊增加了一個(gè)數(shù)據(jù)庫服務(wù)器曼验,這些經(jīng)常變動(dòng)的數(shù)據(jù)被存進(jìn)數(shù) 據(jù)庫泌射,可以隨時(shí)更新。當(dāng)用戶請求頁面時(shí)鬓照,腳本根據(jù)用戶請求的頁面熔酷,涉及到動(dòng)態(tài)數(shù)據(jù)的地 方,利用 SQL 數(shù)據(jù)庫語言豺裆,從數(shù)據(jù)中讀取最新的數(shù)據(jù)拒秘,生產(chǎn)“完整”頁面,最后送給用戶。?
二躺酒、HTTP 協(xié)議概述
HTTP(HyperText Transfer Protocol),超文本傳輸協(xié)議咙轩,是傳遞消息的規(guī)范和要求。
2.1 概述
1990 年提出的阴颖,當(dāng)前版本 1.1活喊。
HTTP 是用來將 html 文檔從 Web 服務(wù)器傳輸?shù)?Web 瀏覽器。
是一個(gè)請求和響應(yīng)的協(xié)議量愧〖鼐眨客戶端發(fā)出請求,服務(wù)器端對請求給出回應(yīng)偎肃。 HTTP 使用可靠的 TCP 連接煞烫,默認(rèn)端口 80?
2.2 特點(diǎn)
支持瀏覽器/服務(wù)器模式
簡單快速:瀏覽器向服務(wù)器提出請求時(shí),只需要傳送請求方法和請求路徑
靈活:HTTP 運(yùn)行傳輸任意類型的數(shù)據(jù)對象
.html 純文本
.jpg 圖片
.mp3 音頻
HTTP 協(xié)議是無狀態(tài)的協(xié)議
2.3URL
統(tǒng)一資源定位符(網(wǎng)址)累颂,用來告訴 Web 容器滞详,瀏覽器所請求的資源(文件)的路徑。
例如:http://localhost/test/requests.php?id=32 Schema://login:password@adress:port/path/to/resource/?query_string#fragment
Port 80
Login 用戶名
Password 密碼 匿名訪問時(shí)紊馏,默認(rèn)沒有用戶名和密碼
Fragment 錨點(diǎn) 實(shí)現(xiàn)頁面內(nèi)定位
url 編碼 URL 只允許出現(xiàn)的字符是有限制的料饥,URL 中 path 開始允許直接出現(xiàn)[A-Z][a-z][0-9],半角
減號(-)朱监、下劃線句點(diǎn)(.)岸啡、波浪號(~)。
其他字符均會被百分號編碼(包括空格)
例如:
# %23
空格 %20
原理:%+ASCII 碼十六進(jìn)制形式
在進(jìn)行編程的時(shí)候赫编,會[+] 代替空格巡蘸。
注意:不要對中文進(jìn)行 url 編碼
報(bào)文分析工具
1、F12
2擂送、wireshark
3悦荒、fiddler
4、Burp suite
三嘹吨、HTTP 報(bào)文分析
Web 應(yīng)用的所有通信的消息都要遵守 HTTP 協(xié)議的規(guī)范和要求搬味。
3.1REQUEST
請求報(bào)文,如下
GET /php/test/get.php HTTP/1.1
Host: 192.168.1.136
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:75.0) Gecko/20100101
Firefox/75.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.136/php/test/
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
HTTP 請求由請求行躺苦、請求頭身腻、請求正文三部分組成
1、請求行:方法匹厘,資源路徑嘀趟,協(xié)議/版本
方法:GET
資源路徑:/php/test/get.php
協(xié)議/版本:HTTP/1.1
2、請求頭
從請求報(bào)文第二行開始到第一個(gè)空行為止的內(nèi)容愈诚。其中包含很多字段
3她按、請求正文
以上方法沒有請求正文牛隅,后面會看到
3.2 請求方法
GET
最常用的方法,通常用戶請求服務(wù)器發(fā)送的某個(gè)資源酌泰。
POST
可以向服務(wù)器提交參數(shù)以及表單媒佣,包括文件流等
HEAD
與 GET 方法類似,但在服務(wù)器響應(yīng)中只返回首部
PUT
與 GET 從服務(wù)器讀取文檔相反陵刹,PUT 方法會向服務(wù)器寫入文檔
TRACE
回顯瀏覽器的請求
OPTIONS
請求 Web 服務(wù)器告知其支持的各種功能
DELETE
請求服務(wù)器刪除請求 URL 所指定的資源
3.3 實(shí)驗(yàn)
1默伍、使用 telnet 模式瀏覽器發(fā)送 HTTP 請求
Telnet 192.168.1.136 80
GET /php/test/get.php HTTP/1.1
Host: 192.168.1.136
注意:進(jìn)入 telnet 后,按 ctrl+]鍵衰琐,開啟 telnet 的回顯也糊,然后按回車鍵
Telnet www.baidu.com 80
GET / HTTP/1.1
Host: www.baidu.com
2、利用 telnet 傳送 GET 參數(shù)
GET /php/test/get.php?name=AJEST&pwd=123456 HTTP/1.1
Host:192.168.1.136
3羡宙、利用 telnet 模擬 POST,請求傳遞參數(shù)
POST /php/test/post.php?http://192.168.1.136/php/test/post.php HTTP/1.1
Host: 192.168.1.136
Content-Type: application/x-www-form-urlencoded
Content-Length: 19
name=GGG&pwd=123456
4狸剃、利用 OPTIONS 方法測試 Web 服務(wù)器允許的 HTTP 請求
OPTIONS / HTTP/1.1
Host: 192.168.1.136
get.php
<?php
str=$_GET;
var_dump($str);
$
?>
post.php
<?php
str=$_POST;
var_dump($str);
?>
3.4 主要字段
Host
主要用于指定被請求資源的 Internet 主機(jī)和端口號
User-Agent
瀏覽器指紋
Referer
包含一個(gè) URL,代表當(dāng)前的 URL 的上一個(gè) URL
Cookie
記錄請求者的身份認(rèn)證信息
Accept-Charset
用戶指定客戶端接受的字符集
Content-Type
用于向接收方指示實(shí)體的介質(zhì)類型(數(shù)據(jù)類型)
Content-Length
用于指明實(shí)體正文的長度狗热,以字節(jié)的方式存儲的十進(jìn)制數(shù)字來表示
Last-Modified
用于指示資源的最后修改時(shí)間和日期
3.5RESPONSE
響應(yīng)報(bào)文如下:
HTTP/1.1 200 OK
Date: Sat, 25 Apr 2020 09:50:59 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 13
Connection: close
Content-Type: text/html
array(0) {
}
響應(yīng)報(bào)文由狀態(tài)行(響應(yīng)行)钞馁、響應(yīng)頭、響應(yīng)正文三部分組成匿刮。
1僧凰、狀態(tài)行:協(xié)議/版本,狀態(tài)代碼僻焚,描述短語
協(xié)議/版本:HTTP/1.1
狀態(tài)代碼:200
描述短語:OK
2允悦、響應(yīng)報(bào)頭
第二行開始到第一個(gè)空行為止的所有內(nèi)容,其中包含了關(guān)于 HTTP 響應(yīng)的重要字段虑啤。
3、響應(yīng)正文
服務(wù)器返回資源的內(nèi)容架馋,即瀏覽器接收到的 HTML 代碼狞山。
狀態(tài)碼
100~199
信息性狀態(tài)碼
200~299
成功狀態(tài)碼
300~399
重定向狀態(tài)碼
400~499
客戶端錯(cuò)誤狀態(tài)碼
500~599
服務(wù)器錯(cuò)誤狀態(tài)碼
主要字段
Server
服務(wù)器指紋
Set-Cookie
向?yàn)g覽器端設(shè)置 Cookie
Last-Modified
服務(wù)器通過這個(gè)頭信息告訴瀏覽器叉寂,資源的最后修改時(shí)間
Content-Length
請求正文長度
Location
重定向目標(biāo)頁面
Refresh
服務(wù)器通過 Refresh 頭告訴瀏覽器定時(shí)刷新瀏覽器
四、同源策略
同源策略是禁止 javascript 進(jìn)行跨域訪問的安全策略勘纯。它也是瀏覽器沙盒環(huán)境所提供的一項(xiàng)
制約。瀏覽器可以同時(shí)處理多個(gè)網(wǎng)站的內(nèi)容钓瞭,其典型方法為使用標(biāo)簽或 iframe 等驳遵。
4.1 同源策略的條件
URL 的主機(jī)(FQDN:Fully Qualified Domain Name 全程域名)一致
Schema 一致
端口號一致
同源策略的保護(hù)對象不僅僅時(shí) iframe 內(nèi)文檔山涡。比如實(shí)現(xiàn) Ajax 時(shí)所使用的 XMLHttpRequest
對象能夠訪問的 URL 也受到了同源策略的限制唆迁。
4.2 同源策略探究
準(zhǔn)備兩個(gè)頁面
index.html
<html>
<head>
<title> 跨 frame 的讀取實(shí)驗(yàn)</title>
<meta charset="utf-8">
</head>
<body>
iframe name="iframe1" width="300"
height="80"src=http://192.168.1.136/sop/iframe.html>
</iframe>
<input type="button" οnclick="go()" value=" 密碼: ">
<script>
function go(){
try {
var x = iframe1.document.form1.passwd.value;
document.getElementById('out').innerHTML = x;
}
catch (e){
alert(e.message);
}
}
</script>
<span id="out"></span>
</body>
</html>
iframe.html
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<form name="form1"> iframe 的內(nèi)層
密碼 <input type="text" name="passwd" value="password1">
</form>
</body>
</html>
這里我們使用我們服務(wù)器的瀏覽器測試這個(gè)實(shí)驗(yàn)(因?yàn)槲覀円褂貌煌膬蓚€(gè) URL 來訪問
我們的網(wǎng)頁)
我們用指定的 IP 訪問,可以正常讀取
但是當(dāng)我們使用我們本機(jī)的回環(huán)地址去訪問時(shí)竞穷,打開頁面唐责,無法讀锐(這就是由同源策略限
制,無法訪問內(nèi)層 iframe)