一、前言
結(jié)合內(nèi)部資料,與安全滲透部門同事合力整理的安全測試相關(guān)資料教程,全方位涵蓋電商、支付、金融、網(wǎng)絡(luò)、數(shù)據(jù)庫等領(lǐng)域的安全測試,覆蓋Web、APP、中間件、內(nèi)外網(wǎng)、Linux、Windows多個平臺。學(xué)完后一定能成為安全大佬!
全部文章請訪問專欄:《全棧安全測試教程(0基礎(chǔ))》
通過本章節(jié)的學(xué)習(xí),我們會掌握如下知識,為掌握Web安全測試做基礎(chǔ)準備:
- HTTP1.0的請求方法
了解HTTP1.0三種請求方法,GET, POST 和 HEAD
掌握GET請求的標準格式
掌握POST請求提交表單,上傳文件的方法
了解HEAD請求與GET請求的區(qū)別 - HTTP1.1新增的請求方法
了解HTTP1.1新增的五種請求方法:OPTIONS,PUT,DELETE,TRACE,CONNECT方法的基本概念
掌握HTTP1.1新增的五種請求的基本方法和產(chǎn)生的請求結(jié)果 。
二、HTTP請求
http請求由三部分組成,分別是:請求行、消息報頭、請求正文。
請求行以一個方法符號開頭,以空格分開,后面跟著請求的URI和協(xié)議的版本,格式如下:
- Method Request-URI HTTP-Version (CR)(LF)
- 其中 Method表示請求方法(GET,POST,HEAD等)
- Request-URI是一個統(tǒng)一資源標識符
- HTTP-Version表示請求的HTTP協(xié)議版本
- (CR)(LF)表示回車和換行(除了作為結(jié)尾的(CR)(LF)外,不允許出現(xiàn)單獨的(CR)或(LF)字符)。
例:GET /get.php?arg1=value1 HTTP/1.1
HTTP消息請求報頭允許客戶端向服務(wù)器端傳遞請求的附加信息以及客戶端自身的信息。
- 常用的報頭:
- 常用的請求報頭Accept,Accept-Charset,Accept-Encoding,Accept-Language,Authorization,Host(發(fā)送請求時,該報頭域是必需的),User-Agent
- 每個類型請求頭結(jié)束后,會跟上(CR)(LF)
- 消息報頭和請求正文會隔一行
1)GET請求
GET請求格式:
<訪問路徑>[?=[&=…]]
例子:http://site1.com/get.php?arg1=value1
Server端可以根據(jù)參數(shù)名獲取值:
PHP例子:
結(jié)果就是輸出arg1相應(yīng)的值。
GET請求,是可以把數(shù)據(jù)放在URL中來傳遞,也可以不包含任何數(shù)據(jù),HTTP請求只有請求頭,沒有請求數(shù)據(jù)。
請求頭中可以不包含Content-Length,例子:
GET /get.php?arg1=value1 HTTP/1.1
Host: site1.com
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.2) GCDHTTPRequest
GET請求可以只有請求的路徑:
http://www.gooann.com
GET請求也可以帶需要傳遞的數(shù)據(jù),在訪問路徑之后帶問號(?)+參數(shù)=值的方式發(fā)送。
http://site1.com/get.php?arg1=value1
2)POST請求
POST請求是包含數(shù)據(jù),請求數(shù)據(jù)的格式,可以在HTTP頭中定義。格式一般會有下面5種:
- 表單格式:application/x-www-form-urlencoded
- 混合格式:multipart/form-data
- JSON格式:application/json
- XML格式:text/xml
- 文本:text/plain
下面對這幾種格式做一下介紹
2.1 表單格式
與get方式類似,是把所有提交數(shù)據(jù)放在數(shù)據(jù)區(qū)域。
POST方式也可以像GET方式在URL帶參數(shù),但一般不會這么去使用。
表單方式與GET方式類似,只是把數(shù)據(jù)放在頭文件下面的請求正文區(qū)域。請求如下:
POST /post-form.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: 192.168.0.105
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.2) GCDHTTPRequest
Content-Length: 11
arg1=value1
2.2 混合格式
有文件上傳時常用的方法??梢越邮芡瑫r提交不同類型的數(shù)據(jù)
表單中,可以把類型更改為file就可以上傳文件
類型后面一般會跟boundary來告知數(shù)據(jù)區(qū)域分隔符
每個數(shù)據(jù)都可以單獨說明數(shù)據(jù)類型
混合模式一般是用來傳輸文件。后面會跟boundary=__xxxx__來進行每個參數(shù)的分割。
POST /upload_file.php HTTP/1.1
Content-Type: multipart/form-data; boundary=------WebKitFormBoundaryRTP6hG23yFYrExfg
Host: 192.168.0.105
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.2) GCDHTTPRequest
Content-Length: 101
------WebKitFormBoundaryRTP6hG23yFYrExfg
Content-Disposition: form-data; name=“arg1”
value1
------WebKitFormBoundaryRTP6hG23yFYrExfg
Content-Disposition: form-data; name=“file”; filename=“python.txt”
Content-Type: text/plain
多線程
xxxxx
------WebKitFormBoundaryRTP6hG23yFYrExfg
Content-Disposition: form-data; name=“file2”; filename=“mails.zip”
Content-Type: application/zip
xxxxx
------WebKitFormBoundaryRTP6hG23yFYrExfg–
2.3 文本格式
常見類型為json,xml,plain
這種類型的數(shù)據(jù),需要服務(wù)端代碼自行解析
PHP代碼為例:
file_get_contents(“php://input”); - 可以獲取數(shù)據(jù)區(qū)域文本
要是接受的是json,使用相關(guān)方法(函數(shù))來解析
echo json_decode(file_get_contents(“php://input”),true)[‘a(chǎn)rg1’];
可以根據(jù)type(類型)來解開數(shù)據(jù)。
文本模式,也可以按照文件來接收,
使用file_get_contents(“php://input”); 可以免去讀取文件里的內(nèi)容。
file_get_contents(“php://input”); 模式不能接收multipart/form-data模式。
下面代碼就是PHP寫的,當類型為json時,根據(jù)json解析
這時請求數(shù)據(jù)是:{“arg1”:“value1”}
返回值是:value1
3)HEAD請求
HEAD請求就是返回只有頭部數(shù)據(jù),數(shù)據(jù)部分不返回內(nèi)容,返回的內(nèi)容基本上與GET,POST的返回頭一致:
4)OPTIONS請求
OPTIONS請求,默認情況下會返回允許的請求類型
http://www.microsoft.com/zh-cn/ 會返回:
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Credentials: true
一般需要跨域的時候需要設(shè)置OPTIONS(跨域后面來講)
使用腳本讓瀏覽器跨域進行請求的時候,會檢測OPTIONS,對方服務(wù)器是否允許跨域。允許的情況下,才會真正去進行相應(yīng)請求
當你用瀏覽器訪問 site1.com, 某些腳本操作會提交到site2.com而且附帶非瀏覽器默認的頭信息,這個時候瀏覽器不會直接發(fā)出POST請求,先發(fā)出OPTIONS請求來判斷是否允許發(fā)送POST。當對方回復(fù)允許了,才能發(fā)送POST請求。
5)PUT DELETE請求
PUT:在特定目錄里上傳指定文件,文件名在url中設(shè)置。
DELETE:刪除特定目錄里的文件,文件名在url中設(shè)置。
在NGINX中,可以添加如下配置來允許PUT,DELETE
location /upload/ {
dav_methods PUT DELETE;
root /usr/share/nginx/html;
}
PUT - 發(fā)送包
PUT /upload/Untitled HTTP/1.1
Content-Type: application/octet-stream
Host: 192.168.1.64
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.6) GCDHTTPRequest
Content-Length: 284
…
PUT – 返回包
HTTP/1.1 201 Created
Server: nginx/1.12.1
Date: Fri, 01 Sep 2017 13:40:03 GMT
Content-Length: 0
Location: http://192.168.1.64/upload/Untitled
Connection: close
DETELE – 發(fā)送包
DELETE /upload/Untitled HTTP/1.1
Host: 192.168.1.64
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.6) GCDHTTPRequest
DELETE – 返回包
HTTP/1.1 204 No Content
Server: nginx/1.12.1
Date: Fri, 01 Sep 2017 13:51:07 GMT
Connection: close文章來源:http://www.zghlxwxcb.cn/news/detail-664848.html
6)TRACE、CONNECT請求
HTTP TRACE是讓我們的web服務(wù)器端將客戶端的所有請求信息返回給客戶端的方法,該方法多見于debug的需求。
CONNECT是在特定應(yīng)用走HTTP協(xié)議時會用到:文章來源地址http://www.zghlxwxcb.cn/news/detail-664848.html
- proxy可能會用到
- 某些使用http協(xié)議,需要長鏈接的程序(SSL就使用connect)
到了這里,關(guān)于Web安全測試:HTTP請求詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!