pikachu参考地址:https://www.cnblogs.com/DxyG/p/13742430.html
php伪协议参考地址:https://blog.youkuaiyun.com/qq_37466661/article/details/126203437
文章参考地址:https://blog.youkuaiyun.com/qq_43378996/article/details/124050308
一、CSRF
1. 什么是CSRF
- CSRF跨站脚本伪造(客户端)。CSRF通过伪装来自受信任的用户的请求来攻击受信任的网站。
- CSRF一般的攻击原理是,攻击者向目标网站注入一个恶意的CSRF攻击URL地址(跨站url),当(登录)用户访问某特定网页时,如果用户点击了该URL,那么攻击就触发了,我们可以在该恶意的url对应的网页中,利用来向目标网站发生一个get请求,该请求会携带cookie信息,所以也就借用了用户的身份,也就是伪造了一个请求,该请求可以是目标网站中的用户有权限访问的任意请求。也可以使用javascript构造一个提交表单的post请求。比如构造一个转账的post请求。
- 所以CSRF的攻击分为了两步,首先要注入恶意URL地址,然后在该地址中写入攻击代码,利用 等标签或者使用Javascript脚本。
攻击过程
发生条件:
1. 登录受信任网站A,并在本地生成cookie。
2. 在不登出A的情况下,访问危险网站B。
可能存在CSRF漏洞:
能够修改用户信息和添加用户的地方
2. CSRF靶场
CSRF实例
登陆到靶场的会员中心,进行修改会员信息操作
抓取修改信息都数据包
可以看到get提交的数据包/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=1111&add=1111&email=lucy%40pikachu.com&submit=submit
我们修改提交的数据都在这里,也就是说可以这样直接伪造提交的数据包从而就该服务器内容。
发送数据包http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=2222&add=2222&email=lucy%40pikachu.com&submit=submit
发现信息修改成功
我们在另一台服务器(192.168.101.7)中新建一个test.html文件写入
<script src='http://127.0.0.1:8000/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=3333&add=3333&email=lucy%40pikachu.com&submit=submit></script>
在靶机登陆pikachu靶场的会员账号状态下,访问我们伪造的CSRF页面192.168.101.7/test.html,可以看到我们在访问test.html的时候,它悄悄地访问了本机服务器的地址
我们刷新一下pikachu的会员信息页面,发现会员信息修改成功
CSRF漏洞检测(poc)
在可以修改用户信息地方,都可能存在CSRF漏洞
首先我们使用bp抓取修改数据的包,将数据包发送至bp的CSRF PoC模块
配置自己所要修改的数据,然后将下面生成的代码复制到另一个服务器中
将代码保存到test2.html中
访问test2.html,点击触发按钮
刷新,用户信息修改成功,说明这里存在CSRF漏洞
如果没有修改成功,则说明不存在CSRF漏洞
CSRF(POST)
<html>
<head>
<meta charset="utf-8">
<title></title>
<script>
window.onload = function(){
document.getElementById('postsubmit').click();
}
</script>
</head>
<body>
<form action="http://127.0.0.1:8000/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input type="hidden" name="sex" value="girl" />
<input type="hidden" name="phonenum" value="1111" />
<input type="hidden" name="add" value="1111" />
<input type="hidden" name="email" value="lucy@pikachu.com" />
<input class="sub" type="submit" name="submit" id="postsubmit" value="submit">
</form>
</body>
</html>
CSRF防护
1. 当用户发送重要的请求时需要输入原始密码
2. 验证HTTP的 Referer 字段
3. 在请求地址中添加 token 并验证
4. 二次确认,如验证码等
5. 在 HTTP 头中自定义属性并验证
二、SSRF
1. 什么是SSRF
SSRF漏洞(服务器端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
SSRF漏洞原理:
SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。SSRF是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
SSRF漏洞利用手段:
- 可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306的);
- 攻击运行在内网或本地的有漏洞程序(比如溢出);
- 可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹;
- 攻击内网或外网有漏洞的Web应用;
- 使用file:///协议读取本地文件(或其他协议)
参考地址:
http://www.xingkonglangzi.com/ssrf.php?url=192.168.1.10:3306
http://www.xingkonglangzi.com/ssrf.php?url=file:///c:/windows/win.ini
SSRF漏洞出现点:
1)分享:通过URL地址分享网页内容
2)转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3)在线翻译:通过URL地址翻译对应文本内容 如:百度,有道
4)图片加载与下载:通过URL地址加载与下载图片
5)图片 文章收藏功能
6)未公开的API实现以及其他调用URL的功能
URL中的关键字:【结合谷歌语法找到入手点】
share wap url link src source target u 3g display sourceURL imageURL domain
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
SSRF漏洞防御:
1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口,比如,80、443、8080、8090
4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///、gopher://、ftp:// 等引起的问题。
2. SSRF靶场
自搭靶场
test.php
<meta http-equiv="Content-Type" content="text/html"; charset="utf-8" />
<form action="" method="post">
想要翻译的网站:<input type="text" name="url"><br>
<input type="submit" name="Submit" value="Cheak!">
</form>
<?php
$_POST['url'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_POST['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
?>
ip.php
<?php
%ip = $_SERVER['REMOTE_ADDR'];
echo "Your ip is ".$ip;
>
以win2003(192.168.101.7)做为靶机服务器,在靶机上部署test.php和ip.php
以win10作为攻击机,ip:192.168.101.1
在攻击机中访问192.168.101.7:8080/ip.php
,输出的是攻击机的ip地址
在攻击机中访问192.168.101.7:8080/test.php
在输入框中填写url,点击后就会跳转到相应网页
访问192.168.101.7:8080/ip.php
,而此时输出的是服务器的IP地址
或者直接输入127.0.0.1:8080/ip.php
也能访问ip.php,输出靶机ip地址
可以发现通过这样的方式会让攻击者以内部网络身份访问文件(也就是说这样可以让我们访问一些原本不允许外网访问的文件) ,即通过SSRF漏洞访问了内网资源
我们试试在攻击机中访问靶机的mysql服务192.168.101.7:3306
,发现其不允许外部访问,只能由内部访问
但是如果我们通过存在SSRF漏洞的页面来访问192.168.101.7:3306
或者127.0.0.1:3306
,发现访问成功
除了http协议外,还可以使用其他协议如文件读取协议file:///、ftp协议ftp://等
文件读取实例
脚本类型不同,所支持的协议也不同
pikachu靶场 SSRF
SSRF(curl)
进入SSRF(curl)页面,点击累了吧,来读一首诗吧
,发现url发生变化
http://127.0.0.1:8000/pikachu/vul/ssrf/ssrf_curl.php
—>
http://127.0.0.1:8000/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
多了个url参数
通过修改参数url的值,把 url 中的内容改成内网的其他服务器上地址和端口,探测内网的其他信息,比如端口开放情况
访问本机3306端口
访问同一网段的192.168.101.7的服务器的3306端口
SSRF(file_get_content)
与curl类型的差不多,只是使用了不同的函数
访问百度
使用file协议读取文件内容
使用php伪协议读取文件内容
pikachu参考地址:
https://www.cnblogs.com/DxyG/p/13742430.html
php伪协议参考地址:https://blog.youkuaiyun.com/qq_37466661/article/details/126203437