我在江北学安全(一)

第一天,导师胡哥让我看看Open Web Application Security Project (OWASP)的Top ten。

A1: Injection                    
A2: Cross-Site Scripting (XSS)
A3: Broken Authentication and Session Management
A4: Insecure Direct Object References
A5: Cross-Site Request Forgery (CSRF)
A6: Security Misconfiguration
A7: Insecure Cryptographic Storage
A8: Failure to Restrict URL Access
A9: Insufficient Transport Layer Protection
A10: Unvalidated Redirects and Forwards

A1:注入
A2:跨站脚本(XSS)
A3:失效的认证和会话管理
A4:不安全的直接对象引用
A5:跨站请求伪造(CSRF)
A6:不当安全配置
A7:不安全的加密存储
A8:疏于限制URL存取
A9:传输层保护不足
A10:未经验证的重定向和转发

A1. 注入,是指SQL查询,XPath查询,LDAP查询,OS 命令,程序参数等。

SQL查询不多说,就是在程序将查询语言“select * from Admin”发到服务器去查询的时候,加个“select *  from Admin and 1=1”之类的语句,通过返回true还是false来查找猜解表名,列名和内容。

XPath注入攻击,这个我第一次听说。所谓XPath查询,是对XML文档的查询。比如说下面这个XML文档:
<bookstore>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
</bookstore>
实际上我们要查询书店中有多少本书,或者第几本书title是什么,或者author是谁之类的,用XPath查询很方便,代码如下:
<html>
<body>
<script type="text/javascript">
function loadXMLDoc(dname)
{
  if (window.XMLHttpRequest)
  {
       xhttp=new XMLHttpRequest();
  }
  else
  {
       xhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xhttp.open("GET",dname,false);
  xhttp.send("");
  return xhttp.responseXML;
}

xml=loadXMLDoc("/example/xmle/books.xml");
path="/bookstore/book/title"  //在这里填写查询语句,这句话的意思是查询所有的bookstore子节点book的子节点title...
// code for IE
if (window.ActiveXObject)
{
  var nodes=xml.selectNodes(path);

  for (i=0;i<nodes.length;i++)
  {
      document.write(nodes[i].childNodes[0].nodeValue);
      document.write("<br />");
  }
}
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
      var nodes=xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null);
      var result=nodes.iterateNext();

      while (result)
      { 
         document.write(result.childNodes[0].nodeValue);
         document.write("<br />");
         result=nodes.iterateNext();
      }
}
</script>

</body>
</html>
结果如下:
Harry Potter
Everyday Italian
这就完成了一次XPath查询。那么XPath攻击原理是什么呢?
请看下面这代码:
import java.io.IOException;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.*;
import javax.xml.xpath.*;

public class XpathInjectionExample {

  
       public boolean doLogin(String loginID, String password)
             throws ParserConfigurationException, SAXException,IOException, 
		    XPathExpressionException {

         DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
         domFactory.setNamespaceAware(true);
         DocumentBuilder builder = domFactory.newDocumentBuilder();
         Document doc = builder.parse("users.xml");

         XPathFactory factory = XPathFactory.newInstance();
         XPath xpath = factory.newXPath();
		 
         XPathExpression expr = xpath.compile("//users/user[loginID/text()='"+loginID+"' 
and password/text()='"+password+"' ]/firstname/text()");
         
		 Object result = expr.evaluate(doc, XPathConstants.NODESET);
         NodeList nodes = (NodeList) result;
         //print first names to the console 
         for (int i = 0; i < nodes.getLength(); i++) {
             System.out.println(nodes.item(i).getNodeValue());}
             
         if (nodes.getLength() >= 1) {               
              return true;}
              else
             {return false;}
     }
}
这是一段验证用户登陆的代码,用户的资料放在xxx.xml中,请注意看这句:
   XPathExpression expr = xpath.compile("//users/user[loginID/text()='"+loginID+"' 
and password/text()='"+password+"' ]/firstname/text()");
如果用户在填写用户名和密码的时候,用:' or 1=1 ,那么实际上执行的语句是:
//users/user[loginID/text()="" or 1=1 and password/text()="" or 1=1]/firstname/text() 
返回的是true,用户成功登入,完成一次攻击前奏。可是,谁会把用户名和密码放在服务器的某个xml文件中呢?为什么不放在数据库中呢?和蓝蓝谈论了下,感觉xml除了在传输方面有点意思外,存储比不上数据库。

LDAP(Lightweight Directory Access Protocol)查询,这个在上课听老师讲过。好像和目录,服务器有关,完全不懂啊。
攻击者能够修改LDAP声明,这一进程将运行与组件执行的命令相同的权限。(如数据库服务器、Web应用服务器、Web服务器等)。这可能会导致严重的安全问题,如可以查询权限外信息的权利,修改或删除LDAP树里面的任何信息。
语法:(&(name=Qiqi)(|(city=Beijing)(city=Shanghai)))
意思:选出名字为qiqi并且住在北京或上海的人。
有意思的是 &(and)和 |(or) 的用法是放在括号前面。然后每个条件都要用括号括起来。

A2. XSS 跨站脚本

攻击者通常通过页面表单提交注入到web应用中并最终在用户的浏览器客户端执行。
这里有40种XSS攻击脚本


A3:失效的账户和会话管理

有良好的访问控制并不意味着万事大吉,企业还应该保护用户的密码、会话令牌、账户列表及其它任何可为攻击者提供有利信息、能帮助他们攻击企业网络的内容。开发人员需要经常构建自定义身份验证和会话管理计划,但正确建立这些是很难的。因此,这些自定义的计划经常有缺陷等方面的注销,密码管理,超时,请记住我的秘密问题,帐户更新,寻找这种缺陷有时是困难的,因为每个执行是唯一的。

SessionID暴露在URL地址栏,timeout机制没做好导致攻击者能在用户关闭tab标签后一段时间内使用,等等。


A4:不安全的直接对象引用

在url中,不能看到能猜测的key,比如数据库中的自增长id,比如看到3,很容易猜测下个是4,尽量使用guid,考虑到int类型的primary key在数据库分析中的方便性,所以同时增加int和guid类型的primary key
业务对象表:技术主键ID(Int)+对外引用ID(Guid)
application layer: 增加一些HashTable==> Guid-->Int 对应关系全局缓存, 程序设计中在Get/Update/Delete方法中需要注意同步这些key

Ps:guid是什么?GUID 值比id较长,不容易记忆和输入,而且这个值是随机、无顺序的。
GUID 的值有 16 个字节,与其它那些诸如 4 字节的整数相比要相对大一些。这意味着如果在数据库中使用 uniqueidentifier 键,可能会带来两方面的消极影响:存储空间增大,索引时间较慢。
int自动增字段的优点:占用空间小、无需开发人员干预、易读;
                     缺点:效率低,数据导入导出的时候很痛苦。
Guid的优点:效率高,数据导入导出方便;缺点是占用空间大,不易读。
业界主流倾向使用Guid作主键。因为主键一般不是给外人看的,而且现在硬盘空间越来越大,不在乎这一点空间。


A5:跨站请求伪造(CSRF)

攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全

大神浅谈CSRF攻击方式

A6:不当安全配置

所有的web app架构都有可能存在不当安全配置,比如说:某个app的网站资料库使得的是预设定的密码,而开发者没有在网站部署到真实的Internet的时候更改,导致容易被攻击,特别是现在开源项目这么多,如FCMS的后台密码都是默认admin,admin,如果部署后没更改的话就悲剧了。

A7:不安全的加密存储

现在的不少web app使用MD5加密算法,可是已经有彩虹表能够破解14位以内的数字+字母了,这意味着MD5等密码安全性降低了。应该要采用更加难破解的算法。

A8:疏于限制URL存取

像wiki和B log这种开源的项目(不开源也有)都可以访问到某些URL。这样不行哦~

A9:传输层保护不足

网页没在传输层提供安全加密机制,或者使用过期的无效的凭证,使加密不可信赖。
比如:攻击者窃听无线网络,窃取cookie;网站凭证无效,用户容易进入钓鱼网站。

Ps:钓鱼网站是一种网络欺诈行为,指不法分子利用各种手段,仿冒真实网站的URL地址以及页面内容,或者利用真实网站服务器程序上的漏洞在站点的某些网页中插入危险的HTML代码,以此来骗取用户银行或信用卡账号、密码等私人资料。


A10:未经验证的重定向和转发

就是重定向或者转发的时候没有验证,导致攻击者构造如下url,把用户导向钓鱼网站或恶意网站
http://example.cc/redir.jsp?url=evil.com
http://example.cc/func.jsp?fwd=admin.jsp 
http://g.msn.com/9SE/1?http://xxx.com

更多资料:http://www.openfoundry.org/news/2354

你可能感兴趣的:(我在江北学安全(一))