web安全漏洞与防范小记

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的攻击,后端再接收参数前需处理一下参数中的“尖括号,单引号,双引号”等,话不多说,上砖头:

    /**
     * 取消HTML代码
     * @param $string
     * @return array|mixed
     */
	public static function shtmlspecialchars($string) {
		if(is_array($string)) {
			foreach($string as $key => $val) {
				$string[$key] = self::shtmlspecialchars($val);
			}
		} else {
			$string = preg_replace('/&amp;((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\\1',
				str_replace(array( '"', '<', '>'), array( '&quot;', '&lt;', '&gt;'), $string));
		}
		return $string;
	}

    /**
     * 屏蔽html(过滤富文本)
     * @param $html
     * @return mixed|string
     */
	public static function checkhtml($html) {
		$html = stripslashes($html);
		preg_match_all("/\<([^\<]+)\>/is", $html, $ms);

		$searchs[] = '<';
		$replaces[] = '&lt;';
		$searchs[] = '>';
		$replaces[] = '&gt;';
		
		if($ms[1]) {
			$allowtags = 'img|a|font|div|table|tbody|caption|tr|td|th|br|p|b|strong|i|u|em|span|ol|ul|li|blockquote|object|param|embed';//允许的标签
			$ms[1] = array_unique($ms[1]);
			foreach ($ms[1] as $value) {
				$searchs[] = "&lt;".$value."&gt;";
				$value = self::shtmlspecialchars($value);
				$value = str_replace(array('\\','/*'), array('.','/.'), $value);
				$value = preg_replace(array("/(javascript|script|eval|behaviour|expression)/i", "/(\s+|&quot;|')on/i"), array('.', ' .'), $value);
				if(!preg_match("/^[\/|\s]?($allowtags)(\s+|$)/is", $value)) {
					$value = '';
				}
				$replaces[] = empty($value)?'':"<".str_replace('&quot;', '"', $value).">";
			}
		}
		$html = str_replace($searchs, $replaces, $html);
		
		$html = addslashes($html);
		
		return $html;
	}

        除此之外,后端再设置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/

        

猜你喜欢

转载自blog.csdn.net/A1585570507/article/details/79066741