python 到 poc

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))

更新中:

看完点赞关注不迷路!!! 后续继续更新优质安全内容!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

b1gpig安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值