互联网上的WEB程序需要大量的安全机制来防御攻击。安全机制主要有:
1.处理用户的访问WEB的功能和数据,防止未授权访问。
2.处理用户的输入,防止用户的错误输入对程序造成影响。
3.处理hacker,保证在被攻击时能正常处理请求,且阻断hacker攻击。
4.处理管理员的行为,帮助管理员配置WEB程序的功能。
上面四点都可能成为hacker攻击的方向。
处理用户的请求
用户一般分为未授权用户(匿名用户)、注册普通用户和管理员。每种用户的权限是不同的,看到的数据和可执行的操作都是不同的。WEB程序大致通过三种机制来处理用户的访问:身份验证、会话管理、访问控制。这三种机制互相依靠,攻破一点,即可黑入别人的账户。
身份验证机制,现在绝大部分的WEB程序都采用原始的验证方式,即用户名和密码验证,服务器验证通过,即登陆成功,走向会话管理和访问控制环节。一 些安全性比较高的WEB程序,可能可能还会加入证书、Token等验证方式。原始的用户名、密码验证机制存在很多问题,如可以获取用户名信息、可以推测密 码、可以通过程序漏洞绕过认证。如果WEB程序存在sql注入漏洞,hacker就可以绕过密码认证。
用户验证通过,就进入会话管理阶段。用户登录后,还会访问各种页面、发出各种http请求,这时候程序还要处理其他用户的登陆请求,为了区分不同的 用户,WEB服务器需要为每个用户分配一个唯一的标识。一般的WEB程序都会为每一个用户建立一个会话(session),并且向用户发布一个令牌。会话 其实就是保存在服务器中的数据结构,用来管理用户和服务器之间的交互状态。令牌是一串唯一的字符串,令牌映射在会话(session)中,帮助WEB程序 将请求和该用户联系起来。会话令牌的传递方式有隐藏表单字段(hiden form field)、URL查询字符(query string),但一般使用的是http cookie,如果设定时间段内用户没有任何请求,服务器session会超时,断开连接。
处理用户请求的最后一步是访问控制,根据既定的规则来决定允许或者拒绝用户的请求。如果前面的权限认证机制正常工作,服务器就可以从用户发送的请求 中确认用户的身份,从而根据用户的权限来决定是否授权用户的请求动作。由于访问控制的要求很复杂,场景很多,因此这一阶段的安全漏洞也很多,但是渗透测试 时,也许需要大量重复性的工作,才会发现这样的漏洞。
处理用户的输入
我们要这样认为,所有的用户输入都不可信。如何安全地处理用户输入是防御攻击的一个很关键的要求。一般的WEB程序都会在前台页面做输入确认(一般是js验证),不过这些都可以很简单的被攻击者绕过。
输入处理的方法:
①拒绝已知的非法输入,一般是采用黑名单的方法,黑名单中包括在攻击中使用的一直的字符串或者字符。这种方法效果不明显,首先是恶意的字符串或者代码可能 会经过各种格式编码,再次是攻击技术在不断的发展,总会有一些字符串过滤不到(防御总是落后于攻击就是这个道理)。a、如果select被过滤,可以尝试 SeLecT、sleslectct;b、如果or 1=1被过滤,尝试or 2=2;c、如果alert(‘xss’)被过滤,尝试prompt(‘xss’),还可以通过在表达式之间使用非标准字符串破坏应用程序执行的令牌,来 避开特定关键字的过滤。如:select/*91ri.org*/username,password/*91ri.org*/from /*91riorg*/users
,或者<img%09 onerror=alert(1) src=a>
,基于黑名单的过滤还容易收到空字符的攻击,空字符可能导致过滤器停止处理输入,如:%00<script> alert(1)</script>
。
②只接受已知的正常输入,即设置白名单。白名单虽然确实有效,但是许多情况下不满足我们的需求。
③净化。这种方法是指WEB程序接收用户的输入,然后在后台对用户的输入进行净化。数据中可能存在的恶意字符被删除或者进行编码、转义。这种方法一 般很有效,也被广泛使用。如:如果要防御xss攻击就要对用户的输入进行html编码,将>字符编码为>。虽然进行了转义和编码,但是对于在一个输入项中容纳集中可能的恶意数据,还是有 可能产生攻击行为。
一个比较安全的流程如下:
①WEB程序收到用户的登陆信息,表单处理程序净化掉里面的非法字符,确认输入符合要求。
②WEB程序查询数据库获取用户密码。为防止sql注入在执行sql前,要对用户输入中包含的可用于攻击数据库的所有字符进行转义。
③用户登录成功,WEB程序将用户资料传给后台的soap服务,进一步获取用户的信息。为了防止对soap的注入攻击,需要对用户的输入进行任何xml元字符进行编码。
④WEB程序在用户的浏览器中显示用户的账户信息,为防止xss攻击,WEB程序对返回页面中用户提交的数据都要进行html编码。
Web程序的防御机制有以下这些:
身份验证机制,现在绝大部分的 WEB 程序都采用原始的验证方式,即用户名和密码验证,服务器验证通过,即登陆成功,走向会话管理和访问控制环节。一 些安全性比较高的 WEB 程序,可能可能还会加入证书、Token 等验证方式。原始的用户名、密码验证机制存在很多问题,如可以获取用户名信息、可以推测密 码、可以通过程序漏洞绕过认证。如果 WEB 程序存在 sql 注入漏洞,hacker 就可以绕过密码认证。
访问控制,根据既定的规则来决定允许或者拒绝用户的请求。如果前面的权限认证机制正常工作,服务器就可以从用户发送的请求 中确认用户的身份,从而根据用户的权限来决定是否授权用户的请求动作。由于访问控制的要求很复杂,场景很多,因此这一阶段的安全漏洞也很多,但是渗透测试 时,也许需要大量重复性的工作,才会发现这样的漏洞。
拒绝已知的非法输入,一般是采用黑名单的方法,黑名单中包括在攻击中使用的一直的字符串或者字符。这种方法效果不明显,首先是恶意的字符串或者代码可能会经过各种格式编码,再次是攻击技术在不断的发展,总会有一些字符串过滤不到(防御总是落后于攻击就是这个道理)。
只接受已知的正常输入,即设置白名单。白名单虽然确实有效,但是许多情况下不满足我们的需求。
净化,这种方法是指WEB程序接收用户的输入,然后在后台对用户的输入进行净化。数据中可能存在的恶意字符被删除或者进行编码、转义。这种方法一般很有效,也被广泛使用。