0x01 起因

因为手速慢,漏洞刷不过别人,一个个手补确实慢,所以想自己写一个api,一键抓取zoomeye的20页,然后就可以打批量了 ovo(真是太妙了!)

0x02 动工

      1.抓包做准备

要做一个抓取的,当然是先抓包啦~

拿出我的bp~

先输入一个关键字,方便在bp里面找我输入的关键字

然后回车~

发现我输入的关键字在这个GET的请求包里面,但是他到底是不是呢?

发送到repeat模块看看呗

       2.使用php的curl来模拟访问

PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。

libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传代理cookies和用户名+密码的认证

PHP中使用cURL实现GetPost请求的方法

这些函数在PHP 4.0.2中被引入。

就是说,在php4.0.2中就已经引入了curl,而且还可以做post和get,真是太有用了有木有

拿出我刚刚记录好的请求包~

GET /search?q=keywords&p=1 HTTP/1.1

Host: www.zoomeye.org

Connection: close

Accept: application/json, text/plain, */*

Sec-Fetch-Dest: empty

Cube-Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6I**tVkRTd29sX0d2cXo4clFYX1VkZ3ExZUV3Y2MiLCJlbWFpbCI6IjEyMDU4NjY5ODVAcXEuY29tIiwiZXhwIjoxNTg5MDc5MzA3LjB9.Vj0nd-tC3Z8FIg0TvBuNgsoksv4RtS9ryDaTr5TDYa0

User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36

Sec-Fetch-Site: same-origin

Sec-Fetch-Mode: cors

Referer: https://www.zoomeye.org/searchResult?q=keywords

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9

Cookie: __root_domain_v=.zoomeye.org; _qddaz=QD.hhi2ek.7ofq41.k9nl84mk; __jsluid_s=68ead3868c48be189ad9a36aedae89b2; Hm_lvt_3c8266fabffc08ed4774a252adcb9263=1588484284,1588486025,1588992857,1588992907; _qddab=3-qc83zy.k9z1clvv; __jsl_clearance=1589003429.168|0|QzmwnseUa6LsD9SPada9A%2F68MUg%3D; Hm_lpvt_3c8266fabffc08ed4774a252adcb9263=1589003970

然后用php语言来描述他:

<?php
function curl_post($url) {/*-----------------SET   COOKIE-------*/$cookies=' __root_domain_v=.zoomeye.org; _qddaz=QD.hhi2ek.7ofq41.k9nl84mk; __jsluid_s=68ead3868c48be189ad9a36aedae89b2; Hm_lvt_3c8266fabffc08ed4774a252adcb9263=1588484284,1588486025,1588992857,1588992907; _qddab=3-qc83zy.k9z1clvv; __jsl_clearance=1588999664.016|0|HlMEMiGt3peQ%2FyF5pwOoAVi7Hhg%3D; Hm_lpvt_3c8266fabffc08ed4774a252adcb9263=1588999939';/*-----------------SET COOKIE---------*/$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HEADER, TRUE);$headers = array();$headers[] = 'Host:www.zoomeye.org';$headers[] = 'Connection: close';$headers[] = 'Accept: application/json, text/plain, */*';$headers[] = 'Sec-Fetch-Dest: empty';/**/$headers[] = 'Cube-Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6I**tVkRTd29sX0d2cXo4clFYX1VkZ3ExZUV3Y2MiLCJlbWFpbCI6IjEyMDU4NjY5ODVAcXEuY29tIiwiZXhwIjoxNTg5MDc5MzA3LjB9.Vj0nd-tC3Z8FIg0TvBuNgsoksv4RtS9ryDaTr5TDYa0';$headers[] = 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36';$headers[] = 'Sec-Fetch-Site: same-origin';$headers[] = 'Sec-Fetch-Mode: cors';$headers[] = 'Referer: https://www.zoomeye.org/searchResult?q=%22Office%20Anywhere%202017%22';$headers[] = 'Accept-Language: zh-CN,zh;q=0.9';$headers[] = 'Cookie: '.$cookies;$headers[] = 'If-None-Match: W/"3828048cfa646c65b99b190eb8c4418ee44f4da2"';curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);$output= curl_exec($ch);curl_close($ch);return $output;
}
$a=curl_post('https://www.zoomeye.org/search?q=keywords&p=1');
vardump($a);
?>

这样子就可以完成一次php中curl对zoomeye的请求了

curl_setopt($ch, CURLOPT_URL, $url);

这句是设定请求的url

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

这两句是忽略ssl证书

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

这句是确定返回形式 差不多就是0为直接打印屏幕,1为返回到具体变量里面

curl_setopt($ch, CURLOPT_HEADER, TRUE);

保留head

  最后就会把返回值$a打印在屏幕上了

来看看效果

可能有的小伙伴会问 可是返回的是这个啊


别急啊,右键去看看源代码

这时候就和之前的用bp的返回的值一模一样了

只要取出ip +port就行了 大功告成

这里有两种方法:

1.先从请求包里面取出json数组进行解析

2.直接用正则全局匹配

我用的是第二种方法

因为我这边json解析老是出问题,所以用了正则:

                $pattern = '/"ip": "(.*?)"(.*?)", "geoinfo(.*?)/i';preg_match_all($pattern, $a, $match);

                           这样子就能把之前的a中的ip取出来了

然后只要再取一次port,把两个进行拼接就行了

                $patternone = '/"port":(.*?)(.*?), "service"(.*?)/i';preg_match_all($patternone, $a, $match1);

               但是其实这样子取出来的,还是port":xxx ,"service"的形式,所以用取文本的函数进行二次过滤:

             function getSubstr($str, $leftStr, $rightStr) {$left = strpos($str, $leftStr);$right = strpos($str, $rightStr,$left);if($left < 0 or $right < $left) return '';return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr));}

                         然后只要getSustr取出来就行了,但是正则以后的数据是存放在match数组里面的,所以用for循环来循环取出放到新数组port里面

                for ($i=0;$i<=count($match1[0]);$i++) {$port[$i]=getSubstr($match1[0][$i],'"port": ',', "service');}

然后进行拼接:

             for ($i=0;$i<=$ccc;$i++) {$url[$i]=$match[1][$i];if(checkIp($url[$i])) {echo addslashes($url[$i].':'.$port[$i].'</p>');}}

checkip是检查ip那个数组的ip合法性

不然会有奇怪的东西跟进来

0x03所以完整代码如下:

<?php
function getSubstr($str, $leftStr, $rightStr) {$left = strpos($str, $leftStr);$right = strpos($str, $rightStr,$left);if($left < 0 or $right < $left) return '';return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr));
}
function checkIp($ip) {$arr = explode('.',$ip);if(count($arr) != 4) {return false;} else {for ($i = 0;$i < 4;$i++) {if(($arr[$i] <'0') || ($arr[$i] > '255')) {return false;}}}return true;
}
function curl_post($url) {/*-----------------SET   COOKIE-------*/$cookies=' __root_domain_v=.zoomeye.org; _qddaz=QD.hhi2ek.7ofq41.k9nl84mk; __jsluid_s=68ead3868c48be189ad9a36aedae89b2; Hm_lvt_3c8266fabffc08ed4774a252adcb9263=1588484284,1588486025,1588992857,1588992907; _qddab=3-qc83zy.k9z1clvv; __jsl_clearance=1588999664.016|0|HlMEMiGt3peQ%2FyF5pwOoAVi7Hhg%3D; Hm_lpvt_3c8266fabffc08ed4774a252adcb9263=1588999939';/*-----------------SET COOKIE---------*//*---------------set ca-------------*/$ca='eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6I**tVkRTd29sX0d2cXo4clFYX1VkZ3ExZUV3Y2MiLCJlbWFpbCI6IjEyMDU4NjY5ODVAcXEuY29tIiwiZXhwIjoxNTg5MDc5MzA3LjB9.Vj0nd-tC3Z8FIg0TvBuNgsoksv4RtS9ryDaTr5TDYa0';/*----------------end ---set-------------*/$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HEADER, TRUE);$headers = array();$headers[] = 'Host:www.zoomeye.org';$headers[] = 'Connection: close';$headers[] = 'Accept: application/json, text/plain, */*';$headers[] = 'Sec-Fetch-Dest: empty';/**/$headers[] = 'Cube-Authorization: '.$ca;$headers[] = 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36';$headers[] = 'Sec-Fetch-Site: same-origin';$headers[] = 'Sec-Fetch-Mode: cors';$headers[] = 'Referer: https://www.zoomeye.org/searchResult?q=%22Office%20Anywhere%202017%22';$headers[] = 'Accept-Language: zh-CN,zh;q=0.9';$headers[] = 'Cookie: '.$cookies;$headers[] = 'If-None-Match: W/"3828048cfa646c65b99b190eb8c4418ee44f4da2"';curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);$output= curl_exec($ch);curl_close($ch);return $output;
}
function get($page) {$flag=false;/*----------------SET KEYWORDS-------------*/$keywords='"phpStudy%20探针%202014%20"';/*-----------------\SET KEY WORDS!/-------------*/$store=array();$a=curl_post('https://www.zoomeye.org/search?q='.$keywords.'&p='.$page);$status=getSubstr($a,'{"status": ',', "matches"');if ($status!=200) {echo $status.'</p>'.'爬取频繁或cookie过期,请重新回到zoomeye输入验证码/重新获取cookie后继续爬取:<a href="https://www.zoomeye.org/searchResult?q='.$keywords.'">回到zoomeye</a>'.PHP_EOL;return true;} else {$pattern = '/"ip": "(.*?)"(.*?)", "geoinfo(.*?)/i';preg_match_all($pattern, $a, $match);$patternone = '/"port":(.*?)(.*?), "service"(.*?)/i';preg_match_all($patternone, $a, $match1);$port=array();for ($i=0;$i<=count($match1[0]);$i++) {$port[$i]=getSubstr($match1[0][$i],'"port": ',', "service');}$ccc=count($match[1]);for ($i=0;$i<=$ccc;$i++) {$url[$i]=$match[1][$i];if(checkIp($url[$i])) {echo addslashes($url[$i].':'.$port[$i].'</p>');}}}
}
for ($i=1;$i<=20;$i++) {sleep(2);$flag=get($i);if($flag) {break;}
}
?>

keywords,cookies,Cube-Authorization都要根据自己的zoomeye的请求包修改,因为我太菜了,不会做

最后附上成果:

[PHP]用PHP自己写一个zoomeye的api(偷懒必备quq)相关推荐

  1. 使用Node.js写一个简单的api接口

    引入Http模块 默认你已经安装了Node.js Node当中内置了Http模块: 可以使用 var http= require("http"); 复制代码 引入http模块: H ...

  2. 用Python写一个简单的api接口

    python框架有很多,例如:Flask,Django,FastAPI 等.本文将使用 Flask 来编写 API 接口. 安装Flask 首先,您需要安装 Flask: pip install fl ...

  3. 手写一个json格式化 api

    最近写的一个东西需要对json字符串进行格式化然后显示在网页上面. 我就想去网上找找有没有这样的api可以直接调用.百度 json api ,搜索结果都是那种只能在网页上进行校验的工具,没有api. ...

  4. 如何写一个合格的API文档

    一:为什么要编写API接口文档 API接口文档,是开发途中,让其他协作者共同调试的重要工具,就像操作手册,给你一个物品,你可能不知道怎么使用,但是如果有操作手册,就可以让一个刚拿到物品的人,快速的进行 ...

  5. html 网络请求 json数据,写一个json格式API,http请求接收json数据

    目前比较流行的公开API 大多都是返回json格式字符串.如何创建自己的基于http请求返回json数据的api? 如下: 返回JSON字符串的API 相关包:fastjson-1.2.2.jar 方 ...

  6. c语言装逼编程,教你用C语言写一个好玩的万年历,必备的装逼神器

    long int f(int year, int month) { if (month<3) return="" year="" -="&quo ...

  7. python github api_用python写一个GitHub Trending Api

    GitHub 给了开发者相当丰富的 API 接口 https://developer.github.com/v3/,包括认证,搜索,活动等接口,但就是没有提供获取 Trending 的接口.因此,需要 ...

  8. 用爬虫写一个 GitHub Trending API

    这学期打算做一个关于 GitHub 的 Android 应用,其中一个模块就是查看 GitHub 当天,当周,当月的热门项目和开发者.其实 GitHub 给了开发者相当丰富的 API 接口 devel ...

  9. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

最新文章

  1. 前端自动化构建工具webpack (二)之css和插件加载总结
  2. iOS 11开发教程(一)
  3. 每日一皮:如何把程序员骗到手!
  4. python 三元表达式 if for 构建List 进阶用法
  5. CBO Cost Formulas基于成本优化器的成本计算公式大全
  6. 高效的企业测试–测试框架(5/6)
  7. 爱因斯坦一生最伟大的问候
  8. NDR(网络威胁检测及响应)与NTA的区别(网络流量检测)
  9. script标签中的crossorigin属性
  10. Hive with as语法
  11. MIT6.006Lec03:插入排序,归并排序,递归树
  12. 盘点程序员必备的免费资源网站
  13. Docker学习笔记 1
  14. 诡异事件之--数据库存3.12E8 但是自动变成了31.00
  15. JavaScript如何运行
  16. 三级等保 MySQL8.0.24审计日志功能开启
  17. VMware安装Centos7_64位系统安装步骤
  18. Python 数据分析微专业课程--项目06 城市餐饮店铺选址分析
  19. 跟上节奏 大数据时代十大必备IT技能
  20. pool win10提示bad_如何解决Win10系统出现bad pool header蓝屏现象?

热门文章

  1. 基于FPGA的数字钟 ——最终实现
  2. 电源电路设计常用软件,哪个适合你的应用?
  3. 机器学习多分类器有哪些
  4. socket服务器区分各个客户端信息,socket服务器如何区分哪个客户端
  5. 高地址和低地址、高字节低字节、大小端模式(及如何互换),存储顺序(!!)
  6. SOC的定义、适用性和组成
  7. CSS 背景颜色 background-color属性
  8. 极简linux版本,4MLinux 26.0发布,这是一个极简版本
  9. 最常见的几种排序算法原理和C#实现类库
  10. 清明寄哀思,祭拜的是先人,释怀的是自己