常见web应⽤漏洞形成原理及预防
漏洞原理及防护
Burte Force(暴⼒破解)
在web攻击中,⼀般会使⽤这种⼿段对应⽤系统的认证信息进⾏获取。其过程就是使⽤⼤量的认证信息在认证接⼝进⾏尝试登录,直到得到正确的结果。为了提⾼效率,暴⼒破解⼀般会使⽤带有字典的⼯具来进⾏⾃动化操作。
防御:
1.是否要求⽤户设置复杂的密码;
2.是否每次认证都使⽤安全的验证码(想想你买⽕车票时输的验证码~)或者⼿机otp;
3.是否对尝试登录的⾏为进⾏判断和限制(如:连续5次错误登录,进⾏账号锁定或IP地址锁定等);
4.是否采⽤了双因素认证;
XSS(跨站脚本攻击)
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故⼜称XSS。通过将精⼼构造的代码注⼊到⽹页中,并且有浏览器解释执⾏,以达到恶意攻击的效果。(xss漏洞⼀般发⽣在服务器)
⼀般XSS可以分为如下⼏种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS是⼀种发⽣在前端浏览器端的漏洞,所以其危害的对象也是前端⽤户。
形成XSS漏洞的主要原因:
是程序对输⼊和输出没有做合适的处理,导致“精⼼构造”的字符输出在前端时被浏览器当作有效代码解析执⾏从⽽产⽣危害。
XSS危害:
盗取取⽤户账户,
窃取⽤户cookie资料冒充⽤户登录
劫持会话
刷流量
传播蠕⾍病毒
防御修补:
因此在XSS漏洞的防范上,⼀般会采⽤“对输⼊进⾏过滤”和“输出进⾏转义”的⽅式进⾏处理:
输⼊点:使⽤filter过滤敏感字符或进⾏编码转义对特定结构类型的数据进⾏格式检查,针对输⼊点的检查最好放在服务器。
输出点:对输出到html页⾯中的信息进⾏编码转义,如(HTMLEncode)如果输出在Javascript脚本中时进⾏javascriptEncode。对使⽤javascript变量都放在引号中并转义危险字符,data 部分就⽆法逃逸出引号外成为 code 的⼀部分。还可以使⽤更加严格的⽅法,对所有数字字母之外的字符都使⽤⼗六进制
编码。此外,要注意在浏览器中,HTML 的解析会优先于 Javascript 的解析,编码的⽅式也需要考虑清楚,针对不同的输出点,我们防御 XSS 的⽅法可能会不同。
此外还可以做HTTPonly 或者对COOKIE劫持做限制。
XSS的检测:
反射型XSS:反射性通常诱导⽤户点击我们构造好的恶意payload才会触发,反射性xss的检测在我们每次请求带payload带payload连接时页⾯会带有特定的畸形数据的
DOM型XSS:
⼈⼯检测:到类似的document.write,innerHTML赋值,window.location操作,写javascript后内容eval,settimeout等直接执⾏的函数。到其变量,回溯变量来源,是否经过安全函数。
⾃动化检测:思路是从变量⼊⼿,观察变量传递过程,检查是否存在危险函数输出,或者是否经过安全函数,
CSRF(跨站请求伪造)
Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造⼀个请求(这个请求⼀般是⼀个链接),然后欺骗⽬标⽤户进⾏点击,⽤户⼀旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为"one click"攻击。
CSRF与XSS的区别:
CSRF是借⽤户的权限完成攻击,攻击者并没有拿到⽤户的权限,⽽XSS是直接盗取到了⽤户的权限,然后实施破坏。
防御:
–对敏感信息的操作增加安全的token;
–对敏感信息的操作增加安全的验证码;
–对敏感信息的操作实施安全的逻辑流程,⽐如修改密码时,需要先校验旧密码等;
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因⼤都是由于服务端提供了从其他服务器应⽤获取数据的功能,但⼜没有对⽬标地址做严格
过滤与限制导致攻击者可以传⼊任意的地址来让后端服务器对其发起请求,并返回对该⽬标地址请求的数据
数据流:攻击者----->服务器---->⽬标地址
PHP中下⾯函数的使⽤不当会导致SSRF:
file_get_contents()
web下载官方下载fsockopen()
curl_exec()
防御:
–过滤返回信息
–统⼀错误信息
–限制请求端⼝
–禁⽤不常⽤的协议
–使⽤DNS缓存或者host名单
–如果⼀定要通过后台服务器远程去对⽤户指定(“或者预埋在前端的请求”)的地址进⾏资源请求,则请做好⽬标地址的过滤。
Sql Inject(SQL注⼊)
由于程序在处理数据和程序交互时使⽤了字符串拼接,且没有对⽤户输⼊做过滤
防御:
对⽤户输⼊进⾏转义
限制关键字输⼊
使⽤SQL语句预处理,对SQl语句进⾏预编译,然后进⾏参数绑定,最后传⼊参数
RCE(远程命令执⾏)
可以让攻击者直接向后台服务器远程注⼊操作系统命令或者代码,从⽽控制后台系统。
远程系统命令执⾏:
⼀般出现这种漏洞,是因为应⽤系统从设计上需要给⽤户提供指定的远程命令操作的接⼝
⽐如我们常见的路由器、防⽕墙、⼊侵检测等设备的web管理界⾯上⼀般会给⽤户提供⼀个ping操作的web界⾯,⽤户从web界⾯输⼊⽬标IP,提交后,后台会对该IP地址进⾏⼀次ping测试,并返回测试结果。⽽,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接⼝提交“意想不到”的命令,从⽽让后台进⾏执⾏,从⽽控制整个后台服务器
防御:
如果需要给前端⽤户提供操作类的API接⼝,⼀定需要对接⼝输⼊的内容进⾏严格的判断,⽐如实施严格的⽩名单策略会是⼀个⽐较好的⽅法。
File Inclusion(⽂件包含漏洞)
在PHP中,提供了:nclude(),include_once() require(),require_once()这些⽂件包含函数,这些函数在代码设计中被经常使⽤到。
⼤多数情况下,⽂件包含函数中包含的代码⽂件是固定的,因此也不会出现安全问题。但是,有些时候,⽂件包含的代码⽂件被写成了⼀个变量,且这个变量可以由前端⽤户传进来,这种情况下,如果没有做⾜够的安全考虑,则可能会引发⽂件包含漏洞。攻击着会指定⼀个“意想不到”的⽂件让包含函数去
执⾏,从⽽造成恶意操作。根据不同的配置环境,⽂件包含漏洞分为如下两种情况:
1.本地⽂件包含漏洞:仅能够对服务器本地的⽂件进⾏包含,由于服务器上的⽂件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含⼀些固定的系统配置⽂件,从⽽读取系统敏感信息。很多时候本地⽂件包含漏洞会结合⼀些特殊的⽂件上传漏洞,从⽽形成更⼤的威⼒。
2.远程⽂件包含漏洞:能够通过url地址对远程的⽂件进⾏包含,这意味着攻击者可以传⼊任意的代码,这种情况没啥好说的,准备挂彩。
防御:
在web应⽤系统的功能设计上尽量不要让前端⽤户直接传变量给包含函数,如果⾮要这么做,也⼀定要做严格的⽩名单策略进⾏过滤。
关闭allow_url_open
不安全的⽂件
⽂件上传功能在web应⽤系统很常见,⽐如很多⽹站注册的时候需要上传头像、上传附件等等。当⽤户点击上传按钮后,后台会对上传的⽂件进⾏判断⽐如是否是指定的类型、后缀名、⼤⼩等等,然后将其
按照设计的格式进⾏重命名后存储在指定的⽬录。如果说后台对上传的⽂件没有进⾏任何的安全判断或者判断条件不够严谨,则攻击着可能会上传⼀些恶意的⽂件,⽐如⼀句话⽊马,从⽽导致后台服务器被webshell。
防御:
–验证⽂件类型、后缀名、⼤⼩;
–验证⽂件的上传⽅式;
–对⽂件进⾏⼀定复杂的重命名;
–不要暴露⽂件上传后的路径;
不安全的⽂件下载
⽂件下载功能在很多web系统上都会出现,⼀般我们当点击下载链接,便会向后台发送⼀个下载请求,⼀般这个请求会包含⼀个需要下载的⽂件名称,后台在收到请求后会开始执⾏下载代码,将该⽂件名对应的⽂件response给浏览器,从⽽完成下载。如果后台在收到请求的⽂件名后,将其直接拼进下载⽂件的路径中⽽不对其进⾏安全判断的话,则可能会引发不安全的⽂件下载漏洞。
此时如果攻击者提交的不是⼀个程序预期的的⽂件名,⽽是⼀个精⼼构造的路径(⽐如…/…/…/etc/passwd),则很有可能会直接将该指定的⽂件下载下来。从⽽导致后台敏感信息(密码⽂件、源代码等)被下载。
防御:
过滤(.)使的⽤户不能回溯到上级⽬录
正则表达式验证⽤户出⼊的格式
php.ini配置open——basedir限制⽂件范围
越权
如果使⽤A⽤户的权限去操作B⽤户的数据,A的权限⼩于B的权限,如果能够成功操作,则称之为越权操作。越权漏洞形成的原因是后台使⽤了不合理的权限校验规则导致的。
⼀般越权漏洞容易出现在权限页⾯(需要登录的页⾯)增、删、改、查的的地⽅,当⽤户对权限页⾯内的信息进⾏这些操作时,后台需要对对当前⽤户的权限进⾏校验,看其是否具备操作的权限,从⽽给出响应,⽽如果校验的规则过于简单则容易出现越权漏洞。
防御:
1.使⽤最⼩权限原则对⽤户进⾏赋权;
2.使⽤合理(严格)的权限校验规则;
3.使⽤后台登录态作为条件进⾏权限判断,别动不动就瞎⽤前端传进来的条件;
⽬录遍历
在web功能设计中,很多时候我们会要将需要访问的⽂件定义成变量,从⽽让前端的功能便的更加灵活。当⽤户发起⼀个前端的请求时,便会将请求的这个⽂件的值(⽐如⽂件名称)传递到后台,后台再执⾏其对应的⽂件。在这个过程中,如果后台没有对前端传进来的值进⾏严格的安全考虑,则攻击者可能会通过“…/”这样的⼿段让后台打开或者执⾏⼀些其他的⽂件。从⽽导致后台服务器上其他⽬录的⽂件结果被遍历出来,形成⽬录遍历漏洞。
敏感信息泄露概述
由于后台⼈员的疏忽或者不当的设计,导致不应该被前端⽤户看到的数据被轻易的访问到。⽐如:
—通过访问url下的⽬录,可以直接列出⽬录下的⽂件列表;
—输⼊错误的url参数后报错信息⾥⾯包含操作系统、中间件、开发语⾔的版本或其他信息;
—前端的源码(html,css,js)⾥⾯包含了敏感信息,⽐如后台登录地址、内⽹接⼝信息、甚⾄账号密码等;
类似以上这些情况,我们成为敏感信息泄露。敏感信息泄露虽然⼀直被评为危害⽐较低的漏洞,但这些敏感信息往往给攻击着实施进⼀步的攻击提供很⼤的帮助,甚⾄“离谱”的敏感信息泄露也会直接造成严重的损失。因此,在web应⽤的开发上,除了要进⾏安全的代码编写,也需要注意对敏感信息的合理处理。
PHP反序列化漏洞
为了⽅便存取,web程序通常将对象通过serliaize()函数(序列化说通俗点就是把⼀个对象变成可以传输的字符串将类对象变成数组存储)反序列就是使⽤的unserialize()把被序列化的字符串还原为对象,然后在接下来的代码中继续使⽤。序列化和反序列化本⾝没有问题,但是如果反序列化的内容是⽤户可以控制的,且后台不正当的使⽤了PHP中的魔法函数,就会导致安全问题
常见的⼏个魔法函数:
__construct()当⼀个对象创建时被调⽤
__destruct()当⼀个对象销毁时被调⽤
__toString()当⼀个对象被当作⼀个字符串使⽤
__sleep() 在对象在被序列化之前运⾏
__wakeup将在序列化之后⽴即被调⽤
1
2
3
4
5
6
7
xml外部实体注⼊漏洞
概括⼀下就是"攻击者通过向服务器注⼊指定的xml实体内容,从⽽让服务器按照指定的配置进⾏执⾏,导致问题"也就是说服务端接收和解析了来⾃⽤户端的xml数据,⽽⼜没有做严格的安全控制,从⽽导致xml外部实体注⼊。
具体的关于xml实体的介绍,⽹络上有很多,⾃⼰动⼿先查⼀下。
现在很多语⾔⾥⾯对应的解析xml的函数默认是禁⽌解析外部实体内容的,从⽽也就直接避免了这个漏洞。
以PHP为例,在PHP⾥⾯解析xml⽤的是libxml,其在≥2.9.0的版本中,默认是禁⽌解析xml外部实体内容的。
不安全的url跳转
不安全的url跳转问题可能发⽣在⼀切执⾏了url地址跳转的地⽅。
如果后端采⽤了前端传进来的(可能是⽤户传参,或者之前预埋在前端页⾯的url地址)参数作为了跳转的⽬的地,⽽⼜没有做判断的话就可能发⽣"跳错对象"的问题。
url跳转⽐较直接的危害是:
–>钓鱼,既攻击者使⽤漏洞⽅的域名(⽐如⼀个⽐较出名的公司域名往往会让⽤户放⼼的点击)做掩盖,⽽最终跳转的确实钓鱼⽹站
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论