九零登录

[【通过】] 【已转正】PHP调用BingSearchAPI实现C段查询

[复制链接]
发表于 2016-7-31 19:05:23 | 显示全部楼层 |阅读模式
前言:
最近在看PHP,然后准备学下php的代码审计,这几天突然想写出一个查询C段的,努力了几天终于写出来了,如果代码有写的不足的地方还望表哥们多多指教。


0x01.注册API
首先我们需要注册一个API
地址:https://datamarket.azure.com/dataset/bing/search
注册并登陆微软账号后会自动跳转到这个页面,注意这里国家地区不能选中国,否则下面会出现你的地区未提供该服务的字样。
1.png
接下来注册即可。
2.png
在账户信息那里可以查看 key
3.png


0x02.如何调用API


https://datamarket.azure.com/dataset/explore/bing/search  此网址可以直接使用该API

4.png
API的调用地址为: https://api.datamarket.azure.com/Bing/Search/v1/Web?Query=


这里面有几个参数需要注意。


Query参数传入要查询的ip  注意格式为Query='ip:xxx.xx.xx.xx'
format参数为返回数据的类型 一般我们返回json数据   注意调用前必须加$号 如:$format=json
top参数为显示的条数,调用前也必须加$号 如:$top=10
skip参数为从第几条开始查询, 调用也要加$号 如:$skip=0




调用此API 需要使用HTTP BASIC认证。需要提供用户名和密码,格式为 用户名:密码 而且要经过base64加密。
用户名为空,密码为我们先前获取的key 就可以了。也可以用户名和密码都为key。



0x03.简单实现


首先我们先拿 file_get_contents 简单实现一下。

[PHP] 纯文本查看 复制代码
<?php
$text="www.fuiou.com";
//通过域名获取ip
$ip=gethostbyname($text);
//key
$key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$url =  "https://api.datamarket.azure.com/Bing/Search/v1/Web?\$format=json&Query=";

//base64加密
$key= base64_encode(":".$key);

//设置请求头 Basic认证
$context = stream_context_create(array(
'http' => array(
             'header'  => "Authorization: Basic {$key}"
          )
     ));
//拼接完整url
$request = $url.urlencode('\'ip:'.$ip.'\'');

$response = file_get_contents($request, 0, $context);

//转为json对象
$jsonobj = json_decode($response);

echo '<pre>';
print_r($jsonobj);
echo '</pre>';
?>



5.png




0x04.完整实现


这样如果我们加一个循环 则可以完成C段的查询。
接下来我们使用curl实现,为什么使用curl,因为它比file_get_contents更加完善也更灵活,效率也更快,支持的功能更多。


下面贴出代码,注释写的很详细。因为是自己练习用的。也就没有加js验证之类的。

[PHP] 纯文本查看 复制代码
<html>
    <title>c段查询</title>
    <head></head>

    <body>
        <h2 align="center">C段查询</h2>
        <form name="form1" method="post" action="demo.php">
            <p align="center">域名:<input name="domainName" type="text" value="<?php echo isset($_POST['domainName'])?$_POST['domainName']:""  ?>"/> 
            <input name="sub" type="submit" value="提交"/></p>
        </form>
    </body>

</html>


<?php
@header('Content-type:text/html;charset=utf-8');
//set_time_limit(0);//0表示不限时
$username="";
$password="xxxxxxxxxxxxxx"; //key

if(isset($_POST['sub'])==true&&(empty($_POST['domainName']))==false){
    $domainName=$_POST['domainName'];

    $time=0;

    //1.初始化一个url资源
    $ch = curl_init();

    //2.设置http请求

    //返回的结果不直接输出,可用字符串接收
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //设置HTTP的验证方法为basic认证
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    //传递连接中需要的用户名和密码
    curl_setopt($ch, CURLOPT_USERPWD, $username.":".$password);
    //因为是https 这里要不验证证书
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    //返回响应头, 该选项非常重要,如果不为 true, 只会获得响应的正文,默认为false
    //curl_setopt($ch, CURLOPT_HEADER, true);

    // 获取ip
    $ip=gethostbyname($domainName);

    echo '<p>当前域名ip:</p>'.$ip;
    // 截取ip
    $ip=substr($ip, 0, strrpos($ip, '.'));

    //循环扫c段
    for($i=1;$i<=255;$i++){
        $ip=$ip.'.'.$i;
        $url="https://api.datamarket.azure.com/Bing/Search/v1/Web?\$format=json&Query=";
        $url=$url.urlencode('\'ip:'.$ip.'\'');//url编码

        //设置请求的url
        curl_setopt($ch, CURLOPT_URL, $url);

        //3.执行并获取返回内容,内容为false 时代表发生错误
        $output = curl_exec($ch);


        if($output===false){
            echo curl_error($ch); //打印错误信息
        }else{
            $info = curl_getinfo($ch);
            $time+=$info['total_time'];

            //将json转为数组
            $jsonval=json_decode($output,true);

            $domainInfo=$jsonval['d']['results'];
            //获取长度
            $count=count($domainInfo);

            //输出html
            echo '<ul>';
            echo '<li>'.$ip;
            echo '<ul>';
            for($j=0;$j<$count;$j++){
                echo '<li>url:'.$domainInfo[$j]['Url'].' title:'.$domainInfo[$j]['Title'].'</li>';
            }
            echo '</ul>';
            echo '</li>';
            echo '</ul>';


        }
        $ip=substr($ip, 0, strrpos($ip, '.'));

    }

    echo '总耗时'.$time;
    //关闭url资源
    curl_close($ch);

}

?>

6.png
7.png




0x05.总结


经测试 查询1个c段需要60-80秒左右。
还可以继续扩展的地方很多。比如说,为了用户体验,界面可以优化一下,使用ajax来做。
另外curl可以使用多线程,效率可能会再提升一些。功能其实也可以再加一些。



大二学生狗一枚,希望加入90 和表哥们学学审计~~

==================================
两位90Sec Team同意,转正成功。
                                     管理05



单选投票, 共有 24 人参与投票

投票已经结束

100.00% (24)
0.00% (0)
您所在的用户组没有投票权限

评分

参与人数 1酒票 +5 收起 理由
管理05 + 5 欢迎加入90!

查看全部评分

发表于 2016-7-31 19:39:39 | 显示全部楼层
楼主好厉害。。。我也马上要大二了。。一起学习吧!
 楼主| 发表于 2016-7-31 20:21:31 | 显示全部楼层
godlike 发表于 2016-7-31 19:39
楼主好厉害。。。我也马上要大二了。。一起学习吧!

好啊。一起努力吧!
发表于 2016-7-31 21:17:46 | 显示全部楼层
欢迎来到90
 楼主| 发表于 2016-7-31 21:21:33 | 显示全部楼层

谢谢表哥
发表于 2016-7-31 21:42:40 | 显示全部楼层
欢迎来到90,给你一票
发表于 2016-8-1 08:38:13 | 显示全部楼层
带我飞
发表于 2016-8-1 09:57:49 | 显示全部楼层
可以,nb啊
 楼主| 发表于 2016-8-1 12:04:48 | 显示全部楼层

应该表哥带我飞
 楼主| 发表于 2016-8-1 12:11:40 | 显示全部楼层

表哥太谦虚了。
发表于 2016-8-1 14:31:37 | 显示全部楼层
Welcome!
发表于 2016-8-1 14:39:25 | 显示全部楼层
直接用cn.bing.com 搜索和用api查询 区别在哪了?
 楼主| 发表于 2016-8-1 15:26:44 | 显示全部楼层
本帖最后由 ByHuaiNian 于 2016-8-1 18:47 编辑
system32 发表于 2016-8-1 14:39
直接用cn.bing.com 搜索和用api查询 区别在哪了?

刚看了Sunshie表哥做的。测试了下cn.bing.com搜索可以查。。我以前一直以为查不了。不过他这个API 返回的数据很精简还能指定成json格式。我们可以直接操作。如果请求类似cn.bing.com的这种网页返回的是整个html代码。还要拿正则匹配我们想要的数据。效率应该没接口快。


发表于 2016-8-1 17:33:58 | 显示全部楼层
 楼主| 发表于 2016-8-1 18:00:26 | 显示全部楼层
Sunshie 发表于 2016-8-1 17:33
https://phpinfo.me/bing.php

表哥你这个做的好呀。以后请多多指教
发表于 2016-8-1 21:04:58 | 显示全部楼层
楼主女生?
欢迎加入90
 楼主| 发表于 2016-8-1 21:55:08 | 显示全部楼层
hundan 发表于 2016-8-1 21:04
楼主女生?
欢迎加入90

我不过就用了个妹子头像。我是汉子

九零

GMT+8, 2026-10-22 14:57

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表