一、总结CSRF和XSS区别
1. 攻击原理不同
-
CSRF(Cross-Site Request Forgery):
- 攻击者诱使受害者在已经认证的情况下,执行一个不知情的请求。例如,攻击者可以通过伪造的表单或链接,利用受害者的登录状态,向目标网站发送恶意请求。
- 攻击依赖于受害者的认证信息(如Cookies)被不正确使用。
-
XSS(Cross-Site Scripting):
- 攻击者将恶意脚本注入到网页中,当其他用户访问该网页时,脚本会在他们的浏览器中执行。攻击者可以通过脚本窃取用户信息、劫持会话等。
- 攻击利用了网站对用户输入的不足过滤或转义,导致恶意脚本被注入并执行。
2. 攻击目标不同
-
CSRF:
- 主要目标是利用用户的认证信息,伪造用户的请求来执行未经授权的操作,如更改用户设置或发起资金转账等。
-
XSS:
- 主要目标是操控网页内容或从用户那里窃取敏感数据,例如Cookies、会话标识符等。
3. 防御措施不同
-
CSRF:
- 使用CSRF令牌:在请求中包含一个随机生成的令牌,服务器验证这个令牌以确保请求是合法的。
- 使用SameSite Cookie属性:设置Cookies的SameSite属性,以限制跨站请求的发送。
-
XSS:
- 对用户输入进行严格的过滤和转义:确保所有动态内容都经过适当的处理,防止恶意脚本被注入。
- 使用内容安全策略(CSP):定义允许哪些源的资源可以加载,从而限制恶意脚本的执行。
4. 利用场景不同
-
CSRF:
- 通常用于操作性攻击,例如未授权的状态更改、交易等。
-
XSS:
- 常用于窃取信息、篡改页面内容、执行恶意操作等。
二、总结CSRF攻击步骤
1. 选择目标
- 攻击者选择一个具有用户认证功能的网站作为攻击目标。通常是用户已经登录并且拥有一定权限的网站(例如,在线银行、社交媒体等)。
2. 构造恶意请求
- 攻击者构造一个恶意请求,该请求会对目标网站执行一些不希望用户进行的操作。这些操作通常是对用户有权限的敏感操作,比如转账、修改账户信息等。
3. 嵌入恶意请求
- 攻击者将构造的恶意请求嵌入到一个网页或电子邮件中。常见的嵌入方式包括:
- HTML表单:创建一个提交恶意操作的表单。
- 图片标签:利用
<img>
标签的src
属性发起请求。 - JavaScript:利用
<script>
标签或其他JavaScript方法发送请求。 - 链接:利用
<a>
标签的href
属性发起请求。
4. 诱导受害者访问
- 攻击者诱使目标用户访问恶意网页或点击恶意链接。这可以通过各种方式实现,例如发送钓鱼邮件、利用社交工程学等手段。
5. 执行恶意请求
- 当受害者在目标网站上登录并访问了恶意网页时,浏览器会自动附带用户的认证信息(如Cookies)来发送请求。由于请求看起来是由合法用户发出的,目标网站会按照请求内容执行操作。
6. 观察效果
- 攻击者观察请求的效果。如果攻击成功,受害者的账户或数据会被篡改,攻击者可能会获得非法利益或破坏目标用户的设置。
三、总结CSRF手工构造POST型页面方法
-
了解目标请求:
- 确定需要伪造的POST请求的URL、请求参数和请求方法。
- 通过浏览器的开发者工具或网络抓包工具(如Fiddler、Burp Suite等)查看正常请求的详细信息。
-
构造HTML页面:
- 创建一个HTML文件,使用
<form>
标签来模拟目标请求。 - 设置
form
标签的action
属性为目标URL,method
属性为POST
。 - 根据目标请求的需要,添加隐藏字段(
<input type="hidden">
)以匹配请求参数。
<!DOCTYPE html> <html> <head> <title>CSRF Attack</title> </head> <body> <form action="http://targetsite.com/submit" method="POST"> <input type="hidden" name="param1" value="value1"> <input type="hidden" name="param2" value="value2"> <!-- 添加更多字段以匹配目标请求 --> <input type="submit" value="Submit"> </form> <script> // 自动提交表单 document.forms[0].submit(); </script> </body> </html>
- 创建一个HTML文件,使用
-
测试和验证:
- 将构造好的HTML文件放在可以访问的服务器上,或者直接在本地打开(如果浏览器允许)。
- 确保当用户访问这个页面时,表单会自动提交,并且请求能够成功地伪造给目标网站。
-
避免被检测:
- 使用真实的表单字段名称和值,以尽可能模拟真实的请求。
- 确保页面在加载时能够自动提交,以减少被用户察觉的机会。
四、说明token类CSRF利用方法
1、利用bp抓包和插件窃取Token(以pikachu靶场为例)
1.1、在burpsuite的插件扩展上安装CSRF Token Tracker扩展并启用。
1.2、在CSRF Token Tracker上进行以下配置。
1.3、在pikachu的CSRF(Token)的修改个人信息页面进行抓包,并把请求包发送到重放模块。
1.4、此时在 CSRF Token Tracker插件上得到Token。
1.5、在重放模块修改表单值,如sex栏0修改为boy,phonenum栏10086修改为111111,然后点击“跟随重定向”按钮,一直点击“发送”。
1.6、然后放包,可以看到页面信息已经按照我们的意愿改变。
2、 Token缺失
如果目标应用在某些情况下没有检查CSRF Token,攻击者可能会利用这种漏洞进行攻击。例如,有些页面可能不要求CSRF Token,或只有部分请求需要验证Token。
3、Token伪造
如果应用程序存在XSS漏洞,攻击者可以注入恶意脚本来窃取用户的CSRF Token,并用该Token发起伪造请求。
4、Token固化
某些系统使用硬编码或静态生成的Token。攻击者可以预测或复制这些Token进行攻击。
五、SSRF常用协议
-
file://:
- 允许访问服务器本地文件系统中的文件。攻击者可以尝试读取敏感文件(如
/etc/passwd
、/proc/self/environ
等)。 - 示例:
file:///etc/passwd
- 允许访问服务器本地文件系统中的文件。攻击者可以尝试读取敏感文件(如
-
ftp://:
- 用于访问FTP服务,可以尝试通过FTP协议连接到其他服务器。
- 示例:
ftp://example.com
-
http:// 和 https://:
- 尽管是常用的HTTP协议,但在SSRF中,攻击者可以用它们来访问内部服务,例如API或管理接口。
- 示例:
http://localhost:8080
-
gopher://:
- Gopher协议允许访问文档和信息,攻击者可以利用它来发送任意请求。
- 示例:
gopher://example.com/
-
mailto::
- 伪协议可能用来构造邮件地址,攻击者可以通过此协议发送请求。
- 示例:
mailto:attacker@example.com
-
data::
- 可以用来在请求中嵌入小型数据,攻击者可能利用它进行各种数据传输。
- 示例:
data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==
(这代表“Hello, World!”的Base64编码)
-
ws:// 和 wss://:
- WebSocket协议,攻击者可以通过WebSocket发起连接,执行实时数据传输。
- 示例:
ws://example.com/socket
-
http+unix://:
- 用于通过Unix套接字发送HTTP请求,可以在本地与某些应用程序进行通信。
- 示例:
http+unix://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json
-
redis://:
- Redis协议,允许攻击者连接到Redis服务并执行命令。
- 示例:
redis://localhost:6379
六、SSRF靶场通关(pikachu)
1、SSRF之curl
curl的用法:PHP cURL 函数 | 菜鸟教程
PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。
1.1、点击页面中的“累了吧,来读一首诗吧”进入新页面,发现地址栏中出现了一个URL地址,URL后面的内容正是可以利用的地方。
1.2、由于curl支持很多协议,我们依次尝试http、file和dict协议。输入 url=http://www.cqupt.edu.cn可以用http访问外网链接。输入url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/test.txt请求内网资源。
1.3、利用file协议查看本地文件,输入url=file:///D:\phpstudy\phpstudy_pro\WWW\test.txt
1.4、使用dict协议可以获取内网主机开放端口相应服务的指纹信息,输入url=dict://127.0.0.1:80
2、SSRF之file_get_content
file_get_content()的用法:PHP file_get_contents() 函数 | 菜鸟教程
file_get_contents() 把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
语法: file_get_contents(path,include_path,context,start,max_length)
2.1、利用file协议查看本地文件,输入file=file:///C:\Users\Lenovo\Desktop\test.txt
2.2、读取ssrf.php源码,输入file=php://filter/read=convert.base64-encode/resource=ssrf.php,得到base64编码后,放到在线解码器中解码即可得到源码。
2.3、利用http协议探测内网主机其他端口, 输入:file=http://127.0.0.1:902
2.4、利用http协议请求内网资源,输入file=http://127.0.0.1/sqli-labs/index.html
七、 对pikachu靶场SSRF漏洞成因说明
SSRF之curl_exec()
源代码如图
该靶场利用curl_exec()函数从其他服务器应用获取数据,但没有对目标地址做过滤与限制,curl又支持很多协议,攻击者就能利用伪协议伪造出恶意请求,比如访问内网资源、查看内网文件、探测内网其它主机端口等。
SSRF之file_get_contents()
源代码如图。
该靶场则是利用 file_get_contents()函数实现从其他服务器应用获取数据的功能,同样也是因为没有对目标地址进行过滤和限制,导致攻击者可以利用http、file等伪协议进行请求伪造来请求内网资源,甚至能读取PHP源码。