前言:
最近在看PHP,然后准备学下php的代码审计,这几天突然想写出一个查询C段的,努力了几天终于写出来了,如果代码有写的不足的地方还望表哥们多多指教。
0x01.注册API
首先我们需要注册一个API
地址:https://datamarket.azure.com/dataset/bing/search
注册并登陆微软账号后会自动跳转到这个页面,注意这里国家地区不能选中国,否则下面会出现你的地区未提供该服务的字样。
接下来注册即可。
在账户信息那里可以查看 key
0x02.如何调用API
https://datamarket.azure.com/dataset/explore/bing/search 此网址可以直接使用该API
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>';
?>
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);
}
?>
0x05.总结
经测试 查询1个c段需要60-80秒左右。
还可以继续扩展的地方很多。比如说,为了用户体验,界面可以优化一下,使用ajax来做。
另外curl可以使用多线程,效率可能会再提升一些。功能其实也可以再加一些。
大二学生狗一枚,希望加入90 和表哥们学学审计~~
==================================
两位90Sec Team同意,转正成功。
管理05
|
评分
-
查看全部评分
|