1.漏洞函数(php)

file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()
接下来详细介绍其中几种函数:

  • curl_exec()

curl_exec函数用于执行指定的cURL会话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 
if (isset($_POST['url'])){
$link = $_POST['url'];
$curlobj = curl_init();// 创建新的 cURL 资源
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);// 设置 URL 和相应的选项
$result=curl_exec($curlobj);// 抓取 URL 并把它传递给浏览器
curl_close($curlobj);// 关闭 cURL 资源,并且释放系统资源

$filename = './curled/'.rand().'.txt';
file_put_contents($filename, $result);
echo $result;
}
?>
  • fsockopen()

函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php 
function GetFile($host,$port,$link) {
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if (!$fp) {
echo "$errstr (error number $errno) \n";
} else {
$out = "GET $link HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= "\r\n";
fwrite($fp, $out);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
?>
  • file_get_contents()

file_get_content函数从用户指定的url获取内容,然后指定一个文件名j进行保存,并展示给用户。file_put_content函数把一个字符串写入文件中。

1
2
3
4
<?php
$url = $_GET['url'];;
echo file_get_contents($url);
?>

:

  1. 一般情况下PHP不会开启fopen的gopher wrapper
  2. file_get_contents()的gopher协议不能URL编码
  3. file_get_contents()关于Gopher的302跳转会出现bug,导致利用失败
  4. curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用
  5. curl_exec() 默认不跟踪跳转,
  6. file_get_contents()支持php://input协议

2.漏洞利用

1

file伪协议

在有回显的情况下,利用 file 协议可以读取任意内容

dict伪协议

泄露安装软件版本信息,查看端口,操作内网redis服务等

http伪协议

探测内网主机存活或目录扫描

gopher伪协议

可以选择利用工具Gopherus快捷生成payload: https://github.com/tarunkant/Gopherus

gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。可用于反弹shell

默认端口为70,格式为gopher://<host>:<port>/<gopher-path>_后接TCP数据流

gopher伪协议不转发<gopher-path>内第一个字符,可以使用下划线填充首位


  • GET提交

需要保留数据包中的头部信息,例如:

1
2
3
GET /name.php?name=123 HTTP/1.1
Host: 172.250.250.4

:其中最后需要保留一个换行符(多出一行空行)表示消息结束

接下来将数据包内的内容复制,并将特殊字符(空格 问号 换行符)进行url编码利用gopher伪协议构造好

payload(需在网页中提交,若在bp中发包需要进行两次url编码):

gopher://172.250.250.4:80/_GET%20/name.php%3fname=123%20HTTP/1.1%0d%0AHost:%20172.250.250.4%0d%0A

  • POST提交

需要保留数据包中的头部信息,例如:

1
2
3
4
5
6
POST /name.php HTTP/1.1
Host: 172.250.250.4
Content-Type: application/x-www-form-urlencoded
Content-Length: 8

name=123

:其中的Content-Length要与提交内容长短对应

接下来将数据包内的内容进行两次url编码(所有字符),拼接在_后构造好gopher伪协议提交

payload:

gopher://172.250.250.4:80/_%25%35%30%25%34%66%25%35%33%25%35%34%25%32%30%25%32%66%25%36%65%25%36%31%25%36%64%25%36%35%25%32%65%25%37%30%25%36%38%25%37%30%25%32%30%25%34%38%25%35%34%25%35%34%25%35%30%25%32%66%25%33%31%25%32%65%25%33%31%25%30%64%25%30%61%25%34%38%25%36%66%25%37%33%25%37%34%25%33%61%25%32%30%25%33%31%25%33%37%25%33%32%25%32%65%25%33%32%25%33%35%25%33%30%25%32%65%25%33%32%25%33%35%25%33%30%25%32%65%25%33%34%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%35%34%25%37%39%25%37%30%25%36%35%25%33%61%25%32%30%25%36%31%25%37%30%25%37%30%25%36%63%25%36%39%25%36%33%25%36%31%25%37%34%25%36%39%25%36%66%25%36%65%25%32%66%25%37%38%25%32%64%25%37%37%25%37%37%25%37%37%25%32%64%25%36%36%25%36%66%25%37%32%25%36%64%25%32%64%25%37%35%25%37%32%25%36%63%25%36%35%25%36%65%25%36%33%25%36%66%25%36%34%25%36%35%25%36%34%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%34%63%25%36%35%25%36%65%25%36%37%25%37%34%25%36%38%25%33%61%25%32%30%25%33%38%25%30%64%25%30%61%25%30%64%25%30%61%25%36%65%25%36%31%25%36%64%25%36%35%25%33%64%25%33%31%25%33%32%25%33%33

SSRF打Redis

利用SSRF发现内网开放6379端口,则可能存在Redis服务
此时如果目标主机上的Redis由于没有设置密码认证、没有进行添加防火墙等原因存在未授权访问漏洞的话,那我们就可以利用Gopher协议远程操纵目标主机上的Redis,可以利用 Redis 自身的提供的config命令像目标主机写WebShell、写SSH公钥、创建计划任务反弹Shell等

SSRF打MySQL

SSRF打tomcat

3.绕过方式

回环地址绕过(二进制IP)

可以用不同进制表示IP地址

image.png

302重定向绕过

DNS重绑定

image.png

利用此网站生成重绑定地址:http://lock.cmpxchg8b.com/rebinder.html

短网址绕过

利用此网站生成短网址:https://suowo.cn

点分符号替换

例如http://www。qq。com

4.漏洞防御

  • 禁止302跳转,或者每跳转一次都进行校验目的地址是否为内网地址或合法地址。

  • 过滤返回信息,验证远程服务器对请求的返回结果,是否合法。

  • 禁用高危协议,例如:gopher、dict、ftp、file等,只允许http/https。

  • 设置URL白名单或者限制内网IP。

  • 限制请求的端口为http的常用端口,或者根据业务需要开放远程调用服务的端口。

  • catch错误信息,做统一错误信息,避免黑客通过错误信息判断端口对应的服务。

部分内容参考资料

https://www.cnblogs.com/miruier/p/13907150.html