精华内容
下载资源
问答
  • web攻防教程

    2015-05-16 13:10:11
    一本关于web攻击和防御的文档,主要是针对linux系统中php和mysql攻击等
  • Web系统csrf漏洞攻防

    2020-06-03 16:07:04
    csrf 漏洞是配合xss漏洞对web系统进行渗透攻击的,或者是攻击者构造一个恶意的请求,例如 http://www.test.com/help.html 如果目标 web 系统存在 csrf 漏洞,并且系统管理员已经登录,那么攻击者可以诱骗管理员点击 ...

    前言

    csrf 漏洞是配合xss漏洞对web系统进行渗透攻击的,或者是攻击者构造一个恶意的请求,例如 http://www.test.com/help.html 如果目标 web 系统存在 csrf 漏洞,并且系统管理员已经登录,那么攻击者可以诱骗管理员点击 http://www.test.com/help.html 这个链接,这时候攻击方相当于盗用了管理员的身份来进行操作,而且管理员丝毫未察觉,这个攻击就已经完成了,风险可想而知。

    解决方案

    可以对指向服务器的请求的请求头中的referer进行校验,判断当前erferer是否是来自本网站,如果不是则定为非法访问,直接拒绝,具体做法是写一个全局过滤器,废话不多说,直接上代码:

    过滤器 RefererFilter:

    package com.common.filter;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.log4j.LogManager;
    import org.apache.log4j.Logger;
    
    /**
     * @ClassName: RefererFilter
     * @Description: 过滤非本站请求, 防止csrf跨站请求伪造进行攻击
     * @author weny.yang
     */
    public class RefererFilter implements Filter {
    	private static final Logger logger = LogManager.getLogger(RefererFilter.class);
    
    	public void init(FilterConfig filterconfig1) throws ServletException {
    		
    	}
    	
            public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws     IOException, ServletException {
    		HttpServletRequest request = (HttpServletRequest) req;
    		HttpServletResponse response = (HttpServletResponse) res;
    		
    		//请求url
                    String url = request.getServletPath();  
    		//请求来源标识
    		String referer = request.getHeader("referer");
    		String webPath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
    		//拦截所有不是来自本网站的非静态资源请求
    		if(url.contains("/servlet/") && (null==referer || (null!=referer && !referer.contains(webPath)))) {
    			logger.info("非法盗链请求被拦截,Referer= " + referer + " 目标Url= " + url);
    			return;
    		}
    		chain.doFilter(request, response);
    	}
    	public void destroy() {
    		
    	}
    
    }

    web.xml 配置:

    <!-- 过滤非本站请求,防止csrf跨站请求伪造进行攻击 -->
    <filter>
    	<filter-name>RefererFilter</filter-name>
    	<filter-class>com.common.filter.RefererFilter</filter-class>
    </filter>
    <filter-mapping>
    	<filter-name>RefererFilter</filter-name>
    	<url-pattern>/*</url-pattern>
    </filter-mapping>

    本文过滤器是基于比较传统的老项目,内部具体过滤逻辑请根据自己实际项目情况变更。

    展开全文
  • web黑客攻防

    2012-11-10 16:10:51
    比较全面,目前较新的web黑客攻防、网络、系统黑客知识
  • WEB攻防实战入门

    2021-04-11 15:03:14
    WEB-学习一.收集域名信息1.域名介绍2.whois介绍WHOIS协议3.Whois查询Whois查询方法4.备案信息查询ICPC备案查询方法二.收集子域名信息1.子域名介绍子域名(Subdomain Name)2.挖掘子域名的重要性 一.收集域名信息 ...

    一.收集域名信息

    渗透测试之域名收集:目的是为了让我们更好的了解目标网站,为拿下webshell打下基础。

    1.域名介绍

    域名(Domain Name),是由一串用点分割的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时计算机的电子方位;

    例如:学院域名:51cto.com

    对于edu.51cto.com 以及www.51cto.com是该域名对应的子域名,而edu和www都是对应的主机头。

    浏览网站过程:(从DNS服务器获得指定域名对应的IP地址)
    在这里插入图片描述

    2.whois介绍

    whois是用来查询域名的IP以及所有者等信息的传输协议。简单说,whois就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人,域名注册商)

    不同域名后缀的whois信息需要到不同的whois数据库查询。如.com的whois数据库和.edu的就不同。每个域名或 IP的whois信息是由对应的管理机构保存,例如,以.com结尾的域名的WHOIS信息由.com域名运营商VeriSign管理,中国国家顶级域名.cn域名由CNNIC(中国互联网络信息中心)管理。

    WHOIS协议

    其基本内容是:先向服务器的TCP端口43建立一个连接,发送查询关键字并加上回车换行,然后接收服务器的查询结果。

    3.Whois查询

    Whois查询的重要性:通过Whois查询可以获得域名注册者邮箱地址等信息。一般情况下对于中小型网站域名注册者就是网站管理员。利用搜索引擎对Whois查询到的信息进行搜索,获取更多域名注册者的个人信息。

    Whois查询方法

    1.Web接口查询: whois查询-中国万网
    whois.com
    whois-站长之家
    爱站网

    2.通过whois命令行查询
    在Kali linux下自带了Whois查询工具,通过命令whois域名进行查询。

    4.备案信息查询

    ICPC备案介绍:Internet Content Provider网络内容提供商。
    《互联网信息服务管理办法》指出互联网信息服务分为经营性和非经营性两类。国家对经营性互联网信息服务实行许可制度;对非经营性网站实行备案制度。未取得许可或者未履行备案手续的。不得从事互联网信息服务。在中华人民共和国境内提供非经营性互联网信息服务,应当依法履行备案手续。未经国家机关单位许可备案,不得在中华人民共和国境内从事非经营性互联网信息服务。

    备案好处:为了防止在网上从事非法的网站经营活动,打击不良互联网信息的传播,如果网站不备案的话,很有可能被查处以后关停。

    ICPC备案查询方法

    Web接口查询:
    天眼查

    二.收集子域名信息

    1.子域名介绍

    顶级域名:是“ .com ” ,“ .net ”,“ .org ” ,“ .cn ”等等。

    子域名(Subdomain Name)

    凡顶级域名前加前缀的都是该顶级域名的子域名,而子域名根据技术的多少分为二级子域名,三级子域名以及多级子域名。
    我国在国际互联网信息中心正式注册并运行的顶级域名是.cn,这也是我国的一级域名。在顶级域名之下,我国的二级域名又分为类别域名和行政区域名两类。
    类别域名共6个,包括用于科研机构的.ac ;用于工商金融企业的.com;用于教育机构的.edu;用于政府部门的.gov;用于互联网信息中心和运行中心的.net;用于非盈利组织的.org;而行政区域名由34个,分为对应于我国各省,自治区和直辖市。

    2.挖掘子域名的重要性

    子域名是某个主域的二级域名名或者多级域名,在防御措施严密情况下无法直接拿下主域,那么就可以采用迂回战术拿下子域名,然后无限靠近主域。

    例如:
    www.xxxxx.com主域不存在漏洞,并且防御措施严密。
    而二级域名edu.xxxxx.com存在漏洞,并且防护措施松散。

    3.子域名挖掘方法

    (1)子域名挖掘工具,如:Maltego CE, wydomain, subDomainsBrute, dnsmaper, Layer子域名挖掘机。
    (2)搜索引擎挖掘,如:在Google中输入site:sina.com
    (3)第三方网站查询:子域名查询-站长工具 ,dns
    (4) 证书透明度公开日志枚举:Censys
    (5)其他途径:在线子域名查询爱站网

    4.刷洞思路

    针对某个具体SRC进行挖洞:如果直接针对主域进行渗透测试很可能是很难达到挖掘的效果。此时可以搜集对应的子域名,然后批量探测某些具体漏洞,从而更加快速容易的发现一些漏洞。之后将漏洞提交对应SRC获取奖金。

    针对刷洞思路:对应没有指定厂商的刷洞,可以根据某些具体漏洞,通过URL采集获取目标,编写探测脚本批量探测,快速高效的刷洞。

    三.Web站点信息收集

    1.CMS指纹识别

    CMS(内容管理系统),又称整站系统或文章系统。用于网站内容管理。用户只需要下载对应的CMS软件包,部署搭建,就可以直接利用CMS,简单方便。但是各种CMS都具有其独特的结构命名规则和特定的文件内容,因此可以利用这些内容来获取CMS站点的具体软件CMS与版本。

    常见CMS:dedecms(织梦),Discuz,Phpcms等。

    CMS识别工具
    (1)在线工具:在线指纹识别云悉指纹

    (2)本地工具 whatweb
    御剑web指纹识别程序 百度网盘
    大禹CMS识别程序

    2.针对CMS漏洞查询

    对于查询到的CMS可以利用//

    3.敏感信息目录

    针对目标Web目录结构和敏感隐藏文件探测是非常重要的。在探测过程中很有可能会探测出后台页面,上传页面,数据库文件,甚至是网站源代码文件压缩包等。

    探测工具
    (1)御剑后台扫描工具
    (2)wwwscan命令行工具
    (3)dirb命令行工具
    (4)dirbuster扫描工具

    4.wordpress测试

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySOL数据库的服务器上架设属于自己的网站。也可以把WordPress当作一个内容管理系统(CMS)来使用。
    针对WordPress测试,可以使用wpscan工具进行安全测试。

    四.端口信息收集

    1.端口介绍

    如果把IP地址比作一间房子,端口就是进出这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0到65536.
    例如:计算机中的80端口,21端口,23端口;

    在计算机中每一个端口代表一个服务。在Windows命令行中使用netstat -anbo显示开放端口。

    2.端口信息收集

    对于收集目标机器端口状态,可以使用工具来进行测试。工具原理:使用TCO或者UDP等协议向目标端口发送指定标志位等的数据包,等目标返回数据包,以此来判断端口状态。
    (1)使用nmap探测。 nmap -A -v -T4目标
    (2)使用masscan探测
    (3)使用在线网站探测 端口扫描-站长工具

    3.端口攻击

    针对不同的端口具有不同的攻击方法。
    例如:针对远程连接服务端口

    端口 端口说明 攻击方法
    22 SSH远程连接 爆破,SS隧道及内网代理转发,文件传输
    23 Telnet远程连接 爆破,嗅探,弱口令
    3389 rdp远程桌面 Shift后门,爆破
    5900 VNC远程连接 弱口令,RCE

    对于扫描到的端口可以在搜索引擎中查找对应的攻击方法进行测试。

    五.SQL注入原理

    1.SOL注入的原因

    语言分类:解释型语言和编译型语言。解释型语言是一种在运行时由一个运行时组件解释语言代码并执行其中包含的指令的语言。而编译型语言是代码在生成时转换为机器指令,然后在运行时直接由使用该语言的计算机执行这些指令。

    在解释型语言中,如果程序与用户进行交互。用户就可以构造特殊的输入来拼接到程序中执行,从而使得程序依据用户输入执行有可能存在恶意行为的代码。

    例如:在于用户交互的程序中,用户的输入拼接到SOL语句中,执行了与原定计划不同的行为,从而产生了SQL注入漏洞。

    2.登陆案例讲解

    登录SOL语句:select * from admin where username = '用户输入的用户名‘ and password = '用户输入的密码’

    用户输入的内容可由用户自行控制,例如可以输入 ‘or 1=1 --空格

    SOL语句:select * from admin where username = ’ 'or 1=1 – ~~and password = '用户输入的密码’~~其中or 1=1 永远为真, --注释后边内容不再执行,因此SQL语句执行会返回admin表中的所有内容。

    后台登陆万能密码

    (1)Asp/Aspx万能密码:
    1."or “a”="a
    2.“or”="a’=‘a
    3. ‘)or(‘a’=‘a
    4.or 1=1–
    5.a’or’ 1=1–
    6.“or”="a’=‘a
    7.‘or’’=’
    8. 1 or ‘1’=‘1’=1
    9. 1 or ‘1’=‘1’ or 1=1
    10. 'OR 1=1%00
    11. "or 1=1%00
    12.‘xor
    13.admin’ or ‘a’='a 密码随便
    14.‘or’=‘or’
    15.‘or 1=1–
    16.’'or 1=1–
    17.‘or’a’='a
    ————————————————
    版权声明:本文为CSDN博主「lizhengnanhua」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/lizhengnanhua/article/details/39119095
    (2)PHP万能密码:

    1. ’or’=‘or’
    2. 'or 1=1/* 字符型 GPC是否开都可以使用
      原文链接:https://blog.csdn.net/lizhengnanhua/article/details/39119095
    展开全文
  • Web前端攻防

    2015-10-14 15:18:46
    Web前端攻防

    0x00 禁止一切外链资源


    外链会产生站外请求,因此可以被利用实施 CSRF 攻击。

    目前国内有大量路由器存在 CSRF 漏洞,其中相当部分用户使用默认的管理账号。通过外链图片,即可发起对路由器 DNS 配置的修改,这将成为国内互联网最大的安全隐患。

    案例演示

    百度旅游在富文本过滤时,未考虑标签的 style 属性,导致允许用户自定义的 CSS。因此可以插入站外资源:

    enter image description here

    所有浏览该页面的用户,都能发起任意 URL 的请求:

    enter image description here

    由于站外服务器完全不受控制,攻击者可以控制返回内容: 如果检测到是管理员,或者外链检查服务器,可以返回正常图片; 如果是普通用户,可以返回 302 重定向到其他 URL,发起 CSRF 攻击。例如修改路由器 DNS:

    http://admin:admin@192.168.1.1/userRpm/PPPoECfgAdvRpm.htm?wan=0&lcpMru=1480&ServiceName=&AcName=&EchoReq=0&manual=2&dnsserver=黑客服务器&dnsserver2=4.4.4.4&downBandwidth=0&upBandwidth=0&Save=%B1%A3+%B4%E6&Advanced=Advanced
    

    enter image description here

    演示中,随机测试了几个帖子,在两天时间里收到图片请求 500 多次,已有近 10 个不同的 IP 开始向我们发起 DNS 查询。

    enter image description here

    通过中间人代理,用户的所有隐私都能被捕捉到。还有更严重的后果,查考流量劫持危害探讨

    要是在热帖里『火前留名』,那么数量远不止这些。

    如果使用发帖脚本批量回复,将有数以万计的用户网络被劫持。

    防范措施

    杜绝用户的一切外链资源。需要站外图片,可以抓回后保存在站内服务器里。 对于富文本内容,使用白名单策略,只允许特定的 CSS 属性。 尽可能开启 Content Security Policy 配置,让浏览器底层来实现站外资源的拦截。

    0x01 富文本前端扫描


    富文本是 XSS 的重灾区。

    富文本的实质是一段 HTML 字符。由于历史原因,HTML 兼容众多不规范的用法,导致过滤起来较复杂。几乎所有使用富文本的产品,都曾出现过 XSS 注入。

    案例演示

    旅游发帖支持富文本,我们继续刚才的演示。

    enter image description here

    由于之前已修复过几次,目前只能注入 embed 标签和 src 属性。 但即使这样,仍然可以嵌入一个框架页面:

    enter image description here

    因为是非同源执行的 XSS,所以无法获取主页面的信息。但是可以修改 top.location,将页面跳转到第三方站点。

    将原页面嵌入到全屏的 iframe 里,伪造出相同的界面。然后通过浮层登录框,进行钓鱼。

    enter image description here

    总之,富文本中出现可执行的元素,页面安全性就大打折扣了。

    防范措施

    这里不考虑后端的过滤方法,讲解使用前端预防方案: 无论攻击者使用各种取巧的手段,绕过后端过滤,但这些 HTML 字符最终都要在前端构造成元素,并渲染出来。

    因此可以在 DOM 构造之后、渲染之前,对离屏的元素进行风险扫描。将可执行的元素(script,iframe,frame,object,embed,applet)从缓存中移除。

    或者给存在风险的元素,加上沙箱隔离属性。

    例如 iframe 加上 sandbox 属性,即可只显示框架内容而不运行脚本 例如 Flash 加上 allowScriptAccess 及 allowNetworking,也能起到一定的隔离作用。

    DOM 仅仅被构造是不会执行的,只有添加到主节点被渲染时才会执行。所以这个过程中间,可以实施安全扫描。

    实现细节可以参考:http://www.etherdream.com/FunnyScript/richtextsaferender.html

    如果富文本是直接输入到静态页面里的,可以考虑使用 MutationEvent 进行防御。详细参考:http://fex.baidu.com/blog/2014/06/xss-frontend-firewall-2/

    但推荐使用动态方式进行渲染,可扩展性更强,并且性能消耗最小。

    0x02 跳转 opener 钓鱼


    浏览器提供了一个 opener 属性,供弹出的窗口访问来源页。但该规范设计的并不合理,导致通过超链接打开的页面,也能使用 opener。

    因此,用户点了网站里的超链接,导致原页面被打开的第三方页面控制。

    虽然两者受到同源策略的限制,第三方无法访问原页面内容,但可以跳转原页面。

    由于用户的焦点在新打开的页面上,所以原页面被悄悄跳转,用户难以觉察到。当用户切回原页面时,其实已经在另一个钓鱼网站上了。

    案例演示

    百度贴吧目前使用的超链接,就是在新窗口中弹出,因此同样存在该缺陷。

    攻击者发一个吸引用户的帖子。当用户进来时,引诱他们点击超链接。

    通常故意放少部分的图片,或者是不会动的动画,先让用户预览一下。要是用户想看完整的,就得点下面的超链接:

    enter image description here

    由于扩展名是 gif 等图片格式,大多用户就毫无顾虑的点了。

    事实上,真正的类型是由服务器返回的 MIME 决定的。所以这个站外资源完全有可能是一个网页:

    enter image description here

    当用户停留在新页面里看动画时,隐匿其中的脚本已悄悄跳转原页面了。

    用户切回原页面时,其实已在一个钓鱼网站上:

    enter image description here

    在此之上,加些浮层登录框等特效,很有可能钓到用户的一些账号信息。

    防范措施

    该缺陷是因为 opener 这个属性引起的,所以得屏蔽掉新页面的这个属性。

    但通过超链接打开的网页,无法被脚本访问到。只有通过 window.open 弹出的窗口,才能获得其对象。

    所以,对页面中的用户发布的超链接,监听其点击事件,阻止默认的弹窗行为,而是用 window.open 代替,并将返回窗体的 opener 设置为 null,即可避免第三方页面篡改了。

    详细实现参考:http://www.etherdream.com/FunnyScript/opener_protect.html

    当然,实现中无需上述 Demo 那样复杂。根据实际产品线,只要监听用户区域的超链接就可以。

    0x03 用户内容权限


    支持自定义装扮的场合,往往是钓鱼的高发区。

    一些别有用心者,利用装扮来模仿系统界面,引诱用户上钩。

    案例演示 - 空间越界

    百度空间允许用户撰写自定格式的内容。

    其本质是一个富文本编辑器,这里不演示 XSS 漏洞,而是利用样式装扮,伪装一个钓鱼界面。

    百度空间富文本过滤元素、部分属性及 CSS 样式,但未对 class 属性启用白名单,因此可以将页面上所有的 CSS 类样式,应用到自己的内容上来。

    enter image description here

    防范措施

    规定用户内容尺寸限制,可以在提交时由用户自己确定。

    不应该为用户的内容分配无限的尺寸空间,以免恶意用户设置超大字体,破坏整个页面的浏览。

    最好将用户自定义的内容嵌套在 iframe 里,以免影响到页面其他部位。

    如果必须在同页面,应将用户内容所在的容器,设置超过部分不可见。以免因不可预测的 BUG,导致用户能将内容越界到产品界面上。

    案例演示 - 功能越界

    自定义装扮通常支持站外超链接。

    相比贴吧这类简单纯文字,富文本可以将超链接设置在其他元素上,例如图片。

    因此这类链接非常具有迷惑性,用户不经意间就点击到。很容易触发之前提到的修改 opener 钓鱼。

    enter image description here

    如果在图片内容上进行伪装,更容易让用户触发一些危险操作。

    enter image description here

    要是和之前的区域越界配合使用,迷惑性则更强:

    enter image description here

    enter image description here

    防范措施

    和之前一样,对于用户提供的超链接,在点击时进行扫描。如果是站外地址,则通过后台跳转进入,以便后端对 URL 进行安全性扫描。

    如果服务器检测到是一个恶意网站,或者目标资源是可执行文件,应给予用户强烈的警告,告知其风险。

    0x04 点击劫持检测


    点击劫持算是比较老的攻击方式了,基本原理大家也都听说过。就是在用户不知情的前提下,点击隐藏框架页面里的按钮,触发一些重要操作。

    但目前在点击劫持上做防御的并不多,包括百度绝大多数产品线目前都未考虑。

    案例演示

    能直接通过点击完成的操作,比较有意义的就是关注某用户。例如百度贴吧加关注的按钮:

    enter image description here

    攻击者事先算出目标按钮的尺寸和坐标,将页面嵌套在自己框架里,并设置框架的偏移,最终只显示按钮:

    enter image description here

    接着通过 CSS 样式,将目标按钮放大,占据整个页面空间,并设置全透明。

    enter image description here

    这时虽看不到按钮,但点击页面任意位置,都能触发框架页中加关注按钮的点击:

    enter image description here

    防范措施

    事实上,点击劫持是很好防御的。

    因为自身页面被嵌套在第三方页面里,只需判断 self == top 即可获知是否被嵌套。

    对一些重要的操作,例如加关注、删帖等,应先验证是否被嵌套。如果处于第三方页面的框架里,应弹出确认框提醒用户。

    确认框的坐标位置最好有一定的随机偏移,从而使攻击者构造的点击区域失效。

    展开全文
  • web常见攻防

    2019-03-14 11:57:49
    博主早年从事web安全相关的工作,近日得闲,简单梳理几个常见的web安全问题。 XSS 首先说下最常见的 XSS 漏洞,XSS (Cross Site Script),跨站脚本攻击,因为缩写和 CSS (Cascading Style Sheets) 重叠,所以只能...

    背景

    博主早年从事web安全相关的工作,近日得闲,简单梳理几个常见的web安全问题。

    XSS

    首先说下最常见的 XSS 漏洞,XSS (Cross Site Script),跨站脚本攻击,因为缩写和 CSS (Cascading Style Sheets) 重叠,所以只能叫 XSS。

    XSS 的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。XSS 的攻击方式千变万化,但还是可以大致细分为几种类型。

    非持久型 XSS

    非持久型 XSS 漏洞,也叫反射型 XSS 漏洞,一般是通过给别人发送带有恶意脚本代码参数的 URL,当 URL 地址被打开时,特有的恶意代码参数被 HTML 解析、执行。
    非持久型 XSS

    1.jpeg

    举一个例子,比如你的 Web 页面中包含有以下代码:

    Select your language:
    <select>
        <script>
            document.write(''
                + '<option value=1>'
                +     location.href.substring(location.href.indexOf('default=') + 8)
                + '</option>'
            );
            document.write('<option value=2>English</option>');
        </script>
    </select>
    

    攻击者可以直接通过 URL

    类似:https://xx.com/xx?default=<script>alert(document.cookie)</script>)
    

    注入可执行的脚本代码。

    非持久型 XSS 漏洞攻击有以下几点特征:

    即时性,不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击,拿到用户隐私数据。
    攻击者需要诱骗点击
    反馈率低,所以较难发现和响应修复
    盗取用户敏感保密信息

    为了防止出现非持久型 XSS 漏洞,需要确保这么几件事情:

    Web 页面渲染的所有内容或者渲染的数据都必须来自于服务端。
    尽量不要从 URL,document.referrer,document.forms 等这种 DOM API 中获取数据直接渲染。
    尽量不要使用 eval, new Function(),document.write(),document.writeln(),window.setInterval(),window.setTimeout(),innerHTML,document.creteElement() 等可执行字符串的方法。
    如果做不到以上几点,也必须对涉及 DOM 渲染的方法传入的字符串参数做 escape 转义。
    前端渲染的时候对任何的字段都需要做 escape 转义编码。
    escape 转义的目的是将一些构成 HTML 标签的元素转义,比如 <,>,空格 等,转义成 <,>,  等显示转义字符。有很多开源的工具可以协助我们做 escape 转义。

    持久型 XSS

    持久型 XSS 漏洞,也被称为存储型 XSS 漏洞,一般存在于 Form 表单提交等交互功能,如发帖留言,提交文本信息等,黑客利用的 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行。

    主要注入页面方式和非持久型 XSS 漏洞类似,只不过持久型的不是来源于 URL,refferer,forms 等,而是来源于后端从数据库中读出来的数据。持久型 XSS 攻击不需要诱骗点击,黑客只需要在提交表单的地方完成注入即可,但是这种 XSS 攻击的成本相对还是很高。攻击成功需要同时满足以下几个条件:

    POST 请求提交表单后端没做转义直接入库。
    后端从数据库中取出数据没做转义直接输出给前端。
    前端拿到后端数据没做转义直接渲染成 DOM。

    持久型 XSS 有以下几个特点:

    持久性,植入在数据库中
    危害面广,甚至可以让用户机器变成 DDoS 攻击的肉鸡。
    盗取用户敏感私密信息

    为了防止持久型 XSS 漏洞,需要前后端共同努力:

    后端在入库前应该选择不相信任何前端数据,将所有的字段统一进行转义处理。
    后端在输出给前端数据统一进行转义处理。
    前端在渲染页面 DOM 的时候应该选择不相信任何后端数据,任何字段都需要做转义处理。

    基于字符集的 XSS

    其实现在很多的浏览器以及各种开源的库都专门针对了 XSS 进行转义处理,尽量默认抵御绝大多数 XSS 攻击,但是还是有很多方式可以绕过转义规则,让人防不胜防。比如「基于字符集的 XSS 攻击」就是绕过这些转义处理的一种攻击方式,比如有些 Web 页面字符集不固定,用户输入非期望字符集的字符,有时会绕过转义过滤规则。

    以基于 utf-7 的 XSS 为例
    utf-7 是可以将所有的 unicode 通过 7bit 来表示的一种字符集 (但现在已经从 Unicode 规格中移除)。
    这个字符集为了通过 7bit 来表示所有的文字, 除去数字和一部分的符号,其它的部分将都以 base64 编码为基础的方式呈现。

    <script>alert("xss")</script>
    可以被解释为:
    +ADw-script+AD4-alert(+ACI-xss+ACI-)+ADw-/script+AD4-
    

    可以形成「基于字符集的 XSS 攻击」的原因是由于浏览器在 meta 没有指定 charset 的时候有自动识别编码的机制,所以这类攻击通常就是发生在没有指定或者没来得及指定 meta 标签的 charset 的情况下。

    所以我们有什么办法避免这种 XSS 呢?

    记住指定
    XML 中不仅要指定字符集为 utf-8,而且标签要闭合
    牛文推荐:http://drops.wooyun.org/papers/1327 (这个讲的很详细)

    基于 Flash 的跨站 XSS

    基于 Flash 的跨站 XSS 也是属于反射型 XSS 的一种,虽然现在开发 ActionScript 的产品线几乎没有了,但还是提一句吧,AS 脚本可以接受用户输入并操作 cookie,攻击者可以配合其他 XSS(持久型或者非持久型)方法将恶意 swf 文件嵌入页面中。主要是因为 AS 有时候需要和 JS 传参交互,攻击者会通过恶意的 XSS 注入篡改参数,窃取并操作cookie。

    避免方法:

    严格管理 cookie 的读写权限
    对 Flash 能接受用户输入的参数进行过滤 escape 转义处理

    未经验证的跳转 XSS

    有一些场景是后端需要对一个传进来的待跳转的 URL 参数进行一个 302 跳转,可能其中会带有一些用户的敏感(cookie)信息。如果服务器端做302 跳转,跳转的地址来自用户的输入,攻击者可以输入一个恶意的跳转地址来执行脚本。

    这时候需要通过以下方式来防止这类漏洞:

    对待跳转的 URL 参数做白名单或者某种规则过滤
    后端注意对敏感信息的保护, 比如 cookie 使用来源验证。

    CSRF

    CSRF(Cross-Site Request Forgery),中文名称:跨站请求伪造攻击

    那么 CSRF 到底能够干嘛呢?你可以这样简单的理解:攻击者可以盗用你的登陆信息,以你的身份模拟发送各种请求。攻击者只要借助少许的社会工程学的诡计,例如通过 QQ 等聊天软件发送的链接(有些还伪装成短域名,用户无法分辨),攻击者就能迫使 Web 应用的用户去执行攻击者预设的操作。例如,当用户登录网络银行去查看其存款余额,在他没有退出时,就点击了一个 QQ 好友发来的链接,那么该用户银行帐户中的资金就有可能被转移到攻击者指定的帐户中。

    所以遇到 CSRF 攻击时,将对终端用户的数据和操作指令构成严重的威胁。当受攻击的终端用户具有管理员帐户的时候,CSRF 攻击将危及整个 Web 应用程序。
    CSRF 原理

    下图大概描述了 CSRF 攻击的原理,可以理解为有一个小偷在你配钥匙的地方得到了你家的钥匙,然后拿着要是去你家想偷什么偷什么。

    csrf原理

    2.png

    完成 CSRF 攻击必须要有三个条件:

    用户已经登录了站点 A,并在本地记录了 cookie
    在用户没有登出站点 A 的情况下(也就是 cookie 生效的情况下),访问了恶意攻击者提供的引诱危险站点 B (B 站点要求访问站点A)。
    站点 A 没有做任何 CSRF 防御

    你也许会问:「如果我不满足以上三个条件中的任意一个,就不会受到 CSRF 的攻击」。其实可以这么说的,但你不能保证以下情况不会发生:

    你不能保证你登录了一个网站后,不再打开一个 tab 页面并访问另外的网站,特别现在浏览器都是支持多 tab 的。
    你不能保证你关闭浏览器了后,你本地的 cookie 立刻过期,你上次的会话已经结束。
    上图中所谓的攻击网站 B,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

    预防 CSRF

    CSRF 的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的 CSRF 防御也都在服务端进行。服务端的预防 CSRF 攻击的方式方法有多种,但思路上都是差不多的,主要从以下两个方面入手:

    正确使用 GET,POST 请求和 cookie
    在非 GET 请求中增加 token

    一般而言,普通的 Web 应用都是以 GET、POST 请求为主,还有一种请求是 cookie 方式。我们一般都是按照如下规则设计应用的请求:

    GET 请求常用在查看,列举,展示等不需要改变资源属性的时候(数据库 query 查询的时候)
    POST 请求常用在 From 表单提交,改变一个资源的属性或者做其他一些事情的时候(数据库有 insert、update、delete 的时候)

    当正确的使用了 GET 和 POST 请求之后,剩下的就是在非 GET 方式的请求中增加随机数,这个大概有三种方式来进行:

    为每个用户生成一个唯一的 cookie token,所有表单都包含同一个伪随机值,这种方案最简单,因为攻击者不能获得第三方的 cookie(理论上),所以表单中的数据也就构造失败,但是由于用户的 cookie 很容易由于网站的 XSS 漏洞而被盗取,所以这个方案必须要在没有 XSS 的情况下才安全。

    每个 POST 请求使用验证码,这个方案算是比较完美的,但是需要用户多次输入验证码,用户体验比较差,所以不适合在业务中大量运用。

    渲染表单的时候,为每一个表单包含一个 csrfToken,提交表单的时候,带上 csrfToken,然后在后端做 csrfToken 验证。

    CSRF 的防御可以根据应用场景的不同自行选择。CSRF 的防御工作确实会在正常业务逻辑的基础上带来很多额外的开发量,但是这种工作量是值得的,毕竟用户隐私以及财产安全是产品最基础的根本。

    SQL 注入

    SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。

    而造成 SQL 注入的原因是因为程序没有有效的转义过滤用户的输入,使攻击者成功的向服务器提交恶意的 SQL 查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。

    很多 Web 开发者没有意识到 SQL 查询是可以被篡改的,从而把 SQL 查询当作可信任的命令。殊不知,SQL 查询是可以绕开访问控制,从而绕过身份验证和权限检查的。更有甚者,有可能通过 SQL 查询去运行主机系统级的命令。

    SQL 注入原理

    下面将通过一些真实的例子来详细讲解 SQL 注入的方式的原理。

    考虑以下简单的管理员登录表单:

    <form action="/login" method="POST">
        <p>Username: <input type="text" name="username" /></p>
        <p>Password: <input type="password" name="password" /></p>
        <p><input type="submit" value="登陆" /></p>
    </form>
    

    后端的 SQL 语句可能是如下这样的:

    let querySQL = `
        SELECT *
        FROM user
        WHERE username='${username}'
        AND psw='${password}'
    `;
    

    // 接下来就是执行 sql 语句…

    目的就是来验证用户名和密码是不是正确,按理说乍一看上面的 SQL 语句也没什么毛病,确实是能够达到我们的目的,可是你只是站在用户会老老实实按照你的设计来输入的角度来看问题,如果有一个恶意攻击者输入的用户名是 zoumiaojiang’ OR 1 = 1 --,密码随意输入,就可以直接登入系统了。WFT!

    冷静下来思考一下,我们之前预想的真实 SQL 语句是:

    
    SELECT * FROM user WHERE username='zoumiaojiang' AND psw='mypassword'
    

    可以恶意攻击者的奇怪用户名将你的 SQL 语句变成了如下形式:

    
    SELECT * FROM user WHERE username='zoumiaojiang' OR 1 = 1 --' AND psw='xxxx'
    

    在 SQL 中,-- 是注释后面的内容的意思,所以查询语句就变成了:

    
    SELECT * FROM user WHERE username='zoumiaojiang' OR 1 = 1
    

    这条 SQL 语句的查询条件永远为真,所以意思就是恶意攻击者不用我的密码,就可以登录进我的账号,然后可以在里面为所欲为,然而这还只是最简单的注入,牛逼的 SQL 注入高手甚至可以通过 SQL 查询去运行主机系统级的命令,将你主机里的内容一览无余,这里我也没有这个能力讲解的太深入,毕竟不是专业研究这类攻击的,但是通过以上的例子,已经了解了 SQL 注入的原理,我们基本已经能找到防御 SQL 注入的方案了。

    如何预防 SQL 注入

    防止 SQL 注入主要是不能允许用户输入的内容影响正常的 SQL 语句的逻辑,当用户的输入的信息将要用来拼接 SQL 语句的话,我们应该永远选择不相信,任何内容都必须进行转义过滤,当然做到这个还是不够的,下面列出防御 SQL 注入的几点注意事项:

    严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害

    后端代码检查输入的数据是否符合预期,严格限制变量的类型,例如使用正则表达式进行一些匹配处理。

    对进入数据库的特殊字符(’,",\,<,>,&,*,; 等)进行转义处理,或编码转换。基本上所有的后端语言都有对字符串进行转义处理的方法,比如 lodash 的 lodash._escapehtmlchar 库。

    所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中,即不要直接拼接 SQL 语句。例如 Node.js 中的 mysqljs 库的 query 方法中的 ? 占位参数。

    
    mysql.query(`SELECT * FROM user WHERE username = ? AND psw = ?`, [username, psw]);
    

    在应用发布之前建议使用专业的 SQL 注入检测工具进行检测,以及时修补被发现的 SQL 注入漏洞。网上有很多这方面的开源工具,例如 sqlmap、SQLninja 等。

    避免网站打印出 SQL 错误信息,比如类型错误、字段不匹配等,把代码里的 SQL 语句暴露出来,以防止攻击者利用这些错误信息进行 SQL 注入。

    不要过于细化返回的错误信息,如果目的是方便调试,就去使用后端日志,不要在接口上过多的暴露出错信息,毕竟真正的用户不关心太多的技术细节,只要话术合理就行。

    碰到要操作的数据库的代码,一定要慎重,小心使得万年船,多找几个人多来几次 code review,将问题都暴露出来,而且要善于利用工具,操作数据库相关的代码属于机密,没事不要去各种论坛晒自家站点的 SQL 语句,万一被人盯上了呢?

    命令行注入

    命令行注入漏洞,指的是攻击者能够通过 HTTP 请求直接侵入主机,执行攻击者预设的 shell 命令,听起来好像匪夷所思,这往往是 Web 开发者最容易忽视但是却是最危险的一个漏洞之一,看一个实例:

    假如现在需要实现一个需求:用户提交一些内容到服务器,然后在服务器执行一些系统命令去产出一个结果返回给用户,接口的部分实现如下:

    
    // 以 Node.js 为例,假如在接口中需要从 github 下载用户指定的 repo
    const exec = require('mz/child_process').exec;
    let params = {/* 用户输入的参数 */};
    
    exec(`git clone ${params.repo} /some/path`);
    

    这段代码确实能够满足业务需求,正常的用户也确实能从指定的 git repo 上下载到想要的代码,可是和 SQL 注入一样,这段代码在恶意攻击者眼中,简直就是香饽饽。

    如果 params.repo 传入的是 https://github.com/zoumiaojiang/zoumiaojiang.github.io.git 当然没问题了。
    可是如果 params.repo 传入的是 https://github.com/xx/xx.git && rm -rf /* && 恰好你的服务是用 root 权限起的就惨了。

    具体恶意攻击者能用命令行注入干什么也像 SQL 注入一样,手法是千变万化的,比如「反弹 shell 注入」等,但原理都是一样的,我们绝对有能力防止命令行注入发生。防止命令行注入需要做到以下几件事情:

    后端对前端提交内容需要完全选择不相信,并且对其进行规则限制(比如正则表达式)。
    在调用系统命令前对所有传入参数进行命令行参数转义过滤。
    不要直接拼接命令语句,借助一些工具做拼接、转义预处理,例如 Node.js 的 shell-escape npm 包。

    还是前面的例子,我们可以做到如下:

    const exec = require('mz/child_process').exec;
    // 借助 shell-escape npm 包解决参数转义过滤问题
    const shellescape = require('shell-escape');
    
    let params = {/* 用户输入的参数 */};
    
    // 先过滤一下参数,让参数符合预期
    if (!/正确的表达式/.test(params.repo)) {
        return;
    }
    
    let cmd = shellescape([
        'git',
        'clone',
        params.repo,
        '/some/path'
    ]);
    
    // cmd 的值: git clone 'https://github.com/xx/xx.git && rm -rf / &&' /some/path
    // 这样就不会被注入成功了。
    exec(cmd);
    

    DDoS 攻击

    DDoS 又叫分布式拒绝服务,全称 Distributed Denial of Service,其原理就是利用大量的请求造成资源过载,导致服务不可用,这个攻击应该不能算是安全问题,这应该算是一个另类的存在,因为这种攻击根本就是耍流氓的存在,「伤敌一千,自损八百」的行为。出于保护 Web App 不受攻击的攻防角度,还是介绍一下 DDoS 攻击吧,毕竟也是挺常见的。

    DDoS 攻击可以理解为:「你开了一家店,隔壁家点看不惯,就雇了一大堆黑社会人员进你店里干坐着,也不消费,其他客人也进不来,导致你营业惨淡」。为啥说 DDoS 是个「伤敌一千,自损八百」的行为呢?毕竟隔壁店还是花了不少钱雇黑社会但是啥也没得到不是?DDoS 攻击的目的基本上就以下几个:

    深仇大恨,就是要干死你
    敲诈你,不给钱就干你
    忽悠你,不买我防火墙服务就会有“人”继续干你

    也许你的站点遭受过 DDoS 攻击,具体什么原因怎么解读见仁见智。DDos 攻击从层次上可分为网络层攻击与应用层攻击,从攻击手法上可分为快型流量攻击与慢型流量攻击,但其原理都是造成资源过载,导致服务不可用。

    网络层 DDoS

    网络层 DDos 攻击包括 SYN Flood、ACK Flood、UDP Flood、ICMP Flood 等。

    SYN Flood 攻击

    SYN flood 攻击主要利用了 TCP 三次握手过程中的 Bug,我们都知道 TCP 三次握手过程是要建立连接的双方发送 SYN,SYN + ACK,ACK 数据包,而当攻击方随意构造源 IP 去发送 SYN 包时,服务器返回的 SYN + ACK 就不能得到应答(因为 IP 是随意构造的),此时服务器就会尝试重新发送,并且会有至少 30s 的等待时间,导致资源饱和服务不可用,此攻击属于慢型 DDoS 攻击。

    ACK Flood 攻击

    ACK Flood 攻击是在 TCP 连接建立之后,所有的数据传输 TCP 报文都是带有 ACK 标志位的,主机在接收到一个带有 ACK 标志位的数据包的时候,需要检查该数据包所表示的连接四元组是否存在,如果存在则检查该数据包所表示的状态是否合法,然后再向应用层传递该数据包。如果在检查中发现该数据包不合法,例如该数据包所指向的目的端口在本机并未开放,则主机操作系统协议栈会回应 RST 包告诉对方此端口不存在。

    UDP Flood 攻击

    UDP flood 攻击是由于 UDP 是一种无连接的协议,因此攻击者可以伪造大量的源 IP 地址去发送 UDP 包,此种攻击属于大流量攻击。正常应用情况下,UDP 包双向流量会基本相等,因此发起这种攻击的攻击者在消耗对方资源的时候也在消耗自己的资源。

    ICMP Flood 攻击

    ICMP Flood 攻击属于大流量攻击,其原理就是不断发送不正常的 ICMP 包(所谓不正常就是 ICMP 包内容很大),导致目标带宽被占用,但其本身资源也会被消耗。目前很多服务器都是禁 ping 的(在防火墙在可以屏蔽 ICMP 包),因此这种攻击方式已经落伍。

    网络层 DDoS 防御

    网络层的 DDoS 攻击究其本质其实是无法防御的,我们能做得就是不断优化服务本身部署的网络架构,以及提升网络带宽。当然,还是做好以下几件事也是有助于缓解网络层 DDoS 攻击的冲击:

    网络架构上做好优化,采用负载均衡分流。
    确保服务器的系统文件是最新的版本,并及时更新系统补丁。
    添加抗 DDos 设备,进行流量清洗。
    限制同时打开的 SYN 半连接数目,缩短 SYN 半连接的 Timeout 时间。
    限制单 IP 请求频率。
    防火墙等防护设置禁止 ICMP 包等。
    严格限制对外开放的服务器的向外访问。
    运行端口映射程序或端口扫描程序,要认真检查特权端口和非特权端口。
    关闭不必要的服务。
    认真检查网络设备和主机/服务器系统的日志。只要日志出现漏洞或是时间变更,那这台机器就可能遭到了攻击。
    限制在防火墙外与网络文件共享。这样会给黑客截取系统文件的机会,主机的信息暴露给黑客,无疑是给了对方入侵的机会。
    加钱堆机器。。
    报警。。

    应用层 DDoS

    应用层 DDoS 攻击不是发生在网络层,是发生在 TCP 建立握手成功之后,应用程序处理请求的时候,现在很多常见的 DDoS 攻击都是应用层攻击。应用层攻击千变万化,目的就是在网络应用层耗尽你的带宽,下面列出集中典型的攻击类型。

    CC 攻击

    当时绿盟为了防御 DDoS 攻击研发了一款叫做 Collapasar 的产品,能够有效的防御 SYN Flood 攻击。黑客为了挑衅,研发了一款 Challenge Collapasar 攻击工具(简称 CC)。

    CC 攻击的原理,就是针对消耗资源比较大的页面不断发起不正常的请求,导致资源耗尽。因此在发送 CC 攻击前,我们需要寻找加载比较慢,消耗资源比较多的网页,比如需要查询数据库的页面、读写硬盘文件的等。通过 CC 攻击,使用爬虫对某些加载需要消耗大量资源的页面发起 HTTP 请求。

    DNS Flood

    DNS Flood 攻击采用的方法是向被攻击的服务器发送大量的域名解析请求,通常请求解析的域名是随机生成或者是网络世界上根本不存在的域名,被攻击的DNS 服务器在接收到域名解析请求的时候首先会在服务器上查找是否有对应的缓存,如果查找不到并且该域名无法直接由服务器解析的时候,DNS 服务器会向其上层 DNS 服务器递归查询域名信息。域名解析的过程给服务器带来了很大的负载,每秒钟域名解析请求超过一定的数量就会造成 DNS 服务器解析域名超时。

    根据微软的统计数据,一台 DNS 服务器所能承受的动态域名查询的上限是每秒钟 9000 个请求。而我们知道,在一台 P3 的 PC 机上可以轻易地构造出每秒钟几万个域名解析请求,足以使一台硬件配置极高的 DNS 服务器瘫痪,由此可见 DNS 服务器的脆弱性。

    HTTP 慢速连接攻击

    针对 HTTP 协议,先建立起 HTTP 连接,设置一个较大的 Conetnt-Length,每次只发送很少的字节,让服务器一直以为 HTTP 头部没有传输完成,这样连接一多就很快会出现连接耗尽。

    应用层 DDoS 防御

    判断 User-Agent 字段(不可靠,因为可以随意构造)
    针对 IP + cookie,限制访问频率(由于 cookie 可以更改,IP 可以使用代理,或者肉鸡,也不可靠)
    关闭服务器最大连接数等,合理配置中间件,缓解 DDoS 攻击。
    请求中添加验证码,比如请求中有数据库操作的时候。
    编写代码时,尽量实现优化,并合理使用缓存技术,减少数据库的读取操作。
    加钱堆机器。。
    报警。。

    应用层的防御有时比网络层的更难,因为导致应用层被 DDoS 攻击的因素非常多,有时往往是因为程序员的失误,导致某个页面加载需要消耗大量资源,有时是因为中间件配置不当等等。而应用层 DDoS 防御的核心就是区分人与机器(爬虫),因为大量的请求不可能是人为的,肯定是机器构造的。因此如果能有效的区分人与爬虫行为,则可以很好地防御此攻击。

    其他 DDoS 攻击

    发起 DDoS 也是需要大量的带宽资源的,但是互联网就像森林,林子大了什么鸟都有,DDoS 攻击者也能找到其他的方式发起廉价并且极具杀伤力的 DDoS 攻击。

    利用 XSS

    举个例子,如果 12306 页面有一个 XSS 持久型漏洞被恶意攻击者发现,只需在春节抢票期间在这个漏洞中执行脚本使得往某一个小站点随便发点什么请求,然后随着用户访问的增多,感染用户增多,被攻击的站点自然就会迅速瘫痪了。这种 DDoS 简直就是无本万利,不用惊讶,现在大站有 XSS 漏洞的不要太多。

    来自 P2P 网络攻击

    大家都知道,互联网上的 P2P 用户和流量都是一个极为庞大的数字。如果他们都去一个指定的地方下载数据,成千上万的真实 IP 地址连接过来,没有哪个设备能够支撑住。拿 BT 下载来说,伪造一些热门视频的种子,发布到搜索引擎,就足以骗到许多用户和流量了,但是这只是基础攻击。
    高级的 P2P 攻击,是直接欺骗资源管理服务器。如迅雷客户端会把自己发现的资源上传到资源管理服务器,然后推送给其它需要下载相同资源的用户,这样,一个链接就发布出去。通过协议逆向,攻击者伪造出大批量的热门资源信息通过资源管理中心分发出去,瞬间就可以传遍整个 P2P 网络。更为恐怖的是,这种攻击是无法停止的,即使是攻击者自身也无法停止,攻击一直持续到 P2P 官方发现问题更新服务器且下载用户重启下载软件为止。

    最后总结下,DDoS 不可能防的住,就好比你的店只能容纳 50 人,黑社会有 100 人,你就换一家大店,能容纳 500 人,然后黑社会又找来了 1000 人,这种堆人头的做法就是 DDoS 本质上的攻防之道,「道高一尺,魔高一丈,魔高一尺,道高一丈」,讲真,必要的时候就答应勒索你的人的条件吧,实在不行就报警吧。

    流量劫持

    流量劫持应该算是黑产行业的一大经济支柱了吧?简直是让人恶心到吐,不吐槽了,还是继续谈干货吧,流量劫持基本分两种:DNS 劫持 和 HTTP 劫持,目的都是一样的,就是当用户访问 zoumiaojiang.com 的时候,给你展示的并不是或者不完全是 zoumiaojiang.com 提供的 “内容”。

    DNS 劫持

    DNS 劫持,也叫做域名劫持,可以这么理解,「你打了一辆车想去商场吃饭,结果你打的车是小作坊派来的,直接给你拉到小作坊去了」,DNS 的作用是把网络地址域名对应到真实的计算机能够识别的 IP 地址,以便计算机能够进一步通信,传递网址和内容等。如果当用户通过某一个域名访问一个站点的时候,被篡改的 DNS 服务器返回的是一个恶意的钓鱼站点的 IP,用户就被劫持到了恶意钓鱼站点,然后继而会被钓鱼输入各种账号密码信息,泄漏隐私。
    dns劫持

    3.jpeg

    这类劫持,要不就是网络运营商搞的鬼,一般小的网络运营商与黑产勾结会劫持 DNS,要不就是电脑中毒,被恶意篡改了路由器的 DNS 配置,基本上做为开发者或站长却是很难察觉的,除非有用户反馈,现在升级版的 DNS 劫持还可以对特定用户、特定区域等使用了用户画像进行筛选用户劫持的办法,另外这类广告显示更加随机更小,一般站长除非用户投诉否则很难觉察到,就算觉察到了取证举报更难。无论如何,如果接到有 DNS 劫持的反馈,一定要做好以下几件事:

    取证很重要,时间、地点、IP、拨号账户、截屏、URL 地址等一定要有。
    可以跟劫持区域的电信运营商进行投诉反馈。
    如果投诉反馈无效,直接去工信部投诉,一般来说会加白你的域名。

    HTTP 劫持

    HTTP 劫持您可以这么理解,「你打了一辆车想去商场吃饭,结果司机跟你一路给你递小作坊的广告」,HTTP 劫持主要是当用户访问某个站点的时候会经过运营商网络,而不法运营商和黑产勾结能够截获 HTTP 请求返回内容,并且能够篡改内容,然后再返回给用户,从而实现劫持页面,轻则插入小广告,重则直接篡改成钓鱼网站页面骗用户隐私。能够实施流量劫持的根本原因,是 HTTP 协议没有办法对通信对方的身份进行校验以及对数据完整性进行校验。如果能解决这个问题,则流量劫持将无法轻易发生。所以防止 HTTP 劫持的方法只有将内容加密,让劫持者无法破解篡改,这样就可以防止 HTTP 劫持了。

    HTTPS 协议就是一种基于 SSL 协议的安全加密网络应用层协议,可以很好的防止 HTTP 劫持。这里有篇 文章 讲的不错。HTTPS 在这就不深讲了,后面有机会我会单独好好讲讲 HTTPS。如果不想站点被 HTTP 劫持,赶紧将你的站点全站改造成 HTTPS 吧。

    服务器漏洞

    服务器除了以上提到的那些大名鼎鼎的漏洞和臭名昭著的攻击以外,其实还有很多其他的漏洞,往往也很容易被忽视,在这个小节也稍微介绍几种。

    越权操作漏洞

    如果你的系统是有登录控制的,那就要格外小心了,因为很有可能你的系统越权操作漏洞,越权操作漏洞可以简单的总结为 「A 用户能看到或者操作 B 用户的隐私内容」,如果你的系统中还有权限控制就更加需要小心了。所以每一个请求都需要做 userid 的判断

    以下是一段有漏洞的后端示意代码:

    
    // ctx 为请求的 context 上下文
    let msgId = ctx.params.msgId;
    
    mysql.query(
        'SELECT * FROM msg_table WHERE msg_id = ?',
        [msgId]
    );
    

    以上代码是任何人都可以查询到任何用户的消息,只要有 msg_id 就可以,这就是比较典型的越权漏洞,需要如下这么改进一下:

    // ctx 为请求的 context 上下文
    let msgId = ctx.params.msgId;
    let userId = ctx.session.userId; // 从会话中取出当前登陆的 userId
    
    mysql.query(
        'SELECT * FROM msg_table WHERE msg_id = ? AND user_id = ?',
        [msgId, userId]
    );
    

    嗯,大概就是这个意思,如果有更严格的权限控制,那在每个请求中凡是涉及到数据库的操作都需要先进行严格的验证,并且在设计数据库表的时候需要考虑进 userId 的账号关联以及权限关联。

    目录遍历漏洞

    目录遍历漏洞指通过在 URL 或参数中构造 …/,./ 和类似的跨父目录字符串的 ASCII 编码、unicode 编码等,完成目录跳转,读取操作系统各个目录下的敏感文件,也可以称作「任意文件读取漏洞」。

    目录遍历漏洞原理:程序没有充分过滤用户输入的 …/ 之类的目录跳转符,导致用户可以通过提交目录跳转来遍历服务器上的任意文件。使用多个… 符号,不断向上跳转,最终停留在根 /,通过绝对路径去读取任意文件。

    目录遍历漏洞几个示例和测试,一般构造 URL 然后使用浏览器直接访问,或者使用 Web 漏洞扫描工具检测,当然也可以自写程序测试。

    http://somehost.com/../../../../../../../../../etc/passwd
    http://somehost.com/some/path?file=../../Windows/system.ini
    
    # 借助 %00 空字符截断是一个比较经典的攻击手法
    http://somehost.com/some/path?file=../../Windows/system.ini%00.js
    
    # 使用了 IIS 的脚本目录来移动目录并执行指令
    http://somehost.com/scripts/..%5c../Windows/System32/cmd.exe?/c+dir+c:\
    

    防御 方法就是需要对 URL 或者参数进行 …/,./ 等字符的转义过滤。

    物理路径泄漏

    物理路径泄露属于低风险等级缺陷,它的危害一般被描述为「攻击者可以利用此漏洞得到信息,来对系统进一步地攻击」,通常都是系统报错 500 的错误信息直接返回到页面可见导致的漏洞。得到物理路径有些时候它能给攻击者带来一些有用的信息,比如说:可以大致了解系统的文件目录结构;可以看出系统所使用的第三方软件;也说不定会得到一个合法的用户名(因为很多人把自己的用户名作为网站的目录名)。

    防止这种泄漏的方法就是做好后端程序的出错处理,定制特殊的 500 报错页面。

    源码暴露漏洞

    和物理路径泄露类似,就是攻击者可以通过请求直接获取到你站点的后端源代码,然后就可以对系统进一步研究攻击。那么导致源代码暴露的原因是什么呢?基本上就是发生在服务器配置上了,服务器可以设置哪些路径的文件才可以被直接访问的,这里给一个 koa 服务起的例子,正常的 koa 服务器可以通过 koa-static 中间件去指定静态资源的目录,好让静态资源可以通过路径的路由访问。比如你的系统源代码目录是这样的:

    |- project
        |- src
        |- static
        |- ...
    |- server.js
    

    你想要将 static 的文件夹配成静态资源目录,你应该会在 server.js 做如下配置:

    const Koa = require('koa');
    const serve = require('koa-static');
    const app = new Koa();
    app.use(serve(__dirname + '/project/static'));
    

    但是如果配错了静态资源的目录,可能就出大事了,比如:

    
    // ...
    app.use(serve(__dirname + '/project'));
    

    这样所有的源代码都可以通过路由访问到了,所有的服务器都提供了静态资源机制,所以在通过服务器配置静态资源目录和路径的时候,一定要注意检验,不然很可能产生漏洞。

    最后,希望 Web 开发者们能够管理好自己的代码隐私,注意代码安全问题,比如不要将产品的含有敏感信息的代码放到第三方外部站点或者暴露给外部用户,尤其是前端代码,私钥类似的保密性的东西不要直接输出在代码里或者页面中。也许还有很多值得注意的点,但是归根结底还是绷住安全那根弦,对待每一行代码都要多多推敲。

    请关注我的订阅号

    订阅号.png

    展开全文
  • Web安全攻防

    千次阅读 多人点赞 2018-04-11 15:39:49
    参考网址:【干货分享】Web安全漏洞深入分析及其安全编码常见 Web 安全攻防总结Web 安全入门之常见攻击来一张镇博图:安全无小事。1.XSS介绍:全英Cross Site Script,跨站脚本攻击。原理:攻击者在Web页面中插入...
  • 攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5063 百度 robots协议 robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,比如Windows...
  • Web攻防之SQL注入

    2015-04-22 22:31:38
    1.SQL注入  所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询... 它能够轻易的绕过防火墙直接访问数据库,甚至能够获得数据库所在的服务器的系统权限。在Web应用漏洞中,SQL Injection
  • WEB攻防必备视频教程(40课)

    千次阅读 2014-01-04 13:19:35
    WEB攻防必备视频教程演示所有站点都已经通知管理员,请勿拿视频中站以及国内计算机服务器进行破坏。   2014/01/04 10:39 29,179,838 1.渗透测试前言-地锅鸡-努力.zip 2014/01/04 10:39 29,992,320 10....
  • 摘要:对Web服务器的攻击也可以说是形形色色、种类繁多,常见的有挂马、SQL注入、缓冲区溢出、嗅探、利用IIS等针对Webserver漏洞进行攻击。本文结合WEB TOP10漏洞中常见的SQL注入,跨站脚本攻击(XSS),跨站请求伪造...
  • 常见web漏洞攻防杂谈

    2016-12-15 14:14:01
    做为一介码农,对那些常见的web漏洞,比如SQL注入...但是,近期公司有个web安全调研的项目,让我有机会对常见的web漏洞及攻防策略进行深入的了解并整理成册,我大概用了2个月的时间研读各类安全书籍,将其中的精华整理
  • 随着Web应用的高速发展和技术的不断成熟,对Web开发相关职位的需求量也越来越大,越来越多的人加入了Web开发的行列。但是由于程序员的水平参差不齐或是安全意识太低,很多程序员在编写代码时仅考虑了功能上的实现,...
  • f12查看系统,php版本 Github: site:Github password //github上查找敏感信息   8.真实IP CDN 判断CDN:  ping 如果网站前有cdn标识,则为cdn服务器  站长之家 看返回值 绕过CDN: ...
  •     CMS(内容管理系统),又称整站系统或文章系统。用于网站内容管理。用户只需要下载对应的 CMS 软件包,部署搭建,就可以直接利用 CMS,简单方便。但是各种 CMS 都具有其独特的结构命名规则和特定的文件内容...
  • 常见web安全攻防总结

    2020-07-14 15:30:19
    Web 安全的对于 Web 从业人员来说是一个非常重要的课题 , 所以在这里总结一下 Web 相关的安全攻防知识,希望以后不要再踩雷,也希望对看到这篇文章的同学有所帮助。今天这边文章主要的内容就是分析几种常见的攻击的...
  • 常见六大Web安全攻防解析

    千次阅读 多人点赞 2019-06-26 12:42:19
    前言 在互联网时代,数据安全与个人隐私受到了前所未有的挑战,各种新奇的攻击技术层出不穷。如何才能更好地保护我们的数据?本文主要侧重于分析几种常见...跨站脚本攻击是指通过存在安全漏洞的Web网站注册用户的浏...
  • 前提:A地为靶机,B为攻击机,防火墙布置在A连接外网处 1、在A地和B地的PC上分别安装好xhack工具,深圳的PC为靶机,长沙的PC为攻击机; 检测xhack连通性(靶机映射地址) 2、在A的AF上配置用户和业务的安全防护策略...
  •  攻防之初,大多为绕过既有逻辑和认证,以Getshell为节点,不管是SQL注入获得管理员数据还是XSS 获得后台cookie,大多数是为了后台的登录权限,假若我们获得一枚口令,都是柳暗花明。不管口令复杂与否,只要在构造...
  • 在window下,若文件名以"."或者空格作为结尾,系统会自动去除"."与空格, 所以可以上传以“asp.”和“asp_”为扩展名的文件 0x00截断绕过 IIS6.0解析漏洞 在网站下建立文件夹的名字为*.asp、*.asa 的...
  • 随着Web应用的高速发展和技术的不断成熟,对Web开发相关职位的需求量也越来越大,越来越多的人加入了Web开发的行列。但是由于程序员的水平参差不齐或是安全意识太低,很多程序员在编写代码时仅考虑了功能上的实现,...
  • (4)sF:也是tcp的扫描一种,发送一个FIN标志的数据包(如果主机存在IDS 和IPS系统,防火墙会过滤掉SYN(-sS发送的数据包)数据包 FIN数据包不需要TCP握手 效果和sS差不多 比sT更快) (5)sW:窗口扫描 (6) sV...
  • 1.SQL注入  SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询... 它能够轻易的绕过防火墙直接访问数据库,甚至能够获得数据库所在的服务器的系统权限。在Web应用漏洞中,SQL Injection 漏

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,676
精华内容 3,070
关键字:

web攻防系统