前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >真香系列-JSFinder实用改造

真香系列-JSFinder实用改造

作者头像
Gamma实验室
发布2021-02-12 13:46:10
2K0
发布2021-02-12 13:46:10
举报
文章被收录于专栏:Gamma安全实验室

1.前言

JSFinder是一款优秀的github开源工具,这款工具功能就是查找隐藏在js文件中的api接口和敏感目录,以及一些子域名。

代码语言:javascript
复制
github链接:https://github.com/Threezh1/JSFinder

用于提取的正则表达式参考了LinkFinder

SFinder获取URL和子域名的方式:

一些简单的使用方式:

简单爬取

代码语言:javascript
复制
python JSFinder.py -u http://www.mi.com

#这个命令会爬取 http://www.mi.com 这单个页面的所有的js链接,并在其中发现url和子域名

深度爬取

代码语言:javascript
复制
python JSFinder.py -u http://www.mi.com -d

#深入一层页面爬取JS,时间会消耗的更长,建议使用-ou 和 -os来指定保存URL和子域名的文件名
python JSFinder.py -u http://www.mi.com -d -ou mi_url.txt -os mi_subdomain.txt

批量指定URL/指定JS

指定URL:

代码语言:javascript
复制
python JSFinder.py -f text.txt

指定JS:

代码语言:javascript
复制
python JSFinder.py -f text.txt -j

可以用brupsuite爬取网站后提取出URL或者JS链接,保存到txt文件中,一行一个。

指定URL或JS就不需要加深度爬取,单个页面即可,等等,这可以去github上面看使用说明。

2.改造

2.1 为什么要改造这个东西?

因为我经常使用这款工具,我发现了很多不足之处,比如说,如果爬取一个大型一点的,会发现很多url,接口,但是大多数都是404,没有用处的,就是通过人工去筛选就得费好长一段时间,我有一次爬下来了1200多条,密密麻麻............................

所有我的设想是可以增加一个验证模块,进行简单的验证,扔掉那些不存在的url链接,减少人工的筛选。

2.2 找到源码一顿改(验证模块)

改源码一定要找到关键点改,我这里直接在它进行数据处理的时候加入我想要的东西:

代码语言:javascript
复制
    thread_num = 0
    info = '访问成功'
    lock = threading.Lock()
    if urls == None:
      return None
    find_url_all_num = len(urls)
    content_url = ""
    content_subdomain = ""
    if self.args.verify !=0:
      print("A total of Find " + str(len(urls)) + " URL:\n")
      print("-----------------------But further validation is needed-----------------!\n\n\n")
      domian_text = requests.get(domian,verify =False).text
      print("The length of the page currently visited =>"+str(len(domian_text)))
      result ={}
      for url in urls:
        thread_num += 1
        self.therads_op(url, content_url, lock,thread_num,result)
        if thread_num == 100:
          time.sleep(1)
      find_url_success_num = 0
      for length,url_list in result.items():
        print("-----------------------The return packet length is :{len}------------------------".format(len =length))
        for url in url_list:
          print(url+"\n")
          find_url_success_num += 1
          content_url+=url+"\n"

关键的一些代码,这里因为使用了网络验证,所以写了个多线程:

代码语言:javascript
复制
  def therads_op(self,url,content_url,lock,thread_num,result):
    threading.Thread(target=self.request(url,content_url,lock,result),args=(url,content_url,lock,result,))
    if lock.acquire():
      thread_num -= 1
    lock.release()

验证模块:

代码语言:javascript
复制
def request(self,url,content_url,lock,result):
   headers = {
      "User-Agent": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
   }
   try:
      resp = requests.get(url,verify = False,timeout = 10,headers=headers)
      if resp.status_code != 404 and lock.acquire():
         content_url += url + "\n"
         if result.get(str(len(resp.text)), 0) == 0:
            result[str(len(resp.text))] = []
            result[str(len(resp.text))].append(url)
         else:
            result[str(len(resp.text))].append(url)
         lock.release()

   except Exception as e:
      pass
   finally:
      try:
         lock.release()
      except RuntimeError as e:
         pass

这里我是直接判断它返回值是不是404,当然你也可以加入你自己的判断条件,可以看到我的源码里,有计数返回包的长度,因为我发现很多包的返回包都是一样的,所以我这里判断长度,进行归类,有利于我们自己人工筛选,我们只需要得到任意长度的一个url返回包,就可以知道其他有着相同长度的url返回的内容(这就是我当时的想法吧)

2.3 找到源码一阵改(输出数据格式)

因为原工具是有把输出结果输出到一个文件的功能,但是我感觉不够直观,所以我把输出结果转换成了html文件,可以直接点击url,进行访问,方便了很多。

代码语言:javascript
复制
if self.args.output_html !=None:
   table_tr0 = ''
   html = html_Template()
   total_str = '共url: %s,访问成功:%s,失败 %s' % (find_url_all_num, find_url_success_num, find_url_all_num-find_url_success_num)
   if self.args.verify !=0:
      for length,url_list in result.items():
         for url in url_list:
            url_a = "<a href={url}>点击</a>".format(url=url)
            table_td = html.TABLE_TMPL % dict(length=length, url=url, result=info,
                                      ask_url=url_a, )
            table_tr0 += table_td
   else:
      for url in urls:
         url_a = "<a href={url}>点击</a>".format(url=url)
         table_td = html.TABLE_TMPL % dict(length="无法获取", url=url, result=info,
                                   ask_url=url_a, )
         table_tr0 += table_td
   output = html.HTML_TMPL % dict(domain=self.args.url,value=total_str, table_tr=table_tr0, )
   # 生成html报告
   filename = '{date}_{url}.html'.format(date=time.strftime('%Y%m%d%H%M%S'),url = self.args.output_html)
   dir = str(os.getcwd())
   filename = os.path.join(dir, filename)
   with open(filename, 'wb') as f:
      f.write(bytes(output, "utf-8"))

我把源码改成了一个类的形式,有利于以后的加入到大项目中,积小成多!

2.4 效果预览

在没有加验证参数的情况下:

开启验证的情况下:

3.总结

本来还想加一个爬虫模块进去的,但是作者有自己的爬虫模块,就算了,如果可以的话,也可以把一些优秀的开源爬虫加进去,就真的很nice了,我以后再加把,先这样吧,运行有什么问题可以及时联系我,越改越实用。

挺香的!真香,找个机会把源码放到github上面去:

exe程序百度云链接:

代码语言:javascript
复制
链接:https://pan.baidu.com/s/17WIa94fr5EAHgfo4UI6Eyw 
提取码:qq0c 
复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V3的分享

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Gamma安全实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单爬取
  • 深度爬取
  • 批量指定URL/指定JS
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档