加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

从三类常见高危漏洞 洞见那些“风平浪静”的代码

发布时间:2019-07-23 00:38:41 所属栏目:策划 来源:刘隽良@默安科技
导读:在研发人员眼中,编码开发的目的是实现相关功能逻辑可用,无明显功能 bug。而实际上,在安全人员眼中,很多这样看似没有功能问题的代码,却可以利用来进行安全漏洞攻击。虽然这在很多研发人员眼中是看似天方夜谭,但很不幸,通过以往的无数重大安全事件的

以下 JSP 代码片段可从 HTTP 请求中读取雇员 ID eid,并将其显示给用户。

  1. <% String eid = request.getParameter("eid"); %> 
  2. ... 
  3. Employee ID: <%= eid %> 

如果 eid 只包含标准的字母或数字文本,这个例子中的代码就能正确运行。如果 eid 里有包含元字符或源代码中的值,那么 Web 浏览器就会像显示 HTTP 响应那样执行 eid 里的代码。

起初,这个例子似乎是不会轻易遭受攻击的。毕竟,有谁会输入导致恶意代码的 URL,并且还在自己的电脑上运行呢?真正的危险在于攻击者会创建恶意的 URL,然后采用电子邮件或者社会工程的欺骗手段诱使受害者访问此 URL 的链接。当受害者单击这个链接时,他们不知不觉地通过易受攻击的网络应用程序,将恶意内容带到了自己的电脑中。这种对易受攻击的 Web 应用程序进行盗取的机制通常被称为反射型 XSS。

再来看看存储型 XSS 的例子,以下 JSP 代码片段可在数据库中查询具有给定 ID 的雇员,并输出相应雇员姓名。

  1. <%... 
  2. Statement stmt = conn.createStatement(); 
  3. ResultSet rs = stmt.executeQuery("select * from emp where id="+eid); 
  4. if (rs != null) { 
  5.    rs.next(); 
  6.    String name = rs.getString("name"); 
  7. %> 
  8. Employee Name: <%= name %> 

如同上一个例子,如果对 name 的值处理得当,该代码就能正常地执行各种功能;如若处理不当,就会对代码的攻击行为无能为力。同样,这段代码暴露出的危险较小,因为 name 的值是从数据库中读取的,而且显然这些内容是由应用程序管理的。然而,如果 name 的值是由用户提供的数据产生,数据库就会成为恶意内容沟通的通道。如果不对数据库中存储的所有数据进行恰当的输入验证,那么攻击者便能在用户的 Web 浏览器中执行恶意命令。这种类型的攻击即成为存储型 XSS,即攻击者利用手段将恶意代码存入数据库,一旦该恶意代码被从数据库读取,相关指令就会被执行。该手法极其阴险狡猾,因为数据存储导致的间接性使得辨别威胁的难度增大,而且还提高了一个攻击影响多个用户的可能性。

一般存储型 XSS 攻击会从访问提供留言板、评论区等提供输入字段的表单的网站开始。攻击者会在这些留言板、评论区表单条目中嵌入 JavaScript,若后台未经验证就将其存入数据库,接下来所有访问该留言板、评论区的用户都会执行这些恶意代码。

针对 XSS 的防护,主要手段在于用户输入数据的验证,包括:

  • 严格校验用户输入的数据,必须对所有输入中的 script、iframe 等字样进行严格的检查和 html escape 转义。这里的输入不仅仅是用户可以直接交互的输入接口,也包括 HTTP 请求中的 cookie 中的变量,HTTP 请求头部中的变量等。
  • 校验数据类型,验证其格式、长度、范围和内容。
  • 客户端,服务端进行双重校验。
  • 对输出的数据也要检查,因为数据库里的值有可能会在一个大网站的多处都有输出,所以即使在输入做了编码等操作,在各处的输出点时也要进行安全检查。

三、任意命令执行

任意命令执行漏洞指的是 Web 应用程序未检测用户输入的合法性,直接传入程序中调用系统命令的函数中如: system(),eval(),exec(),从而可能会导致攻击者通过构造恶意参数,在服务器上执行任意命令。

攻击者通过构造恶意代码,执行任意命令可获取服务器权限,导致服务器上的重要数据,如:程序代码、数据库信息、文档资料等泄露。

举例来说,下面这段来自系统实用程序的代码根据系统属性 APPHOME 来决定其安装目录,然后根据指定目录的相对路径执行一个初始化脚本。

  1. ... 
  2. String home = System.getProperty("APPHOME");    
  3. String cmd = home + INITCMD; 
  4. java.lang.Runtime.getRuntime().exec(cmd); 

该代码使得攻击者可通过修改系统属性 APPHOME 从而控制 INITCMD 的路径指向,从而提高自己在应用程序中的权限,继而随心所欲地执行命令。由于程序不会验证从环境中读取的值,所以如果攻击者能够控制系统属性 APPHOME 的值,他们就能欺骗应用程序去运行恶意代码从而取得系统控制权。

再看一个例子,下面的代码来自一个管理 Web 应用程序,旨在使用户能够使用一个围绕 rman 实用程序的批处理文件封装器来启动 Oracle 数据库备份,然后运行一个 cleanup.bat 脚本来删除一些临时文件。脚本 rmanDB.bat 接受单个命令行参数,该参数指定了要执行的备份类型。由于访问数据库受限,所以应用程序执行备份需要具有较高权限的用户。

  1. ... 
  2. String btype = request.getParameter("backuptype"); 
  3. String cmd = new String("cmd.exe /K 
  4. "c:utilrmanDB.bat "+btype+"&&c:utilcleanup.bat"") 
  5. System.Runtime.getRuntime().exec(cmd); 
  6. ... 

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读