《2022年BS程序代码安全基本攻击防御模式》由会员分享,可在线阅读,更多相关《2022年BS程序代码安全基本攻击防御模式(18页珍藏版)》请在金锄头文库上搜索。
1、精品学习资源BS 程序代码与安全与基本攻击 /防范模式BearOcean 2021-06-021. 引言1.1. 文档说明 :1.2. 文档组织方式 :2. 正文2.1. SQL 注入2.1.1. 攻击模式 :2.1.2. 防范方法 :2.2. 脚本注入2.2.1. 攻击模式2.2.2. 防范方式2.3. 跨站攻击2.3.1. 攻击模式2.3.2. 防范方式2.4. shell上传2.4.1. 攻击模式2.4.2. 防范方式2.5. 爆破2.5.1. 攻击模式欢迎下载精品学习资源3. 结语1. 引言1.1. 文档说明 :该文档主要阐述在BS 程序中,安全性方面的留意事项;常见的主要攻击模式,以
2、及为了防范这些不同的攻击手段,作为技术人员建议留意的编码事项;该文档包含的内容主要是个人对于Internet安全性问题的懂得;以及对这些问题进行规避的方法整理,难免有误,也欢迎大家进行指正和补充;另注 : 该文档显现的编码均为伪代码;1.2. 文档组织方式 :该文档主要依据攻击模式进行分类整理,每个攻击模式的小专题分2 部分内容 :(1) 攻击模式详述(2) 防范方式与建议对于攻击模式详述部分,尽可能多的举出案例来进行说明,已便利懂得;而防范方式,实际上通常只有在对攻击模式懂得的前提下,才可能真正确保防范的有效;2. 正文2.1. SQL 注入2.1.1. 攻击模式 :欢迎下载精品学习资源最经
3、常遭受 SQL 注入的页面通常是治理员/用户登陆点;不论是asp或是 jsp ,假如不正确的编码,都会显现这个漏洞;下面以一个实例来阐述SQL 注入的成因;假设我们有一个 JSP页面 login.jsp ,用于搜集治理员输入的用户名和密码;用户点击按钮, 将会把收集到的用户名与密码提交到指定的把握组件Struts:Action,或者 Servlet. 在该组件中调用 chekLoginString userName, String passWord进行登陆验证,以从页面收集到的 用户名和密码信息拼装出SQL字符串,供 DAO下层使用,以从数据库中的治理员记录表 中读取数据, 假如从表中找到匹配
4、的记录,就表示验证成功, 我们将返回相应得治理员实体类;否就返回Null表示登陆验证失败;这是一个特殊简洁的规律模块,如下图所示:这个规律产生注入漏洞的关键在于checkAdminLogin方法;由于在该方法中,我们以这种方式进行编码 :public Admin checkAdminLoginString userName, String password欢迎下载精品学习资源String strSQL =” SELECT * FROM TD_ADMIN AS A WHEREA.USERNAME=” +userName + ” AND A.PASSWORD= ” +password+ ”;”/
5、后续通过 DAO提交该 SQL 到数据库获得查询结果,省略这个生成 SQL的方式,记得刚接触数据库编程的时候,有许多书籍的范例代码也是这样书写的, 咋一看没有什么问题, 但是由于没有对可能的输入作一个全面的考虑,所以便产生了注入漏洞;假如有人试图在这里进行恶意攻击,那么他可以在登陆名输入框中输入123 其实其他的任意值也可 而在密码输入框中输入 OR 1=1那么由于我们的 SQL 是靠拼出来的,所以最终提交给数据库的将是:SELECT * FROM TD_ADMIN AS A WHERE A.USERNAME=123 AND A.PASSWORD= OR 1 = 1很明显,这句 SQL由于后面
6、被加上了永真条件,登陆是确定成功的;那么不论登陆者是否是治理员,输入 OR 1,=他1都将能够登陆系统;更有甚者,我可以在输入框中输入数据库的SQL 注释符,然后填写我想让数据库执行的操作例如 DROP SOMETABLE一类的;所以注入漏洞的危害实际是特殊大的;SQL注入漏洞的根本缘由是,由于我们编码时的不当心,导致用户可以通过输入来转变要执行的规律,甚至输入新的规律;但是,越是严肃和显而易见的代码安全问题,实际要修补却也是越简洁的;2.1.2. 防范方法 :A:加上验证 或者字符过滤 在网上搜寻关于对SQL注入的防护问题, 有许多答案供应的是对输入字符串进行验证/或者是过滤,甚至有人供应了
7、字符串过滤代码;这种方案指出: SQL注入的成因是攻击者在输 入框中输入了有特殊意义的字符,如单引号, 或者是数据库特定的注释符号,或者是执行分隔符的分号;欢迎下载精品学习资源绝 SQL 注入 .表面上看似乎是可以的, 由于在把握层中, 用户假如试图输入 OR 1将=得1到类似 ”不答应输入单引号 ”的提示从而系统拒绝了本次执行;但是,这样的防范方案有特殊大的缺陷:第一 : 输入验证应当与详细的规律挂钩,而不应当与安全防护中的防注入产生过密的依靠;用户名和密码的输入验证和新闻内容的输入验证是不同的; 例如, 对于新闻的按内容搜寻又应当答应输入单引号, 由于新闻内容本身是答应包含单引号的; 所以
8、输入验证不能从根本上解决问题;一个疏忽带来的结果将是满盘皆输;其次 : 提出这种解决方案实际上是没有真正的懂得 SQL 注入, SQL 注入的问题并不是出在不合法字符的问题上;这只是表象, SQL 注入的真正缘由是系统没有方法严格地把握程序规律与输入参数之间的分别,系统存在漏洞让系统是用者有地方可以把自己的输入 本应当是参数 变成了程序规律的一部分;B:把握与参数分别试想我们给用户供应一个接口,这个接口带一个参数,用户填写这个的这个参数将准备下面 的代码执行序列;那么用户可以通过这个接口来命令系统做任何事情;其实SQL 注入就是这个缘由;产生这个问题的最根本的缘由是,系统应当有才能明确的划分什
9、么是规律,什么是参数;所以解决 SQL 注入的最根本方法是使用Template模式;欢迎下载精品学习资源那么用户的输入会作为Business Object的参数存在; 但是不管用户输入什么; 都无法脱离程序员设置的Templete 规律模板 ;最终 Templete + Parameters将准备程序详细的执行;Java中对该模式的实现有PreparedStatment或者 NamingQuery一类的技术; 详细内容可以参见相关文档;由于他们实现了参数与规律的分别,所以将从根本上杜绝SQL 注入;使用 PreparedStatement仍有其他好处,除了安全方面的考虑,由于数据库的编译特性,
10、 在性能上也有所提高;2.2. 脚本注入2.2.1. 攻击模式这里所说的脚本,通常所指的是JavaScript脚本,虽然 JavaScript运行于客户端,并且有安全沙箱的爱惜,但是放任恶意JavaScript脚本是特殊危险的;欢迎下载精品学习资源假如会运用 Ajax技术,更是如虎添翼;假如你明白这两项技术,便可以在网上搜寻你的目标;一个网站, 假如对输入未做合理的验证或过滤,在显示输出的时候又未做合适的格式化,那么便存在这种漏洞;下面举一个实例:我们有一个新闻站点; 每个新闻答应浏览者进行评论,浏览者提交的评论将被储备在数据据库特地的表中,并且将被显示在新闻的下边;这个规律很正常, 没有什么
11、问题; 但是很惋惜的是开发者除了字符长度没有在后端做任何输入合法验证;那么这个站点的评论输入,必定给坏蛋们有机可乘;假设我们在评论中输入如下内容:哈ale哈rt, 傻“了吧,这个地方存在脚本注入漏洞. ”;那么, 这句话将被储备在数据库评论表中;以后,每一个浏览者打开这个新闻页面是,都将会弹出这样一个消息框;攻击者很慈祥,没有做过多的破坏;但是假如输入 :window.location.href=” www.ba;idu那么打开这个新闻页面,该页面将被从定向到baidu 的页面上;假如目标页面不是baidu.而是一个有恶意代码的页面;那么每个浏览者的机器都可能中毒;注入上述脚本的攻击者不够聪慧
12、或者只是想好心的提示;由于他们注入的东西太简洁被人发觉;我们有别的方式把活干的隐匿,到底开发者和爱惜人员都不行能对评论一条一条得进行检查;我们注入 :好文 . 顶欢迎下载精品学习资源WEB2.0的流行使页面成效更加绚丽,同时也使脚本注入的攻击力提高不少;曾经明白这样一种攻击模式:攻击者在幕后预备了服务器去接受Ajax 提交的请求; 攻击者通常有自己的服务器通常是肉鸡,在上面部署了合适的代码;在目标站点,存在注入点的页面注入如下代码:我也来顶 .var strTargetMessage =window.cockie;欢迎下载精品学习资源很简洁的代码,而且极难被发觉;但是这样,每个登录者在拜望这个
13、页面的时候,其cockie 信息都将被发送给攻击者;把握了 cockie 中存放的 JSESSIONID,那么攻击者便可以冒充该登录者来做想做的事情, 比如说转帐 但一般银行有 SSL授权的密钥 .不管怎么样,很危险了;2.2.2. 防范方式供应合理的过滤或者转换程序,在输入存放于数据库前, 或者是显示在页面前对数据进行处理;尽一切可能,防止用户的输入有执行的可能;详细代码,因不同的后端语言不同,但是工程供应有效,统一的过滤处理方式是合理的;该攻击方法成立的缘由是,浏览器在对页面进行解读时,不行能区分哪一段是客户输入,哪一段是预编制的模板或Html 或脚本;有人曾经提出,确保评论内容显现在中可以防止这个问题;如:那么评论内容将得到原样显示,并不会执行其中的脚本;但是这样的解决方案是不正确的;由于我只需要对注入稍加改动:var strTargetMessage =window.cockie;欢迎下载精品学习资源