聊聊web安全

先说一个基础知识:URL和URI的区别?

url(Uniform Resource Locator,统一资源定位符)

是用于标识互联网上资源的地址,它不仅指定了资源的位置,还包括了用于访问该资源的协议。例如,http://www.example.com/index.html 就是一个 URL,它明确指出了使用 HTTP 协议访问 www.example.com 网站的 index.html 文件

uri(Uniform Resource Identifier,统一资源标识符)

是一个更广泛的概念,它只用于标识资源,而不涉及如何访问这些资源。URI 可以是 URL,但也可以是 URN(Uniform Resource Name,统一资源名称)等其他形式。例如,mailto:example@example.com 是一个 URI,但不是 URL,它只是标识了一个电子邮件地址这个资源。

http详解

 http协议 HTTP 协议目前最新版的版本是1.1,HTTP是一种无状态的协议。无状态是指Web浏览器 与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后 Web服务器返回响应(Response),连接就被关闭了,在服务器端不保留连接的有关信息。也就 是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。

 请求响应

HTTP请求包括三部分,分别是请求行(请求方法)、请求头(消息报头)和请求正文。下面是HTTP请求的一个例子。

POST/1ogin.php HTTP/1.1    //请求行

HOST:www.xxser.com //请求头

User-Agent:Mozilla/5.0(Windows NT 6.1;rv:15.0) Gecko/20100101 Firefox/15.0 //空白行,代表请求头结束

Username=admin&password-admin //请求正文

 

与HTTP请求对应的是HTTP响应,HTTP响应也由三部分内容组成,分别是响应行、响 应头(消息报头)和响应正文(消息主题)。下面是一个经典的HTTP响应。

HTTP/1.1200OK //响应行

Date:Thu,28Feb 201307:36:47 GMT //响应头

Server:BWS/1.0

Content-Length:4199

Content-Type:text/html;charset=utf-8

Cache-Control:private

Expires:Thu,28 Feb 2013 07:36:47GMT

Content-Encoding:gzip

Set-Cookie: H_PS_PSSID=20221438_1944_1788; path=/;domain=,xxser.com

Connection:Keep-Alive //空白行,代表响应头结束

<htm1> //响应正文或者叫消息主题

<head><title>Index.html</title>

</head>

 

请求方式

get/post/head/put/delete./trace/options/connect/

状态码

1xx:信息提示,表示请求已被成功接收,继续处理。其范围为100~101。

2xx:成功,服务器成功地处理了请求。其范围为200~206。

3xx:重定向,重定向状态码用于告诉浏览器客户端,它们访问的资源已被移动,并告 诉客户端新的资源地址位置。这时,浏览器将重新对新资源发起请求。其范围为300~ 305。

4xx:客户端错误状态码,有时客户端会发送一些服务器无法处理的东西,比如格式错 误的请求,或者最常见的是,请求一个不存在的URL。其范围为400~415

常见的状态码:

200:容户端请求成功,是最常见的状念。
302 :重定向。
404 : 请求资源不存在是最常见的状态。
400:客户端请求有语法错误,不能被服务器所理解。
401: 请求术经授权。
403:服务器收到请求,但是拒绝提供服务。
500 : 服务内部错误 ,是最常见的状念。 503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

 

http消息

请求头

key value解释
Host Host请求报头域主要用于指定被请求资源的Interet主机和端口号,例如:HOST: www.xxser.com:801。
User-Agent User-Agent请求报头域允许客户端将它的操作系统、浏览器和其他属性告诉服务器。登录 一些网站时,很多时候都可以见到显示我们的浏览器、系统信息,这些都是此头的作用,如: User-Agent: My privacy
Referer Referer包含一个URL,代表当前访问URL的上一个URL,也就是说,用户是从什么地方 来到本页面。如:Referer: www.xxer.com/login.php,代表用户从login.php来到当前页面。
Range Range可以请求实体的部分内容,多线程下载一定会用到此请求头。例如:表示头500字节:bytes=0~499
Cookie Cookie是非常重要的请求头,它是一段文本,常用来表示请求者身份等。在后面将会详细 讲述Cookie。
Accept Accp请求报头域用于指定客户端接收哪些MIME类型的信息,如Accep: texthml,表 明客户端希望接收HTML 文本。
Accept-Charset Accp-Charset请求报头城用于指定客户端接收的字符集。例如:Accp-Charsetio-859-1, gb2312。如果在请求消息中没有设置这个域,默认是任何字符集都可以接收。
更多的头信息可以参考这个 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Accept

响应头

key value解释
Server   服务器所使用的Web服务器名称,如Server:Apache/1.3.6(Unix),攻击者通过查看此头,可 以探测Web服务器名称。所以,建议在服务器端进行修改此头的信息。
Set-Cookie 向客户端设置Cookie,通过查看此头,可以清楚地看到服务器向客户端发送的Cookie 信息。
Last-Modified 服务器通过这个头告诉浏览器,资源的最后修改时间。
Location 服务器通过这个头告诉浏览器去访问哪个页面,浏览器接收到这个请求之后,通常会立刻 访问Location头所指向的页面。这个头通常配合302状态码使用。
Refresh 服务器通过Refresh头告诉浏览器定时刷新浏览器。
更多响应头参考这里 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/100

 

 

 

 

 

 

 

更多的关于http协议的内容,可以去看看这个网站:https://developer.mozilla.org/zh-CN/docs/Web。  这里面讲的很详细了 。

信息探测

收集web信息

可以使用一些关键字在搜索引擎探测:

关键字描述示例用途
site 指定域名 site:example.com 快速聚焦特定网站,获取该网站内与关键字相关的信息
intext 正文中存在关键字的网页 intext: 敏感信息 filetype:txt 挖掘网站中正文包含特定关键词的文本内容
intitle 标题中存在关键字的网页 intitle: 新闻 关键词 定位与特定主题相关的网页标题
info 获取一些基本信息 info:website.com 提供网站的初步了解和背景信息
inurl URL 中存在关键字的网页 inurl: 产品展示 找到与特定主题相关的网页链接
filetype 搜索指定文件类型 filetype:pdf 技术文档 筛选特定类型的文件资源

 

漏洞扫描

漏洞扫描也属于一种信息探测,使用扫描器可以帮组我们发现更多的问题。

可以使用下面几种进行扫描:

Burp Suite
AWVS
AppScan

 

 

 

 

具体使用方式,可以自行百度。使用这些工具发先漏洞问题,后面就是如何防止这些漏洞发生。

 

漏洞原理

sql注入

2013年大学老师讲的案例是这样的:一个后台登陆页面,输入用户名密码后,后端拿着接受到的账号密码去验证。但是这个验证的过程是通过sql的条件比对进行的。所以,这些条件完全就依赖于用户在客户端输入的数据,如果输入的内容包含 “or 1=1 or” 这样的条件的时候,就已经注入了脚本。

说到底,是因为服务端的信任了客户端输入的数据,才会导致最终的执行结果。所以,对于客户端输入的任意的内容,都要视为不可靠的内容。

下面说说注入的分类
1.数字型注入

比如对输入的数字类型进行注入的情况:

select * from table where id = 8 ` //对于这样的查询肯定是会报错的,因为源ID是数字类型的
//如果注入的条件是id=8 and 1=1
select * from table where id=8 and 1=1 //对于这样的sql和正常的结果是一样的

2.字符型注入

当输入参数为字符串的时候,被称为是字符型注入。

select * from table where username='admin'

字符型注入最关键的是如何闭合SQL语句以及注释多余的代码。

它和数字注入最大的区别是:数字不需要单标签闭合,而字符需要闭合标签。

如果输入的username 是"admin' and 1=1 " 这样就又可以注入成功了。 

防止sql注入
  1.严格控制数据类型

    对于强类型语言更加容易实现。比如数字的类型的就强制转换成对应的类型。例如:Integer.parseInt();

  2.对特殊字符转义

    这样可以特殊标签的连接性

  3.使用预处理编译

    java可以使用preparedstatement

  4.使用存储过程

    这个不常用

  5.使用框架统一解决

    常见的框架都已经解决了这样的问题,通过参数绑定基本阻断了sql注入问题。

文件上传漏洞

上传文件的漏洞主要通过以下几种方式实现:

  服务器端解析漏洞:

    IIS解析漏洞: 

      漏洞特点:IIS 6.0在解析文件时存在一些漏洞,例如当建立`.asa`、`.asp`格式的文件夹时,其目录下的任意文件都将被IIS当作asp文件来解析;当文件为`.asp;.1.jpg`时,IIS 6.0同样会以ASP脚本来执行。
        利用方式:攻击者可以利用这些漏洞,将恶意文件上传到服务器,并通过特定的请求方式(如HTTP请求)使服务器将恶意文件解析为可执行文件,从而获取服务器权限或执行其他恶意操作。

    Apache解析漏洞:

      漏洞特点:Apache 1.x和Apache 2.x在解析文件时,当碰到不认识的扩展名时,会从后向前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码。

      利用方式:攻击者可以上传具有特殊扩展名的文件,如`.php.rar`,利用Apache的解析漏洞,使服务器将其解析为PHP文件,从而执行其中的恶意代码。

    PHP CGI解析漏洞:

      漏洞特点:在某些情况下,PHP的配置选项可能导致解析漏洞,例如当访问`http://www.example.com/1.php`时,如果服务器将其解析为PHP文件,而实际上该文件应该是图片文件,就会导致解析漏洞。

      利用方式:攻击者可以上传合法的图片文件,并在文件名后面添加`.php`等后缀,利用PHP CGI的解析漏洞,使服务器将图片文件解析为PHP文件,从而执行其中的恶意代码。

  文件上传验证漏洞:

    客户端验证漏洞:

      漏洞特点:客户端验证通常使用JavaScript进行,但是JavaScript可以被轻易绕过。攻击者可以使用工具(如FireBug)删除客户端的验证代码,或者使用中间人攻击等方式篡改请求数据,从而绕过客户端验证。

      利用方式:攻击者可以上传恶意文件,即使文件格式不符合要求,也能成功上传到服务器。

    服务器端验证漏洞:

      黑名单验证漏洞:服务器端通常会对上传的文件扩展名进行验证,使用黑名单过滤掉一些危险的扩展名。但是,攻击者可以通过寻找黑名单中未包含的扩展名,或者利用文件扩展名的大小写转换、文件名末尾添加空格等方式绕过黑名单验证。

      白名单验证漏洞:白名单验证是一种相对安全的验证方式,但是如果白名单不完整或者存在漏洞,攻击者仍然可以利用这些漏洞上传恶意文件。例如,如果白名单只允许上传`.jpg`、`.gif`和`.png`等文件扩展名,攻击者可以将恶意文件命名为`.jpg1.php`,利用Apache的解析漏洞,使服务器将其解析为PHP文件。

      其他验证漏洞:服务器端还可能存在其他类型的验证漏洞,如文件类型验证、文件大小验证、目录遍历验证等。攻击者可以通过修改文件类型、增大文件大小、遍历目录等方式绕过这些验证。

    文件上传流程漏洞

      截断上传漏洞:

          漏洞特点:在一些ASP程序中,存在截断上传漏洞。攻击者可以通过修改文件名的方式,将恶意文件的扩展名截断,从而使服务器将其解析为其他文件类型。

          利用方式:攻击者可以上传一个名为`1.jpg`的文件,但是在文件内容中包含恶意代码。然后,攻击者可以通过修改文件名的方式,将其修改为`1.jpg%00`,其中`%00`是一个空字符,会截断文件名后面的部分。这样,服务器将无法正确解析文件名,从而将恶意文件解析为其他文件类型,执行其中的恶意代码。

      目录遍历漏洞:

          漏洞特点:在一些文件上传系统中,可能存在目录遍历漏洞。攻击者可以通过构造特殊的文件名或路径,遍历服务器上的目录结构,从而获取敏感信息或上传恶意文件。

          利用方式:攻击者可以构造一个文件名`../../../../etc/passwd`,通过文件上传系统上传该文件。服务器在处理文件上传请求时,会根据文件名遍历目录结构,最终找到`/etc/passwd`文件,并将其上传到服务器。这样,攻击者就可以获取到服务器上的用户密码文件等敏感信息。

总之,上传文件的漏洞主要是由于服务器端和客户端的验证机制不完善,以及文件上传流程中存在的安全隐患导致的。攻击者可以利用这些漏洞上传恶意文件,从而获取服务器权限或执行其他恶意操作。为了防止上传文件漏洞的发生,开发人员应该加强对文件上传系统的安全验证和控制,同时用户也应该提高安全意识,避免上传恶意文件。

 如何防止文件上传漏洞

    1.通常你得对文件类型,文件大小,包括文件内容开头的文件类型进行校验。

    2.对你的文件进行重新命名,不要使用原名。如果需要保存原名,需要对原名进行转义后保存。

    3.对保存文件的文件夹设置对于的权限。最好不要给可执行的权限。这样即使可执行文件保存了,也不能执行。

 

XSS攻击

这个一般都是使用javaScript进行获取客户端的信息,比如:cookie信息,客户端页面的bom信息,跳转页面等操作。

   xss类型

    1.反射型:反射型是指用户输入的数据,经过服务端,然后把带有攻击脚本的数据发送给浏览器。比如入门级的:username=<script>alert("xxxx")</script> 这样的内容如果输入完后就会在浏览器弹框。如果把这个脚本内容换成获取客户端cookie的信息然后发送给外部网站的脚本,这样信息就被抓走了 。

    2.存储型:存储型的数据会经过用户输入以后保存在服务端,比如一个留言板的内容,一个用户输入了脚本content=<script>alert("xxxx")</script 如果这样的内容被保存在服务器,下次所有用户看到的数据都会弹框出来。

    3.dom xss类型:是通过script修改页面中的dom节点。这种攻击就很容易修改页面,然后诱导用户点击访问钓鱼网站,这也是常见的攻击手段。

  xss高级应用

    1.盗用用户的cookie

    2.修改页面内容

    3.网站挂马

    4.利用网站重定向

    5.xss蠕虫

 xss会话劫持

    cookie 是一种存储在客户端少量数据的一种手段,cookie的数据可以存储在内存中,也是我们常说的会话级别的;还有一种是存储在硬盘中的数据,例如记住密码,这个加密后的数据是持久化在硬盘中的。这些数据就算是用户下次重新打开浏览器,这些数据还是在的。

    并且所有的cookie存储的格式和位置基本上是固定的。这种有规律可寻的数据是很容易被挖掘的。

    在你设置cookie的时候有一个重要的属性是:HtpOnly。,可以禁止javaScript读取这些内容。

    除了cookie,还有一种维持会话状态的是形式是session。虽然session存储的信息是存在服务端的,但是客户端每次发送请求携带的session_id这个数据是在客户端的。如果用户从客户端拿到这个session_id,就可以自由访问后端数据。

  xss蠕虫攻击方式

   这种方式首先是要分析网站的传播机制。比如,在微博上,如何让很多用户关注我。就要倒叙分析,早期的微博是需要访问一个url就可以。然后就要想办法得到对应的用户ID,然后再分析如何获取用户的ID。有了这两个条件后,就能实现关注的功能。但是,如何传播,这是传播途径。通过注入存储型的脚本,然后其他好友在查看微博的同时,然后转发自己微博,这样就边传播遍关注自己。以此来达到目的。这种的难度就在于要分析。

如何防止xss脚本攻击

  1.对于用户输入的内容,要将特殊的标签进行过滤或者是转义。特别是威力很大的<script>标签。毒瘤一个。

  2.在设置Cookie时设置httpOnly,防止js对敏感数据劫持。

 

CORS(Cross-Origin Resource Sharing,跨域资源共享)

  防范 CORS 攻击的措施

    1.服务端在设置Access-Control-Allow-Origin这个参数的时候,使用更精准的范围控制,避免使用*。这样所有的网站都可以访问了。

    2.服务端可以验证来源来检测是否合法请求

针对这种攻击,客户端基本上起不来决定性的作用。既然是跨域访问了,一定是在要服务端控制的。所以,这里的网络安全显的特别重要。

 

其他的攻击

 

  暴力破解:

    这种其实就是利用现在强大的硬件资源,不断的枚举所有的可能性。应对这种攻击,现在都有限流、黑白名单、监控等手段,这种基本上是很笨重的一种方式。

  提权:

    这种是手段也是用的比较多的。一般是先于服务器建立连接,然后对通过查找系统漏洞,然后提升账号的权限。当用户的权限足够大的时候,就可以访问更多的资源。

  更多的其他的方式:后面看到了再补充吧,毕竟我不是专门搞安全的,知道的基本也就这么多了。剩下的都是运维安全级别搞的事情了。

 

posted @   Eular  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示