从浏览器输入URL到页面渲染的过程

零、背景



一个web安全工程师在学习web安全和web渗透时候,非常有必要了解整个WEB工作过程。

一、输入URL



这里是最基本的知识:URL是URI的一种实际应用,URI统一资源表示符,URL统一资源定位符。URL举例: https://www.xxx.com:443/index.php 前面是协议 https 然后是主机www.xxx.com 然后是端口 443,最后是资源在该主机上针对web系统根目录(通常为www)的相对路径。所以可以想象,根据WEB访问就是获取资源,已经知道端口、路径、协议,唯独缺乏对方的IP了,毕竟HTTP下层是TCP/IP嘛,所以这里就用到从域名(或者是主机名)获取其对应的IP地址。

二、解析IP地址



这里为啥不用DNS呢,是因为在windows里面不一定是用DNS解析的IP地址哦,还可能是netbios哈

DNS 解析顺序


在linux中一般先解析/etc/hosts中的静态配置的解析,如果不行再利用dns递归请求解析域名。在windows中一般是先dns cache(dns缓存),然后再hosts文件,最后是dns递归解析。

Netbios 解析顺序


首先这个只有windows才会有,一般只在局域网或域内生效,其解析顺序域操作系统也就是windows的版本有关系。另外和配置的模式有关系。一般的NetBIOS cache (NetBIOS缓存),然后是WINS Server和广播,最后是LMHOSTS。如果模式不一样,WINS服务器解析和广播的顺序有调整。

三、发送HTTP请求



其实这里未必是HTTP协议或者HTTPS协议,有可能是其他协议,但是HTTP(HTTPS)协议非常典型,这里就是以此为例进行讲解。这里发送HTTP请求,表明请求的资源或者提交的资源,在头部字段里会带有相应的身份验证信息、回话信息、登录状态信息和控制信息等。

四、服务器处理并返回响应报文



HTTP请求到大服务器后,服务器会进行处理,然后根据处理结果返回相应的返回包,包括返回状态、返回内容,头部字段中的对应的控制信息等。

五、浏览器渲染页面



现代浏览器的渲染过程如下:

  • 1.解析HTML构建DOM树
  • 2.构建渲染树
  • 3.布局渲染树
  • 4.绘制渲染树

最近在工作中还是遇到了一些攻击者追查等等事情,结合自己过去做过一年的安全分析师的经验,对几款比较好的追踪溯源网站的使用做一个简介。

一、关联神器passivetotal

1、网址:https://community.riskiq.com/

2、简介:常用来搜索IP、Domain、URL、whois信息、ipwhois信息等,是一个存储数量比较全面,信息量较大,而且可以和时间关联分析。实现这些维度的互查反查是很重要的一个功能。需要注册哦。

3、截图:

二、样本神器virustotal

1、网址:https://www.virustotal.com/#/home/upload

2、简介:可以查询样本在多家杀毒引擎的扫描检测结果,另外可以查询IP、url、hash,这样可以关联下载downloadurl 、恶意域名、IP,以及恶意的样本hash。(注册之后可付费,在线样本可下载)

3、截图:

4、自己查看vt文档写的一个apilib库

复制代码
  1 #!/usr/bin/env python
  2 #-*-coding:UTF-8-*-
  3 #引入头文件
  4 import os
  5 import sys
  6 import json
  7 import urllib
  8 import urllib2
  9 import hashlib
 10 import postfile
 11 import simplejson
 12 
 13 #全局变量
 14 #APIKEY = None
 15 APIKEY = '033e1a2ae071f8800d558a968717c2674f8eb728cfb6b470d4713dd744600fb7'
 16 MYVTOBJ = None
 17 CRONTOL_BIT = 0
 18 #创建VirusTotal类
 19 class VirusTotal:
 20     def __init__(self,apikey):
 21         self.virus_dict = {}
 22         self.apikey = apikey
 23         
 24     def get_virus_dict(self):
 25         return self.virus_dict
 26         
 27     def upload_one_check_file(self,check_file):
 28         check_host = "www.virustotal.com"
 29         selector = "https://www.virustotal.com/vtapi/v2/file/scan"
 30         fields = [("apikey",self.apikey)]
 31         file_name = os.path.basename(check_file)
 32         try:
 33             file_to_check = open(check_file,'rb').read()
 34         except Exception,ex:
 35             #log.log(ex,3,1)
 36             return (-1,ex)
 37         file_struct = [("file",file_name,file_to_check)]
 38         try:
 39             result_json = postfile.post_multipart(check_host,selector,fields,file_struct)
 40         except Exception,ex:
 41             #log.log(ex,3,2)
 42             return (-1,ex)
 43         return result_json
 44         
 45     def upload_check_files(self,files_list):
 46         result_json_list = []
 47         if len(files_list) <= 0:
 48             return (-1,'files_list error')
 49         for item in files_list:
 50             ret = self.quick_check(item)
 51             result_json_list.append(ret)
 52         return result_json_list
 53         
 54     def check_file_rescan(self,scanid):
 55         url = "https://www.virustotal.com/vtapi/v2/file/rescan"
 56         scanid_string = None
 57         if type(scanid) is list:
 58             for item in scanid:
 59                 scanid_string += str(item)+','
 60             scanid_string = scanid_string[0:-1]
 61             parameters = {"resource":scanid_string,"apikey":self.apikey}
 62             try:
 63                 data = urllib.urlencode(parameters)
 64                 check_request = urllib2.Request(url,data)  
 65                 response = urllib2.urlopen(check_request)  
 66                 result_json = response.read()
 67             except Exception,ex:
 68                 ##log.log(ex,3,2)
 69                 return (-1,ex)
 70             return result_json
 71         parameters = {"resource":scanid,"apikey":self.apikey}
 72         try:
 73             data = urllib.urlencode(parameters)  
 74             check_request = urllib2.Request(url,data)  
 75             response = urllib2.urlopen(check_request)  
 76             result_json = response.read()
 77         except Exception,ex:
 78             #log.log(ex,3,2)
 79             return (-1,ex)
 80         return result_json
 81     
 82     def quick_check(self,check_file):
 83         file_md5 = None
 84         print str(check_file)
 85         with open(str(check_file),'rb') as f:
 86             file_md5 = hashlib.md5()
 87             file_md5.update(f.read())
 88             file_md5 = file_md5.hexdigest()
 89         ret = self.upload_one_check_file(check_file)
 90         if ret.find('Error 400') >= 0:
 91             ret = self.check_file_rescan(file_md5)
 92         ret = simplejson.loads(ret)
 93         return ret["sha256"]
 94 
 95     def get_report(self,scanid):
 96         url = "https://www.virustotal.com/vtapi/v2/file/report"  
 97         parameters = {"resource":scanid,"apikey":self.apikey}
 98         try:
 99             data = urllib.urlencode(parameters)  
100             report_requset = urllib2.Request(url,data)  
101             response = urllib2.urlopen(report_requset)  
102             result_json = response.read()
103         except Exception,ex:
104             #log.log(ex,3,2)
105             return (-1,ex)
106         return result_json
107 
108     def get_report_from_designated_company(self,company,scanid):
109         url = "https://www.virustotal.com/vtapi/v2/file/report"  
110         parameters = {"resource":scanid,"apikey":self.apikey}
111         try:
112             data = urllib.urlencode(parameters)  
113             report_request = urllib2.Request(url,data)  
114             response = urllib2.urlopen(report_request)  
115             result_json = response.read()    
116             response_dict = simplejson.loads(result_json)
117         except Exception,ex:
118             #log.log(ex,3,2)
119             return (-1,ex)
120         return response_dict.get("scans",{}).get(company,{}).get("result")
121         
122     def url_check(self,check_url):
123         url = "https://www.virustotal.com/vtapi/v2/url/scan"
124         check_urls = None
125         if type(check_url) is list:
126             for item in check_url:
127                 check_urls += str(item)+'\n'
128             check_urls = check_urls[0:-1]
129             parameters = {"url":check_urls,"apikey":self.apikey} 
130             try:
131                 data = urllib.urlencode(parameters)  
132                 url_check_request = urllib2.Request(url,data)  
133                 response = urllib2.urlopen(url_check_request)  
134                 result_json = response.read() 
135             except Exception,ex:
136                 #log.log(ex,3,2)
137                 return (-1,ex)
138             return result_json
139         check_urls = str(check_url)
140         parameters = {"url":check_urls,"apikey":self.apikey}  
141         try:
142             data = urllib.urlencode(parameters)  
143             url_check_request = urllib2.Request(url,data)  
144             response = urllib2.urlopen(url_check_request)  
145             result_json = response.read()  
146         except Exception,ex:
147             #log.log(ex,3,2)
148             return (-1,ex)
149         return result_json  
150         
151     def get_url_report(self,check_url):
152         url = "https://www.virustotal.com/vtapi/v2/url/report"
153         check_urls = None
154         if type(check_url) is list:
155             for item in check_url:
156                 check_urls += str(item)+','
157             check_urls = check_urls[0:-1]
158             parameters = {"resource": "http://www.sohu.com","apikey":self.apikey,"scan":"1"}  
159             try:
160                 data = urllib.urlencode(parameters)  
161                 url_check_request = urllib2.Request(url,data)  
162                 response = urllib2.urlopen(url_check_request)  
163                 result_json = response.read()
164             except Exception,ex:
165                 #log.log(ex,3,2)
166                 return (-1,ex)
167             return result_json
168         check_urls = str(check_url)
169         parameters = {"resource":check_urls,"apikey":self.apikey}  
170         try:
171             data = urllib.urlencode(parameters)  
172             url_check_request = urllib2.Request(url,data)  
173             response = urllib2.urlopen(url_check_request)  
174             result_json = response.read()
175         except Exception,ex:
176             #log.log(ex,3,2)
177             return (-1,ex)
178         return result_json
179 
180     def get_url_report_from_designated_company(self,check_url,company):
181         url = "https://www.virustotal.com/vtapi/v2/url/report"
182         check_urls = str(check_url)
183         parameters = {"resource":check_urls,"apikey":self.apikey}  
184         try:
185             data = urllib.urlencode(parameters)  
186             url_check_request = urllib2.Request(url,data)  
187             response = urllib2.urlopen(url_check_request)  
188             result_json = response.read()
189         except Exception,ex:
190             #log.log(ex,3,2)
191             return (-1,ex)
192         response_dict = simplejson.loads(result_json)  
193         return response_dict.get('scans',{}).get(company).get('result')
194     
195     def ip_check(self,ip):
196         url = 'https://www.virustotal.com/vtapi/v2/ip-address/report'  
197         parameters = {'ip':ip,'apikey':self.apikey}  
198         try:
199             response = urllib.urlopen('%s?%s'%(url,urllib.urlencode(parameters))).read()  
200             response_dict = json.loads(response)
201         except Exception,ex:
202             #log.log(ex,3,2)
203             return (-1,ex)
204         return response_dict 
205         
206     def domain_check(self,domain):
207         url = 'https://www.virustotal.com/vtapi/v2/domain/report'  
208         parameters = {'domain':domain,'apikey':self.apikey}
209         try:
210             response = urllib.urlopen('%s?%s'%(url,urllib.urlencode(parameters))).read()  
211             response_dict = json.loads(response)  
212         except Exception,ex:
213             #log.log(ex,3,2)
214             return (-1,ex)
215         return  response_dict 
216 
217 
218 #快速使用函数
219 def vtocq():
220     global APIKEY
221     global MYVTOBJ
222     global CRONTOL_BIT
223     if CRONTOL_BIT != 0:
224         return ('-2','ERROR')
225     if APIKEY != None:
226         MYVTOBJ = VirusTotal(APIKEY)
227     else:
228         return ('-1','APIKEY information set error!')
229     CRONTOL_BIT = 1
230     return MYVTOBJ
231     
232 def fcq(file_check,hash_sha1):
233     global MYVTOBJ
234     ret = MYVTOBJ.quick_check(file_check)
235     ret = MYVTOBJ.get_report(hash_sha1) 
236     ret = simplejson.loads(ret)
237     vtnumber = ret['positives']
238     av_macfee = ret['scans']['McAfee']['result']
239     av_bkav = ret['scans']['Bkav']['result']
240     av_360 = ret['scans']['Qihoo-360']['result']
241     ret = { 
242         "vtnumber":vtnumber,
243         "av_360":av_360,
244         "av_bkav":av_bkav,
245         "av_macfee":av_macfee
246     }
247     return ret
248     
249 def vt_check(filecheck,hash_sha1):
250     vtocq()
251     ret = fcq(filecheck,hash_sha1)
252     print ret
253     return ret
254     
255 #vt_check('C://PuTTY//plink.exe')
256 MYVTOBJ = VirusTotal(APIKEY)
257 print MYVTOBJ.domain_check("lx.com")
复制代码

三、其他工具:

1、站长之家--站长工具:做一些域名、IP、注册邮箱等信息的关联查询。

2、www.ipip.net:做一些IP地理信息查询。

posted @ 2021-05-24 10:34  斑林鸽的代码世界  阅读(419)  评论(0编辑  收藏  举报