0x01 特殊函数
0x02 模块
0x03 小工具开发记录
特殊函数
# -*- coding:utf-8 -*-
#内容见POC.demo; POC.demo2 ;def add(x,y):a=x+yprint(a)add(3,5)
print('------------引入lambad版本:')
add = lambda x,y : x+y
print(add(3,5))
#lambda函数,在lambda函数后面直接加变量,变量后直接冒号,冒号后面是表达式,完美解决
#lambda表达式:lambda arg1,arg2,....,argn : expression using argumentsnumber = range(-2,11)
print("map(函数)"),map(lambda x : x*2,number)
print("map(函数)"),map(lambda x : x**2,number)
'''**为次方'''
#map()函数 help(map) 查看功能: map(函数,序列对象)
#返回将函数应用于以下项的结果列表:参数序列。如果给出了多个序列,
#则函数调用时使用由相应每个序列的项,如果不是全部,则用“无”替换缺失的值序列具有相同的长度。
#如果函数为None,则返回序列的项(如果有多个序列,则为元组列表)。
numbers = range(-2,11)
print(number)
print("filter()函数:"),filter(lambda x:x>5,number)
#filter()函数help(zip)
‘’‘zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压)。’’’
a=[1,2,3]
b=[3,2,1]
print(zip(a,b))
c='hello'
d='123'
print(zip(c,d))
'''长度不等时,取长度最小的'''
demo1=['a','b','c']
demo2=['1','2','3']
demo3=zip(demo1,demo2)
demo=dict(demo3)
print(demo)
'''构造字典'''
如何导入模块:
'''
# 【1】导入整个模块
>>> import sys
>>> print sys.argv
['']
#【2】只导入我们要用到的
>>> from sys import argv
>>> print argv
['']
【3】模块名太长,可以起个别名
>>> import sys as s
>>> print s.argv
['']
【4】从模块中导入所有
>>> from sys import *
>>> print path #输出sys模块中的path
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat',
'/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
最后一种导入方法不建议使用,原因:若自己定义的变量或函数与所导入模块中的变量或函数同名,易产生混淆。
'''
# -*- coding:utf-8 -*-import sys
import test.xiongzhang
import test.yusys.path.append(r"C:\Users\30538\PycharmProjects\secure_POC\POC.demo.py")
import demo
r'''如果不是同目录用这种方法告诉Python解释器,我写的文件在哪里,
("C:\Users\30538\PycharmProjects\secure_POC\POC.demo.py")是我的文件路径然后就可以直接引入了
因为当Python解释器都去了.py的文件,先将它变成由字节码组成的pyc文件,然后这个pyc文件把文件给了一个叫Python虚拟机的东西运行继续深入'''
print(demo.lang)
print(dir(demo))
"""查看模块属性"""
print(__name__)
'''当作main程序执行'''
print(demo.__name__)
'''当作模块,即为模块的名称'''
# coding = utf-8lang='hello world'
#模块'''那么如何引用包中的库呢'''
#举个栗子建立一个目录为ichunqiu,里面放两个py文件
''''BaZong.py源码如下:'''
# #coding = utf-8
#
# def BaZong():
# print 'HELL0 MOMO!!!'
'''MoMo.py源码如下:'''
# coding = utf-8
# def MoMo():
# print
# 'HELL0 BaZong!!!'
‘’‘然后,咱们在与ichunqiu同级的目录中,创建一个demo.py调用这个ichunqiu的包’’’
# # coding = utf-8
#
# import ichunqiu.BaZong
# import ichunqiu.MoMo
#
# ichunqiu.BaZong.BaZong()
# ichunqiu.MoMo.MoMo()
模块
sys库
-*- coding: utf-8 -*import sysprint ("THE FILE NAME:"),sys.argv[0]
'''sys.argv是变量,专门向Python解释器传递参数,他的功能是获取程序外部向程序传递的参数'''
# coding = utf-8import sysdef demo():
if len(sys.argv) < 2:
print 'no action'
sys.exit() # 退出当前程序
for i in range(len(sys.argv)):
print 'arg[' + str(i) + ']', sys.argvif __name__ == '__main__':
demo()
'''sys.stdin, sys.stdout,sys.stderr
处理标准输入,标准输出, 标准错误'''
'''sys.stdout,标准输出,print的本质就是sys.stdout.write'''
import sysfor i in range(6):
print ('helloworld')
for i in range(6):
sys.stdout.write('worldhello\n')
‘’‘stdout是一个类文件对象,调用了他的write函数就可以打印任何的字符串了,他们不会自己为你添加回车,要自己添加\n但是只有write的办法,木有read的方法
还是由于是类文件对象,因此你可以讲任何类文件赋值,然后重定向输出
那可能会问,啥时重定向输出,简而言之,就是将输出内容从"控制台"转到"文件"’’’
import sys
print 'hello' #标准输出
demo = sys.stdout #重定向之前保存demo
demo2=open('test.txt','w')
sys.stdout = demo2
print 'world'
demo2.close()
sys.stdout = demo
demo3 = open('test.txt','r')
demo3.read()
‘’‘os模块’’’
import os
print dir(os)
print os.name #判断正在使用的平台,windows为’nt‘,linux为’posix‘
print os.getcwd() #获取当前目录
print os.listdir(r"C:\Users\30538\PycharmProjects\secure_POC\POC") #列出次目录下的文件
# os.mkdir("demo3") #在本目录下建立一个叫demo3的文件夹
#os.rmdir(“demo3”) # 删除demo3
#os.rename(“test.txt”,“test1.txt”) #修改文件名
#os.remove(“test1.txt”) # 删除该文件
‘’‘os库提供了在Python中使用操作系统的命令的方法就是用os.system()
以下是Winods系统’’’
comand = ‘dir’
os.system(comand)
‘’‘time模块’’’
'''time模块很常用的,比如说在延时注入中,就要用到他,他可以精确的知道程序的运行长短,老样子,常用的
'''
import time
print time.time() #获得当前时间的时间戳
print time.clock() # 获取进程时间
print time.localtime() #时间戳转换成当地时间
print time.asctime() #元组表示时间:Wed Sep 15 21:43:14 2021
‘’‘json模块’’’
‘’‘说到传递数据,咱们会想到什么呢?XML和JSON
JSON(JavaScript Object Notation, JS 对象标记)
是一种轻量级的数据交换格式。
它基于 ECMAScript (w3c制定的js规范)的一个子集,
采用完全独立于编程语言的文本格式来存储和表示数据。
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析和生成,
并有效地提升网络传输效率。’’’
‘’‘Python标准库中有JSON模块,主要是两个功能,序列化(encoding)与反序列化(decoding)
encoding操作 :dumps()’’’
import json
data=[{"username":"admin",'content':('aaa','bbb'),"password":"pwd"}]
print data
data_json=json.dumps(data) # 将data进行格式的编码转换
print data_jsondemo_data=json.loads(data_json)
print demo_data
'''dumps是将dict转化成str格式,loads是将str转化成dict格式。
dump和load也是类似的功能,只是与文件操作结合起来了。'''
‘’‘hashlib模块’’’
'''Python中的hashlib库提供了大量的摘要算法,又叫散列算法'''
import hashlib
md5 = hashlib.md5()
md5.update('admin')print md5.hexdigest()
# update() 方法用于更新字典中的键/值对,可以修改存在的键对应的值,也可以添加新的键/值对到字典中。
‘’‘random模块’’’
import random
print ('属性:'),dir(random) #展示属性
print random.random() #生成大于等于0,小于等于1的随机浮点数
print random.uniform(88,99) #88到99的随机浮点数
print random.randint(88,99) #88~99间的整数
print random.choice('xing') #生成xing之中的随机字符
demo=[1,3,4,6]
random.shuffle(demo) #打乱数字
print demo
‘’‘requests模块’’’
import requests
print(dir(requests))
demo = requests.get("http://www.baidu.com") #请求实例
print(demo.cookies) #获取cookie
print(demo.headers) #获取头部信息
print((demo.status_code)) #查看http状态码
print(demo.text)# 查看网页内容
print(demo.content) #以二进制打开服务器返回数据
print("post请求\n")
payload = {'key1':'value1','key2':'value2'}
r = requests.post("http://www.baidu.com",data=payload) #发送post请求
print(r.text)
#data被赋值了之后,结果中才会多了form值,而form值就是post给服务器的内容
‘’‘get请求’’’
# import requests
#
# url="http://127.0.0.1/brute/brute/brute_get.php" #假设网站有一个登陆界面
# payload = {'usernam':'admin','password':'admin','submit':'登陆'} #url中的参数
# r = requests.get(url,params=payload) #params参数收集传入是不定个数的参数,并将收集的到参数以元组的方式存储在params中,如果没有传入参数params就是个空元组
# result = r.content
# if str(result).find('succ'): #str将二进制数据转化成字符串
# print("admin:admin"+'successful')
‘’‘post请求’’’
import requests
url="http://127.0.0.1/brute/brute/brute_get.php"
data = {'usernam':'admin','password':'admin','submit':'登陆'}
r = requests.post(url,data=data)
print(r.status_code)
if r.test.find('succ'):
print('admin:admin'+'successful')
‘’‘pillow模块’’’
‘’‘免费的图像处理工具包,是python下的图像处理模块,支持多种格式,
并提供强大的图形与图像处理功能。对于简单的图像处理或者大批量的简单图像处理任务,
pPillow是PIL的一个派生分支,但如今已经发展成为比PIL本身更具活力的图像处理库。
pillow可以说已经取代了PIL’’’
import pillow
print(dir(pillow))
小工具记录:
目录扫描:
‘’‘目录扫描’’’
import requests
import sysurl=sys.argv[1]
with open("dir.txt","r")as f:
for line in f.readlines():
line = line.strip()
r = requests.get(url+line)
if strr.status_code == 2*:
print("url:"+r.url+"exist")
使用说明:将字典文件放在同目录下,
Terminal命令:python poc6.py
https://www.baidu.com/
计算目标网站的icon hash值用于搜素工具搜索:atp-get install python-dev
pip install mmh3
pip install requests
编写python脚本
vim icon_hash.py
import mmh3
import requests
response = requests.get(‘https://xxx.xxx.xxx/favicon.ico’)
favicon = response.content.encode(‘base64’)
hash = mmh3.hash(favicon)
print hash
指纹识别:
(指纹自己收集一波,暂时先不放了。。。。。太长了)
#!/usr/bin/env python3# -*- coding: utf-8 -*-# @Time : 2019/7/27 10:00 PM# @Author : w8ay# @File : fofacms.pyimport jsonimport reimport osdef read_config():config_file = os.path.join("fofacms.json")with open(config_file, 'r') as f:mark_list = json.load(f)return mark_listclass Fofacms:def __init__(self, html, title):self.html = html.lower()self.title = title.lower()def get_result(self, a):builts = ["(body)\s*=\s*\"", "(title)\s*=\s*\""]if a is True:return Trueif a is False:return Falsefor regx in builts:match = re.search(regx, a, re.I | re.S | re.M)if match:name = match.group(1)length = len(match.group(0))content = a[length: -1]if name == "body":if content.lower() in self.html:return Trueelse:return Falseelif name == "title":if content.lower() in self.title:return Trueelse:return Falseraise Exception("不能识别的a:" + str(a))def calc_express(self, expr):# title="NBX NetSet" || (header="Alternates" && body="NBX")# 1||(2&&3) => 1 2 3 && ||# header="X-Copyright: wspx" || header="X-Powered-By: ANSI C"# header="SS_MID" && header="squarespace.net"expr = self.in2post(expr)# print("后缀表达式", expr)stack = []special_sign = ["||", "&&"]if len(expr) > 1:for exp in expr:if exp not in special_sign:stack.append(exp)else:a = self.get_result(stack.pop())b = self.get_result(stack.pop())c = Noneif exp == "||":c = a or belif exp == "&&":c = a and bstack.append(c)if stack:return stack.pop()else:return self.get_result(expr[0])def in2post(self, expr):""" :param expr: 前缀表达式:return: 后缀表达式Example:1||(2&&3) => 1 2 3 && ||"""stack = [] # 存储栈post = [] # 后缀表达式存储special_sign = ["&&", "||", "(", ")"]builts = ["body\s*=\s*\"", "title\s*=\s*\""]exprs = []tmp = ""in_quote = 0 # 0未发现 1发现 2 待验证状态for z in expr:is_continue = Falsetmp += zif in_quote == 0:for regx in builts:if re.search(regx, tmp, re.I):in_quote = 1is_continue = Truebreakelif in_quote == 1:if z == "\"":in_quote = 2if is_continue:continuefor i in special_sign:if tmp.endswith(i):if i == ")" and in_quote == 2:# 查找是否有左括号zuo = 0you = 0for q in exprs:if q == "(":zuo += 1elif q == ")":you += 1if zuo - you < 1:continue# print(": " + tmp + " " + str(in_quote))length = len(i)_ = tmp[0:-length]if in_quote == 2 or in_quote == 0:if in_quote == 2 and not _.strip().endswith("\""):continueif _.strip() != "":exprs.append(_.strip())exprs.append(i)tmp = ""in_quote = 0breakif tmp != "":exprs.append(tmp)if not exprs:return [expr]# print("分离字符", exprs)for z in exprs:if z not in special_sign: # 字符直接输出post.append(z)else:if z != ')' and (not stack or z == '(' or stack[-1] == '('): # stack 不空;栈顶为(;优先级大于stack.append(z) # 运算符入栈elif z == ')': # 右括号出栈while True:x = stack.pop()if x != '(':post.append(x)else:breakelse: # 比较运算符优先级,看是否入栈出栈while True:if stack and stack[-1] != '(':post.append(stack.pop())else:stack.append(z)breakwhile stack: # 还未出栈的运算符,需要加到表达式末尾post.append(stack.pop())return postdef fingerprint(body):mark_list = read_config()# titlem = re.search('<title>(.*?)<\/title>', resp, re.I | re.M | re.S)title = ""if m:title = m.group(1).strip()fofa = Fofacms(body, title)whatweb = ""for item in mark_list:express = item["rule"]name = item["name"]# print("rule:" + express)try:if fofa.calc_express(express):whatweb = name.lower()breakexcept Exception:print("fofacms error express:{} name:{}".format(express, name))return whatwebimport requestsurl = "https://x.hacking8.com"print("识别:" + url)resp = requests.get(url).textprint(fingerprint(resp))