PyxYuYu/MyBlog

Python学习记录(七):多线程v3&网络爬虫

Opened this issue · 0 comments

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文件
    • 但是以上两种方法都无法保证对业务有没有影响
    • weblogicwebsphere是金融行业中使用较多的企业级JAVA中间件
    • weblogic的占有率更高
    • websphereJAVA反序列化漏洞需要访问8880端口,该端口为wsadmin服务端口,不应该暴露在公网。
    • weblogicJAVA反序列化漏洞能直接控制服务器,危害大,且通常只有一个服务端口,无法通过禁用公网访问特定端口来修复漏洞
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 循环