环境搭建
pikachu文件如下:
通过百度网盘分享的文件:pikachu-master.zip
链接:https://pan.baidu.com/s/1HuV2llJzx1c7Ii6u-r4s3Q?pwd=qwer
提取码:qwer
解压至小皮WWW文件夹下,进入config.inc.php中修改MySQL名字和密码。
然后创建。
最后重启即可。
打开网站我进入SSRF正常,点击后报错404.
网上搜索了两个方法,一个是127.0.0.1后面跟端口,一个是修改文件ssrf_curl.php和ssrf_fgc.php中将'$RD.'删除均没用,最后依然是修改这两个文件中的路径补全即可
另一个一样。
SSRF(curl)
我们点击SSRF下的SSRF(curl),显示的是累了吧,来读一首诗吧。
这里我们看不出什么,接着我们进行点击后观察其URL。传递url参数,使用http协议进行访问
再看它的后端源代码。是从前端接收后,后端做出回应。将接收的前端URL,进行初始化后再使用curl_exec进行执行相应的请求,并返回到前端。
这里我们需要注意的是curl_exec这个函数,因为SSRF漏洞产生的相应函数中有file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()这些, 而curl_exec就包含在其中,而curl_exec
函数用于执行指定的curl会话,在一般的环境下,我们发现有这些函数的一个或多个就得注意这个环境是否存在SSRF漏洞了。下面就来验证SSRF漏洞是否存在。
验证SSRF漏洞
curl是一个开源的用于数据传输的命令行工具与库,它使用URL语法格式,支持众多传输协议,包括:HTTP、HTTPS、FTP、FTPS、GOPHER、TFTP、SCP、SFTP、SMB、TELNET、DICT、LDAP、LDAPS、FILE、IMAP、SMTP、POP3、RTSP和RTMP协议。
这里我们利用file协议访问自己本地的文件看看:这里我先在小皮WWW下创建一个txt文件并输入SSRF漏洞。
?url=file:///E:/phpstudy_pro/WWW/ceshi.txt输入后显示了该文件中的内容。说明存在SSRF漏洞。这就可以让我们读取到该网站内的一些其他文件内容(只要知道路径)
接着我们使用dict伪协议扫描它的3306端口是否开放(MySQL数据库管理系统的端口),dict可以泄露安装软件版本信息,查看端口,操作内网redis服务等。
?url=dict://127.0.0.1:3306输入后有反应,确认是开放的。这就说明我们可以扫描到该服务器后端在同一个局域网中的其他服务端口,从而进行更进一步的攻击行为。
SSRF(file_get_content)
和curl一样看看源代码,看看存在哪种函数
存在file_get_content函数,该函数从用户指定的url获取内容,然后指定一个文件名进行保存,并展示给用户。file_put_content函数把一个字符串写入文件中。即读取文件(绝对路径下的文件和相对路径下的文件都可进行读取)。
可以读取到百度的内容
?file=php://filter/read=convert.base64-encode/resource=E:/phpStudy_pro/WWW/ceshi.txt将ceshi.txt文件读取并用base64加密显示出来。
以上就是pikachu的SSRF漏洞闯关了。
总结
综上,SSRF的危害极大,我们在进行代码审计的时候尤其需要注意是否存在file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()这些函数,这些函数是造成SSRF漏洞的成因之一。
而我们预防SSRF漏洞可以从以下三点进行防御:
1、限制请求的端口只能为Web端口,只允许访问HTTP和HTTPS的请求。
2、限制不能访问内网的IP,以防止对内网进行攻击。
3、屏蔽返回的详细信息。
本文只是SSRF漏洞的一小部分,更多的SSRF漏洞还需要我们去进行深入学习,比如通过SSRF进行指纹识别,攻击redist服务(近几年使用redis的公司企业越来越多,对于这一块的内容也需要着重注意)以及SSRF漏洞绕过,比如使用@、添加口端口号之类的。与CSRF(客户端请求伪造)相比SSRF(服务器端请求伪造)危害大得多得多,CSRF一个token值(令牌)就防住了,而且CSRF全靠受害人进行操作,我们只需要对他的页面进行一个伪造,读取受害人在页面的操作(如账号密码之类的)就可以假冒受害人进行一些操作,而token值直接防住了,这就导致现在的CSRF漏洞几乎不存在。