漏洞成因分析
-
用户输入未过滤:代码通过$_GET['url']获取用户传入的参数,并直接将其用于stream_socket_client函数建立网络连接。没有对输入的url进行严格的合法性校验和过滤,攻击者可以传入任意的 URL,包括内网地址或恶意构造的地址。
-
服务器端请求特性:stream_socket_client函数在服务器端发起请求,它绕过了客户端浏览器的同源策略和安全限制。这意味着攻击者可以利用服务器的权限去访问内部网络资源,如数据库、内部 Web 服务等。
-
缺乏来源验证:代码没有对请求的来源进行有效验证,单纯信任了用户传入的url参数,为攻击者利用服务器发起恶意请求提供了便利。
漏洞验证步骤
-
准备测试环境:搭建一个包含这段 PHP 代码的 Web 服务环境。
-
构造测试 URL:在浏览器地址栏或使用工具(如 Burp Suite)构造一个带有恶意url参数的 GET 请求。比如正常访问是http://yourserver.com/script.php,测试时可以构造为http://yourserver.com/script.php?url=http://internal - server - ip:port(internal - server - ip为内网 IP,port为端口),尝试访问内网服务。
-
观察响应:查看页面返回的内容,如果能获取到内网服务的响应信息,如页面内容、错误提示等,就说明存在 SSRF 漏洞。也可以使用http://127.0.0.1等本地回环地址进行测试,若能得到相应的响应,同样证明漏洞存在。
-
进一步验证:可以尝试访问一些特定的内部服务端口,如数据库默认端口(MySQL 3306、Redis 6379 等),看是否能获取到相关信息或引发异常响应,进一步确认漏洞的影响范围 。
原文始发于微信公众号(Khan安全团队):学习 - 经典的SSRF代码
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论