0x01 特殊函数
0x02 模块
0x03 小工具开发记录
特殊函数
# -*- coding:utf-8 -*-
#内容见POC.demo; POC.demo2 ;
def add(x,y):
a=x+y
print(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 arguments
number = 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.yu
sys.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-8
lang='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 sys
print ("THE FILE NAME:"),sys.argv[0]
'''sys.argv是变量,专门向Python解释器传递参数,他的功能是获取程序外部向程序传递的参数'''
# coding = utf-8
import sys
def demo():
if len(sys.argv) < 2:
print 'no action'
sys.exit() # 退出当前程序
for i in range(len(sys.argv)):
print 'arg[' + str(i) + ']', sys.argv
if __name__ == '__main__':
demo()
'''sys.stdin, sys.stdout,sys.stderr
处理标准输入,标准输出, 标准错误'''
'''sys.stdout,标准输出,print的本质就是sys.stdout.write'''
import sys
for 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_json
demo_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 sys
url=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.py
import json
import re
import os
def read_config():
config_file = os.path.join("fofacms.json")
with open(config_file, 'r') as f:
mark_list = json.load(f)
return mark_list
class 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 True
if a is False:
return False
for 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 True
else:
return False
elif name == "title":
if content.lower() in self.title:
return True
else:
return False
raise 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 = None
if exp == "||":
c = a or b
elif exp == "&&":
c = a and b
stack.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 = False
tmp += z
if in_quote == 0:
for regx in builts:
if re.search(regx, tmp, re.I):
in_quote = 1
is_continue = True
break
elif in_quote == 1:
if z == "\"":
in_quote = 2
if is_continue:
continue
for i in special_sign:
if tmp.endswith(i):
if i == ")" and in_quote == 2:
# 查找是否有左括号
zuo = 0
you = 0
for q in exprs:
if q == "(":
zuo += 1
elif q == ")":
you += 1
if 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("\""):
continue
if _.strip() != "":
exprs.append(_.strip())
exprs.append(i)
tmp = ""
in_quote = 0
break
if 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:
break
else: # 比较运算符优先级,看是否入栈出栈
while True:
if stack and stack[-1] != '(':
post.append(stack.pop())
else:
stack.append(z)
break
while stack: # 还未出栈的运算符,需要加到表达式末尾
post.append(stack.pop())
return post
def fingerprint(body):
mark_list = read_config()
# title
m = 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()
break
except Exception:
print("fofacms error express:{} name:{}".format(express, name))
return whatweb
import requests
url = "https://x.hacking8.com"
print("识别:" + url)
resp = requests.get(url).text
print(fingerprint(resp))