Python学习记录(七):多线程v3&网络爬虫
Opened this issue · 0 comments
PyxYuYu commented
Silence is a true friend who never betrays.
0x01 Wooyun
- 任意文件上传
Java
反序列化命令执行SQL
注入JSON
注入- 弱口令登录后,后台查询的地址存在
SQL
注入
- 修复weblogic的JAVA反序列化漏洞的多种方法
- 方法一:使用
SerialKiller
替换进行序列化操作的ObjectInputStream
类 - 方法二:在不影响业务的情况下,临时删除掉项目里面的
org/apache/commons/collections/functors/InvokerTransformer.class
文件 - 但是以上两种方法都无法保证对业务有没有影响
weblogic
和websphere
是金融行业中使用较多的企业级JAVA中间件weblogic
的占有率更高websphere
的JAVA
反序列化漏洞需要访问8880
端口,该端口为wsadmin
服务端口,不应该暴露在公网。weblogic
的JAVA
反序列化漏洞能直接控制服务器,危害大,且通常只有一个服务端口,无法通过禁用公网访问特定端口来修复漏洞
- 方法一:使用
0x02 爬虫实战一
- 多线程之队列
Queue
- 队列其实类似列表,但是比列表要高效
- 线程安全,无需用锁
Lock
task_done()
意味着之前入队的一个任务已经完成,由队列的消费者线程调用,每一个get()
调用得到一个任务,接下来的task_done()
调用告诉队列该任务已经处理完毕,队列的大小就会减少1。如果当前一个join()
正在阻塞,它将在队列中等待直到所有任务处理完时(队列大小为0)恢复执行(即每个由put
调用入队的任务get
后都有一个对应的task_done()
调用)
global
全局变量- 全局变量的声明如果需要在类中的话,如果在类中的函数内调用,那就在函数内声明
- 如在
run()
中,那么就在这个之内声明
difflib
这个模块提供了用于比较序列的类和函数,可以用于比较文件,例如,使用并可以产生各种格式,包括HTML
和上下文和统一的差异的差异信息- BeeBeeto 多线程基本实现
- 一个线程类:获取POC和POCURL
- 另一个线程类:利用POCURL队列获取POC具体内容保存
- 第一个线程开启13条
- 第二个线程开启191条(从队列中获取,没有循环获取)
- 从队列中获取的时候,因为没用
while
循环获取,所以每个线程都做一个工作,只能指定线程数量去并发地执行
class SavePoc(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
poc_path = './BeeBeeto'
# 方法一 : 需要开启191条线程
# url_poc = url_queue.get()
# each_name = name_queue.get()
# poc_detail = url_soup(url_poc).find_all('pre')
# for each_detail in poc_detail:
# 针对文件名中不能出现的几个符号正则替换成空
# r = re.compile('[/\?\\<>:\*]')
# poc_name = r.sub('', each_name.string) + '.txt'
# poc_save(poc_path, poc_name, each_detail.string.encode('utf-8'))
# url_queue.task_done()
# name_queue.task_done()
# 方法二 : 使用while循环就可以自己设定线程数
while True:
# 开多少条线程,name_queue.qsize就从哪开始
# 比如开100条,那么size直接从91开始,因为100条先内带了100个name
if name_queue.qsize() > 0:
poc_name = ''
url_poc = url_queue.get()
each_name = name_queue.get()
poc_detail = url_soup(url_poc).find_all('pre')
for each_detail in poc_detail:
# 针对文件名中不能出现的几个符号正则替换成空
r = re.compile('[/\?\\<>:\*]')
poc_name = r.sub('', each_name.string) + '.txt'
poc_save(poc_path, poc_name, each_detail.string.encode('utf-8'))
print 'saving ' + poc_name
url_queue.task_done()
name_queue.task_done()
print name_queue.qsize()
else:
break
- 多线程就是需要考虑到每条线程的工作,线程之间运行时候是否有连带关系,是否会动用同一资源
- 队列运用的时候,记得完成一个队列任务的时候,需要
task_done()
关闭这个get
调用,队列很安全 - 命令行参数
sys
模块- 参数个数:
len(sys.argv)
- 脚本名: sys.argv[0]
- 参数1: sys.argv1
- 参数2: sys.argv[2]
0x03 一天总结
- 多线程和队列的共同运用和理解,每个线程干活之间的联系
- 线程阻塞、队列阻塞、队列的安全性、队列任务完成,结束任务
- 多个线程处理一个队列,
while
循环