XSS动态检测

0x00 起

前一段时间,因为工作原因接触到XSS漏洞检测。前人留下的锅,是采用pyqt webkit来解析网页内容。作为Python webkit框架,相比于PhantomJS,pyqt在捕获错误,重载函数等方面有比较多的优势,但pyqt也有很有缺点:占用资源较多、底层解析还是用C++,许多错误是C++直接抛出的,Python依然无法捕获、历史遗留等等问题。

最近做毕设,考虑到以上的优缺点,动态解析部分采用了PhantomJS来编写。本文就介绍一下XSS动态解析的思路及部分关键代码。

0x10 漏洞判别标准

XSS漏洞,说到底还是用户输入被当成页面代码解析了。解析的结果,可能是执行了JS代码,也可能是在页面中创建/修改了某个DOM节点。所以我们将Payload分为两类:第一类,执行了指定的JS代码(alert(1)),第二类,创建了新的DOM节点(<xsstest></xsstest>)。

根据这两种Payload,自然而然的推出了漏洞判别标准:页面弹窗(在PhantomJS中重载window.alert)、新节点(解析玩页面后,判断document.getElementsByTagName(‘xsstest‘)是否为空)。

page.onAlert = function (message) {
    if(message == xss_mark) {
        xss_exists = 1;
        ret = "Success, xss exists";
        phantom_exit(ret);
    }
    console.log(‘Alert: ‘ + message);

    return true;
};

function check_dom_xss_vul(){
    return document.getElementsByTagName(dom_xss_mark).length;
}

为了验证检测代码,编写一个简单存在XSS漏洞的页面。

<?php
echo $_GET[‘test‘];
?>

经测试,访问 http://127.0.0.1:8000/xss.php?test=<img src=1 onerror=alert(1)>,我们的检测代码成功检测到了弹窗,并返回了正确的结果。但是,如果是下面这种情况呢?

<?php
$click = $_GET[‘test‘];

echo "<div onclick=$click></div>";
?>

0x20 执行事件代码

很明显,我们需要执行onclick中的代码,才能检测到漏洞。首先我们想到的是触发事件,仅仅是触发click事件,很简单,javascript本身就提供了click事件: document.getElementsByTagName(‘div‘)[0].click()。但是javascript也就仅仅提供了click事件的触发函数而已。

但既然代码直接输出在了onclick/onmouseover之类的属性里,我们遍历所有节点的属性,针对onxxxxx的属性值,直接调用eval方法,执行对应的代码就可以了。

var nodes = document.all;
for(var i=0;i<nodes.length;i++){
    var attrs = nodes[i].attributes;
    for(var j=0;j<attrs.length;j++){
        attr_name = attrs[j].nodeName;
        attr_value = attrs[j].nodeValue;
        if(attr_name.substr(0,2) == "on"){
            console.log(attrs[j].nodeName + ‘ : ‘ + attr_value);
            eval(attr_value);
        }
    }
}

访问http://127.0.0.1:8000/xss.php?test=alert(1) 成功执行代码,但新的问题很快出现:并不是所有的JS代码都是以内联的形式写入到HTML代码中的,程序猿们往往更喜欢通过 document.addEventListener 或者 jQuery中的 $(‘dom‘).click 直接绑定事件。例子如下:

<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="link-area"></div>

<?php
echo ‘<script>$("#image").click(function(){$(".link-area").html("‘.$_GET[‘test‘].‘")});</script>‘;
?>

0x30 触发事件

所以我们现在需要这样的接口: 能够触发某个DOM节点的某个事件,包括但不仅限于click事件。PhantomJS和Javascript都可能存在这样的接口,但是找遍了PhantomJS,甚至是CasperJS的接口,也只是发现了触发click事件的接口。所以聚焦点重新回到Javascript上来。很快,我们发现了dispatchEvent函数。

// phantom_finish.js
var evt = document.createEvent(‘CustomEvent‘);
evt.initCustomEvent(click, true, true, null);
document.getElementsByTagName("div")[0].dispatchEvent(evt);

成功执行了click事件,但是如何能获取到所有节点的绑定事件呢?有两种方法:

  • 遍历所有节点,获取每个节点绑定的事件
  • 在dom节点加载前,重写addEventListener方法,并将所有的绑定的事件及节点记录到一个数组中。

方法一在遇到jQuery绑定事件的时候扑街了。方法二明显比方法一节省资源,并且测试通过。核心代码如下:

// phantom_init.js
_addEventListener = Element.prototype.addEventListener
Element.prototype.addEventListener = function(a,b,c) {
        save_event_dom(this, a);      // 将所有的绑定事件节点信息存储起来
        _addEventListener.apply(this, arguments);
};

这样,我们的JS代码也算告一段落,PhantomJS组件能够执行内联代码及触发所有的绑定事件。万事具备,只欠一个调度系统了~

0x40 调度系统

XSS扫描是URL粒度扫描,针对网站的每一个链接都要进行测试。XSS检测系统的输入值包括:

  • URL (如:http://127.0.0.1:8000/xss.php?a=1&b=2)
  • method
  • post_data
  • headers

调度系统的功能就是处理这个URL,拼接对应的payload,并调用PhantomJS组件,检测是否含有XSS漏洞。举个例子,当payload为 <img src=1 onerror=alert(1)> 时,需要调用两次PhantomJS组件,输入的URL分别为:

  • http://127.0.0.1:8000/xss.php?a=<img src=1 onerror=alert(1)>&b=2
  • http://127.0.0.1:8000/xss.php?a=1&b=<img src=1 onerror=alert(1)>

0x50 合

上述种种,已经基本将动态XSS检测的思路分析透彻。XSS有很多种玩法,在payload中可以带进一些有意思的攻击代码,比如钓鱼、打Cookie、甚至探测网络状况等等不再赘述。

时间: 2024-10-02 17:34:52

XSS动态检测的相关文章

快速、直接的XSS漏洞检测爬虫 – XSScrapy

XSScrapy是一个快速.直接的XSS漏洞检测爬虫,你只需要一个URL,它便可以帮助你发现XSS跨站脚本漏洞. XSScrapy的XSS漏洞攻击测试向量将会覆盖 Http头中的Referer字段 User-Agent字段 Cookie 表单(包括隐藏表单) URL参数 RUL末尾,如 www.example.com/<script>alert(1)</script> 跳转型XSS 因为Scrapy并不是一个浏览器,所以对AJAX无能为力,我将会在未来努力实现这些功能,尽管并不容易

EditText自定义边框背景与动态检测用户输入

一.EditText自定义边框背景 1.效果演示 2.代码实现 (1)res/drawable/shape_edit_normal.xml 功能:编辑框没获得焦点时,使用该shape.<shape.../>为根元素的ShapeDrawable资源,主要用于定义一个基本的几何图形,如矩形.圆形.线条等. <solid.../>子元素用于指定填充集合图形的的颜色: <corners.../>子元素用于定义几个图形的四个角的弧度: <gradient../>子元素

【转帖】一款优秀的XSS批量检测工具

一款优秀的XSS批量检测工具 https://www.freebuf.com/sectool/223009.html 必须学习胶水语言才可以啊 至少学会代码的编写与使用. 0×01 简介 NoXss是一个供web安全工程师批量检测xss隐患的脚本工具.其主要用于批量检测,比如甲方内部安全巡检,人工分析千万级的url资产是不现实的,NoXss使用多进程+协程的方式,支持高并发,可以出色的完成这一任务.NoXss从实用主义出发,小巧精致,不如其他扫描器拥有各式各样的高级功能(比如绕过waf.存储型x

Windows下利用Python动态检测外网IP并发邮件给邮箱

我们知道,运营商给分配的都是动态IP,IP地址过一段时间会自己变化,这就给需要静态地址的应用带来不便,例如搭建服务器或者远程控制电脑,这种情况必须知道自己电脑的IP,利用Python可以方便的自动检测并向邮箱发送邮箱. 但是,个人网络一般都是通过路由器来上网,直接检测电脑的IP并不可行,需要得到外网的IP.内网电脑可以通过端口映射来映射到外网.检测的原理如下: 1.通过自己的电脑信息不太好获取外网IP,幸好有一些雷锋网站可以帮助我们来检测,例如 http://city.ip138.com/ip2

基于C#的机器学习--面部和动态检测-图像过滤器

原文地址:https://www.cnblogs.com/wangzhenyao1994/p/10386907.html

web安全之xss

xss:跨站脚本攻击,攻击者,把一段恶意代码镶嵌到web页面,,用户浏览页面时,嵌入页面的恶意代码就会执行,从而到达攻击用户的目的. 重点在于脚本,javascript和actionscript    属于前段攻击一般分为三类: 反射性xss,储存型XSS,DOM型XSS((还有flash XSS.mXSS).) 重要介绍 存储型xss 危害: 获取管理员的cookie 鱼叉攻击 挂马(水坑) 等等. (1)反射性xss,url上有攻击者控制的参数,服务器在响应时,会把这个数据发到浏览器上并被解

xss跨站脚本攻击剖析与防御-读书笔记

<?php /* 1.什么是xss?           xss中文名字<跨站脚本>主要是因为web程序对输入输出过滤不足导致的.           攻击者利用xss漏洞把恶意脚本代码(HTML+Javascript)注入到网页中,           当用户浏览这些网页时,就会执行恶意代码,对受害者进行攻击,例如           盗取Cookie,会话劫持,钓鱼欺骗等各种攻击. 2.xss的危害        Cookie盗取                只要有记住密码功能,盗

webshell检测(一)

0x01:Webshell简介 ×××者在企业网站时,通常要通过各种方式获取webshell从而获得企业网站的控制权,然后方便进行之后的行为.常见×××方式有:直接上传获取webshell.SQL注入.远程文件包含(RFI).FTP,甚至使用跨站点脚本(XSS)作为×××的一部分,甚至一些比较老旧的方法利用后台数据库备份及恢复获取webshell.数据库压缩等.通用功能包括但不限于shell命令执行.代码执行.数据库枚举和文件管理. 1.Webshell分类 webshell从协议上来看,最开始

从零学习安全测试,从XSS漏洞攻击和防御开始

WeTest 导读 本篇包含了XSS漏洞攻击及防御详细介绍,包括漏洞基础.XSS基础.编码基础.XSS Payload.XSS攻击防御. 第一部分:漏洞攻防基础知识   XSS属于漏洞攻防,我们要研究它就要了解这个领域的一些行话,这样才好沟通交流.同时我建立了一个简易的攻击模型用于XSS漏洞学习. 1. 漏洞术语 了解一些简单术语就好. VUL Vulnerability漏洞,指能对系统造成损坏或能借之攻击系统的Bug. POC Proof of Concept,漏洞证明:可以是可以证明漏洞存在