what!我的网站出现了莫名广告。。。
最近为了迎合产品和市场的需要,上线了一个基于微信公众号的h5项目,可能运营渠道推广的不错,公众号的粉丝蹭蹭蹭的往上涨,不料,有人羡慕嫉妒恨了[捂脸]。。。
h5的页面上出现了一些低级广告!!!
运营人员开始炸锅了,带着刀枪和证据来到我身边,一手甩过手机,xxx广告亮瞎了我的24K钛金狗眼,看着肩上的‘刀‘和头上的‘抢‘,吓得我灰溜溜的感觉看代码。。。
乍一看,估计是我们的运营桑被污染了,出现了网络劫持。。。OMG!!!
安(漏)全(洞)
面对“广告”事件,我大体对网络安全相关的攻击做了一下功课,主要有以下攻击:
1. XSS(Cross-Site Scripting)跨站脚本攻击
2. CSRF(Cross Site Request Forgery)跨站请求伪造攻击
3. SQL注入
4. 文件上传漏洞
5. DDos攻击
6. 运营商劫持
7. 其他攻击手段
傻眼了吧! 不看不知道,看了也不知道[捂脸],这么多的攻击,怎么防,宝宝心里苦。。。
我有枪,你要吗!
道高一尺,魔高一丈。你有攻,我有防(房)[奸笑]
首先,为了测试你的网站存在哪些安全漏洞,你需要一些简便的测试工具
于是,我找了IBM的APPScan,参考这篇博文
简单的介绍一下界面,首先设置要扫码的url或站点:
扫描结果:
从上面图可以看到你的站点哪些url存在跨站点攻击和其他问题,它还提供修改建议,非常不错的一款软件,推荐一下
1. XSS攻击
XSS跨站脚本攻击(Cross-Site Scripting),为了区别层叠样式表CSS(Cascading Style Sheets),缩写改名为XSS。
跨站脚本攻击是指攻击者在网页上嵌入恶意程序脚本,当用户打开网页时,脚本程序便开始在客户端的网页上执行,恶意的脚本可以获取到用户的cookie,用户密码,以用户的身份执行某些恶意操作,甚至可以获取用户的root权限
常见的恶意脚本提交方式:
form表单提交
url参数提交
提交内容如:"/><script>alert(123)</script><!
提交到后端,假设后端并没有对该参数进行处理,直接输出到前端,那么在前端就会执行alert(123)
这里只是简单的脚本,还可以执行如document.cookie等脚本获取用户cookie
XSS子弹夹:
从上面的攻击可以看出,XSS主要利用了JS脚本进行攻击,只要我们将js脚本或者html标签替换成普通的字符串即可破解XSS的攻击,后端再接收参数前需处理一下参数中的“尖括号,单引号,双引号”等,话不多说,上砖头:
除此之外,后端再设置cookie的时候需要设置Httponly属性,这样javascript就无法获取cookie了
或者secure参数设置为true,只有https才能提交cookie
处理富文本:页面编辑器中会含有html标签,要限制html标签使用的范围
其他可参考博文: https://thief.one/2017/05/31/1/
2. CSRF攻击
CSRF跨站请求伪造攻击(Cross-Site Request Forgery),虽然都是跨站,但是CSRF和XSS并不相同,区别很大。XSS是利用站点内的受信任用户,利用用户去操作恶意脚本;而CSRF则是利用站点内受信任(已登录)的用户身份,发送恶意请求给站点,如发送银行转账请求、发邮件、发短信甚至盗取账号
CSRF攻击原理:
举个栗子:
你已经登录了你的鸡付宝,需要转账,但是提现前你决定要去逛一下淘宝,于是没有登出,打开了另外一个恶意网站,然后这个恶意网站里有一条鸡付宝的转账请求,你点击之后,就开始转账,然后发现账户里少了几块钱
当然,上面只是一个很天真的栗子,转账肯定会输入密码,银行肯定也会有其他验证,没那么简单,只是说明这个场景而已
CSRF子弹夹:
CSRF之所以能攻击成功是因为可以发起伪造请求,那么第一个方法就是令攻击者无法伪造请求,开发者可以在请求时加上随机token来标志用户的请求,后端验证token,若不正确,则拒绝请求
md5或者sha1加盐,对于账户信息以及加密信息,可以利用md5或者sha1,并增加随机字符串加密,让攻击者不那么容易破解
添加refer判断,判断refer不是来源于站点白名单内的,拒绝服务
3. SQL攻击
SQL攻击,顾名思义就是利用sql来攻击你的网站,获取你的数据库信息,甚至删除数据库
举个栗子:
一个非常简单的登陆验证查库操作:
select * from user where username="$username" and password="$password";
当用户输入的密码是:";drop table user;#
你没有对用户的参数进行过滤,直接传入上面的sql语句中,则变成
select * from user where username="$username" and password="";drop table user;#";
执行完之后,发现你的表不见了。。。OMG
SQL防御子弹夹:
不要相信用户的输入,对于用户的输入数据进行过滤,调用addslashes方法过滤参数
使用预编译语句,或者使用orm操作数据库
控制数据库操作权限,删除操作只有管理员有权限
4. 文件上传漏洞
我们经常会要求用户去上传图片之类的文件,假若没有对文件类型进行检查,恶意用户则会上传一些可执行文件,病毒等,到你的服务器,达到攻击目的
文件上传子弹夹
检查上传文件的后缀名,当然后缀名是不够的,因为它可以伪造后缀名
重命名上传的文件,避免攻击者猜测到文件访问路径,执行病毒文件
判断文件起始的前几个字节,通常文件的前几个字节是固定的,这几个字节称为魔数
如:JPEG('FFD8FF'),PNG('89504E47'),GIF('47494638')
5. DDOS攻击
DDos分布式拒绝服务攻击(Distributed Denial Of Service),是目前最强大,最难防御的攻击方式之一。我们先理解一下DOS攻击(Denial Of Service),决绝服务攻击,就是利用合理的客户端请求来占用服务端的资源,拖慢甚至导致合法用户的请求无法访问,随着计算机服务的升级,这种攻击没什么效果,于是出现了DDos分布式拒绝服务攻击
DDos是指攻击者借助公共网络,将数量庞大的计算机联合起来攻击平台,导致平台瘫痪,通常攻击者在攻击前要控制大量用户的计算机(肉鸡),然后通过指令在同一时刻使这些计算机发起大量请求
常见的DDos攻击有:
依赖蛮力的ICMP Flood、UDP Flood,组织大规模攻击难
利用协议特征和软件漏洞的Hash碰撞攻击,特定环境才能发生
前面两者的结合、利用协议特征、系统漏洞又有海量流量的攻击:SYN Flood、DNS Query Flood
SYN Flood攻击
DNS Query Flood攻击
CC攻击(HTTP攻击)
以上这几类的攻击已经超出了web攻击的范畴,需要服务器运维等高级技术防范,这里不展开讲解
6. 运营商劫持
运营商主要是那些提供宽带服务的ISP,如中国的中国移动、中国电信、中国联通三大运营商,还有一些小运营商如长城宽带,运营商为了一些利益会恶意的劫持用户的请求,发放不良广告,主要有域名劫持,又称为DNS(Domain name resolution)劫持,HTTP劫持
DNS劫持
域名解释:DNS解析,是指将域名重新转换成IP的过程,以便计算机之间可以相互通信
一般的劫持有下面三种情况:
1. 错误域名解析到纠错导航页面,导航页面存在广告。判断方法:访问的域名是错误的,而且跳转的导航页面也是官方的,如电信的114,联通移网域名纠错导航页面。
2. 错误域名解析到非正常页面,对错误的域名解析到导航页的基础上,有一定几率解析到一些恶意站点,这些恶意站点通过判断你访问的目标HOST、URI、 referrer等来确定是否跳转广告页面,这种情况就有可能导致跳转广告页面(域名输错)或者访问页面被加广告(页面加载时有些元素的域名错误而触发)这种劫持会对用户访问的目标HOST、URI、referrer等会进行判定来确定是否解析恶意站点地址,不易被发现。
3. 直接将特点站点解析到恶意或者广告页面,这种情况比较恶劣,而且出现这种情况未必就是运营商所为,家里路由器被黑,或者系统被入侵,甚至运营商的某些节点被第三方恶意控制都有可能。具体情况要具体分析,这里就不展开了。
DNS劫持子弹节
打爆运营商电话[捂脸]
HTTP劫持
http劫持是指在DNS解析正常的情况下,服务端的响应被拦截,然后在拦截的页面中植入广告等,即前面我的H5页面的情况
HTTP劫持子弹夹
使用https来加密你的请求
以上就是目前常见的一些web攻击手段,简单的列举了一下防御的手段,面对这些攻击,不仅需要开发,还需要运维来配合,保证我们的服务器安全
除了上面的防御手段,还可以参考http请求头header的相关设置
如: Content Security Policy (CSP设置)
X-Frame-Options – How to Combat Clickjacking
X-XSS-Protection – Preventing Cross-Site Scripting Attacks
X-Content-Type-Options HTTP Header
参考:
《大型分布式网站架构设计与实践》
https://thief.one/2017/05/31/1/