今天这篇文章,是一篇关于代码安全的内容。大部份内容可能对于如今来讲都已经很小儿科了。可是我在了解这方面的内容时,着实仍是被这些前辈们脑洞大开的手段所折服。 因此今天就特意盘点了一些比较出名的漏洞问题。javascript
注入式(Inject)攻击是一类很是常见的攻击方式,其基本特征是程序容许攻击者将不可信的动态内容注入到程序中,并将其执行,这就可能彻底改变最初预计的执行过程,产生恶意效果。html
1.一、反射型 XSS(非持久性跨站攻击)java
通常是利用网站某些页面会直接输出请求参数的特性,经过在 url 的请求参数包含恶意脚本,致使用户打开该 url 的时候,执行恶意脚本。web
例:http://localhost:8080/test.jsp?abc= <script>alert(“123”) </script>
面试
用户在访问这个页面的时候,就会触发弹窗。算法
固然,通常的 XSS 攻击不会这么简单的就让你弹个窗,甚至可能弹出你的cookie信息。数据库
1.二、存储型 XSS(持久性跨站攻击)编程
该种类型的攻击通常是经过表单输入(好比发布文章、回复评论等功能中)插入一些恶意脚本,而且保存到数据库,待其余用户加载对应的页面的时候,该段脚本就会被加载并执行。后端
与反射型 XSS 相比,该类的攻击更具备危害性,由于它影响的不仅是一个用户,而是大量用户,并且该种类型还可进行蠕虫传播;就如以前的贴吧和微博事件,用户访问了含有恶意脚本的页面,用户的cookie信息被盗取了,而且马上使用用户的帐户去发表新的帖子或微博同时注入恶意脚本,使得该恶意脚本不断被传播下去。安全
1.三、DOM Based XSS(基于 Dom 的跨站点脚本)
基于 DOM 的跨站点脚本与前面两种类型有什么区别呢?其实它注入的方式是基于前面两种类型的方式的,只不过是注入的脚本是经过改变DOM来实施的。
采用该种方式有一个好处就是从源代码中不易被发现而已。
如何去防御 XSS
基于上面漏洞产生的缘由,咱们若要想防护该种攻击,就须要从源头抓起(用户输入),制定一套合理且安全的 XSS 过滤规则。 如下介绍一些过滤方法
对 HTML 标签及一些特殊符号进行转义
该种方法是一种很是简单的过滤方法,仅仅是经过转义的方式将一些 HTML 标签和属性转义,好比 < 转义成 < ;, 这样像的脚本就运行不了。固然简单的过滤方式也就表明很容易就会被绕过。 另外若是须要使用含有富文本的功能时,使用这样的过滤就会使富文本失去做用。
使用白名单、黑名单的方式进行过滤
白名单、黑名单顾名思义是要定义哪些东西是可经过的,哪些东西不可经过。好比常见<b>、<p>; 、<
等等标签,不可经过的好比 javascript、<a>、<script>、<iframe>、onload
等等一些属性,将其进行转义。 固然使用该种方法也有自身的缺点,你并不可能穷举出全部元素,也可能会某些元素在黑名单内,但在某些状况它是须要使用的,这就须要咱们在设计 XSS 过滤器的时候权衡好,取最合理最适合需求的设计。
首先,就是最多见的SQL注入攻击。一个典型的场景就是Web系统的用户登陆功能,根据用户输入的用户名和密码,咱们须要去后端数据库核实信息。
假设应用逻辑是,后端程序利用界面输入动态生成相似下面的 SQL,而后让 JDBC 执行。 Select * from use_info where username = “input_usr_name” and password = “input_pwd”
可是,若是我输入的 input_pwd 是相似下面的文本,“ or “”=”
那么,拼接出的 SQL 字符串就变成了下面的条件,OR 的存在致使输入什么名字都是复合条件的。 Select * from use_info where username = “input_usr_name” and password = “” or “” = “”
这个例子,各位小伙伴们应该很容易可以理解到它的攻击性。上面例子中,程序指望用户输入一个数值,但实际输入的则是SQL语句片断。
根据这个套路,咱们就能够注入不少很骚的SQL片断了,好比删库,跑路之类的~
操做系统命令注入。
好比:Java 语言提供了相似Runtime.exec(…)
的API,能够用来执行特定命令,假设咱们构建了一个应用,以输入文本做为参数,执行下面的命令: ls –la input_file_name
可是若是用户输入是:
input_file_name;rm –rf/*
那将是毁灭性的打击,可是编程语言自己是作了不少的限制,这些操做未必能够真的可以完成攻击,可是这种隐患终究仍是存在的。
在 Java 应用进行数据库访问时,若是不用彻底动态的SQL,而是利用PreparedStatement,能够有效防范 SQL 注入。无论是SQL注入,仍是OS命令注入,程序利用字符串拼接生成运行逻辑都是个可能的风险点!
在数据库层面,若是对查询、修改等权限进行了合理限制,就能够在必定程度上避免被注入删除等高破坏性的代码。
拒绝服务(DoS)攻击,能够说是名声很响的暴力攻击方式。
最多见的DoS攻击有对计算机网络的带宽攻击和连通性攻击。带宽攻击指以极大的通讯量冲击网络,使得全部可用网络资源都被消耗殆尽,最后致使合法的用户请求没法经过。连通性攻击指用大量的链接请求冲击计算机,使得全部可用的操做系统资源都被消耗殆尽,最终计算机没法再处理合法用户的请求。
哈希碰撞是一种有趣的攻击方式。对方能够轻易消耗系统有限的CPU和线程资源。从这个角度思考,相似加密、解密、图形处理等计算密集型任务,都要防范被恶意滥用,以避免攻击者经过直接调用或者间接触发方式,消耗系统资源。
好比在Java中,有一个有趣的攻击方式:
攻击者能够事先构造大量相同哈希值的数据,而后以Json数据的形式发送给服务器端,服务器端在将其构建成为 Java 对象过程当中,一般以Hastable或HashMap等形式存储,哈希碰撞将致使哈希表发生严重退化,算法复杂度可能上升一个数量级(HashMap1.8以后在红黑树结构的优化,也是应对此问题的优化),进而耗费大量CPU资源。冲突多了,就会极大的下降get的性能,形成极严重的卡顿,甚至服务器崩掉~
此问题在4.2之后的版本被修复了
咱们Native和Js互相通信,可能会这么写咱们本地的Java代码:
webView.addJavascriptInterface(new JSObject(), "mJSObject");
复制代码
这段代码是否是挺正常的?的确挺正常呐。若是咱们用民主富强文明和谐的眼光去看,的确没问题。不过若是咱们怀着一颗搞破坏的心呢? 咱们既然能拿到这个Java对象,那么对于咱们来讲,咱们可使用反射随心所欲了。(这个问题,乌云曾给出过明确的漏洞描述)
function execute(cmdArgs){
for (var obj in window) {
if ("getClass" in window[obj]) {
alert(obj);
return window[obj].getClass().forName("java.lang.Runtime")
.getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
}
}
}
复制代码
不需多解释吧,这是当前很著名的WebView漏洞问题。
中间人攻击原理大概是用户在正常上网的时候,同网段的恶意用户对其进行欺骗。恶意用户向局域网广播:我是路由器,而后正经常使用户(电脑无防护)收到之后认为恶意用户就是路由器,而后向恶意用户发送数据包,恶意用户能够截获数据包,再向路由器发送正经常使用户的数据包,路由器将返回的数据包在给恶意用户,恶意用户在给正经常使用户,恶意用户就造成了中间人的效果,能够向返回的数据包注入html代码,达到劫持用户网站的效果,不过如今大部分的网站都是https且双向认证,比较难获取到用户发送数据包中的帐号密码。
CSRF,全名:Cross site Request Forgery(跨站域请求伪造)。通常的攻击方式是,经过请求伪造盗取用户的cookie信息,进而进行操做。
这部份内容,其实并不是是对深层技术的讨论。只是最近无心中看到这部分的内容,感受颇有趣就收集起来写了这篇文章,算是忙碌的工做之中娱乐一下吧~