PHP实现在线端口扫描 – 作者:Snow狼啊

PHP4/5/7版本中提供了fsockopen方法,该方法用于打开一个网络连接或者一个Unix套接字连接,也可以用来进行开放端口扫描。

下面是PHP官方对于fsockopen方法的说明:

lUyHeK.png

使用fsockopen()方法我们可以设计以下思路来实现开放端口检测:

  • 1.获取目标IP地址以及待扫描的端口列表。
  • 2.使用For循环遍历带扫描的端口数组,讲目标IP地址与端口进行拼接。
  • 3.使用fsockopen()函数进行探测:通过Timeout参数进行判断:若超过1s无响应则视作端口未开放。
  • 4.考虑到端口扫描功能的特殊性,可能会存在SSRF漏洞,因此需要对SSRF漏洞进行防护。

开放端口扫描实现出的代码如下:

function getOpenPort($ip,$port){
    $msg = array('Ftp','Telnet','Smtp','Finger','Http','Pop3','Location Service','Netbios-NS','Netbios-DGM','Netbios-SSN','IMAP','Https','Microsoft-DS','MSSQL','MYSQL');
    foreach ($port as $key => $value){
        echo $value.'&nbsp&nbsp';
        echo $msg[$key].'&nbsp&nbsp';
        $fp = @fsockopen($ip,$value,$errno,$errstr,0.5);
        $result = $fp ? '<font color="#43CD80"><开启></font><br>' : '<font color="#FF6347"><关闭></font><br>';
        echo $result;

针对于SSRF漏洞防护我们给出的方案是:创建IP黑名单,屏蔽内网IP,防止扫描内网IP地址

针对以上方案,我们写出的防护代码如下:

$blackHostlist = array("172.", "10.", "localhost", "127.", "192.");
foreach($blackHostlist as $blackHost){
    if(strpos($ip, $blackHost) === 0){
        echo '<script>alert("禁止扫描内网地址!");</script>';
        die();
    }
}

同时设计一个前端的表单来接受用户传送的参数:

# index.html
<form method="post" action="scan.php">
目标IP - IP Address:<input type="text" name="ip" id="domain"><br><br>
扫描端口 - Ports:<input type="test" name="port" value="21,23,25,79,80,110,135,137,138,139,143,443,445,1433,3306"><br><br>
开始扫描 - Start:<input type="submit" value="点击开始扫描 - Scaning">
</form>

最终的PHP后端代码如下:

<?php
    function getOpenPort($ip,$port){
        $msg = array('Ftp','Telnet','Smtp','Finger','Http','Pop3','Location Service','Netbios-NS','Netbios-DGM','Netbios-SSN','IMAP','Https','Microsoft-DS','MSSQL','MYSQL');
        foreach ($port as $key => $value){
            echo $value.'&nbsp&nbsp';
            echo $msg[$key].'&nbsp&nbsp';
            $fp = @fsockopen($ip,$value,$errno,$errstr,0.5);
           $result = $fp ? '<font color="#43CD80"><开启></font><br>' : '<font color="#FF6347"><关闭></font><br>';
            echo $result;

    $url = $_POST['ip'];
    $port = $_POST['port'];
    $blackHostlist = array("172.", "10.", "localhost", "127.", "192.");
    foreach($blackHostlist as $blackHost){
        if(strpos($ip, $blackHost) === 0){
            echo '<script>alert("禁止扫描内网地址!");</script>';
            die();
        }
    }
    getOpenPort($ip,$port);

最终运行效果如下(前端UI进行了美化处理):

lUcY4g.png

来源:freebuf.com 2020-02-13 16:18:22 by: Snow狼啊

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论