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、甚至探测网络状况等等不再赘述。

XSS动态检测的更多相关文章

  1. XSS 自动化检测 Fiddler Watcher & x5s & ccXSScan 初识

    一.标题:XSS 自动化检测 Fiddler Watcher & x5s  & ccXSScan 初识     automated XSS testing assistant 二.引言 ...

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

    XSScrapy是一个快速.直接的XSS漏洞检测爬虫,你只需要一个URL,它便可以帮助你发现XSS跨站脚本漏洞. XSScrapy的XSS漏洞攻击测试向量将会覆盖 Http头中的Referer字段 U ...

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

    在本章中,我们将展示两个独立的例子,一个用于人脸检测,另一个用于动态检测,以及如何快速地将这些功能添加到应用程序中. 在这一章中,我们将讨论: 面部检测 动态检测 将检测添加到应用程序中 面部检测 人 ...

  4. XSS自动化检测 Fiddler Watcher & x5s & ccXSScan 初识

    一.标题:XSS 自动化检测 Fiddler Watcher & x5s  & ccXSScan 初识     automated XSS testing assistant 二.引言 ...

  5. 机器学习&恶意代码动态检测

    目录 写在前面 1 基于API调用的统计特征 2 API序列特征 3 API调用图 4 基于行为的特征 references: 写在前面 对恶意程序动态检测方法做了概述, 关于方法1和2可以参考阿里云 ...

  6. XSSer:自动化XSS漏洞检测及利用工具

    转载自FreeBuf.COM XSS是一种非常常见的漏洞类型,它的影响非常的广泛并且很容易的就能被检测到. 攻击者可以在未经验证的情况下,将不受信任的JavaScript片段插入到你的应用程序中,然后 ...

  7. 【译】.NET 的新的动态检测分析

    随着 Visual Studio 16.9 的发布,Visual Studio 中的检测分析变得更好用了.本文介绍我们新的动态分析工具.这个工具显示了函数被调用的确切次数,并且比我们以前的静态检测工具 ...

  8. VC++ 动态检测串口的热插拔(一)通过注册表实现

    在上一篇文章中讲述了如何通过循环遍历的方法获取可用串口,可是这样的方法过于暴力,难免会想有没有其他的办法那,嘿嘿,那是肯定会有的,不管什么问题,解决问题的方法永远都不止一种.下面讲述如何通过注册表来获 ...

  9. js动态检测加载 JQ

    var jqcdnurl = 'https://cdn.bootcss.com/jquery/3.2.1/jquery.js'; //控制台输出 function log() { for (var i ...

随机推荐

  1. [改善Java代码]优先选择线程池

    在Java1.5之前,实现多线程编程比较麻烦,需要自己启动线程,并关注同步资源,防止线程死锁等问题,在1.5版本之后引入了并行计算框架,大大简化了多线程开发. 我们知道线程有5个状态:新建状态(New ...

  2. [改善Java代码]断言绝对不是鸡肋

    建议19: 断言绝对不是鸡肋 在防御式编程中经常会用断言(Assertion)对参数和环境做出判断,避免程序因不当的输入或错误的环境而产生逻辑异常,断言在很多语言中都存在,C.C++.Python都有 ...

  3. 24小时学通Linux内核之进程

    都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲的全是进程,这点在大二的时候就困惑了我,结果那 ...

  4. makefile中使用变量

    makefile里的变量就像一个变量,变量的作用主要如下: (1)保存文件名列表. (2)保存编译器的参数. makefile中的变量是用一个字符串在makefile中定义的,这个文本串就是变量的值. ...

  5. MSP430常见问题之看门狗及定时器类

    Q1. 定时器两个中断TAIE 和CCIE,有什么区别?两个中断的中断向量一样吗?A1:TAIE 和CCIE指的是不同事件.TAIE指TAR 计数器溢出,从65535 到0 的变化,由TAIFG 引起 ...

  6. Emmet 语法大全(缩写语法/sublime 插件)

    Emmet 使用类似于 CSS 选择器的语法描述元素在生成的文档树中的位置及其属性. 元素 可以使用元素名(如 div 或者 p)来生成 HTML 标签.Emmet 没有预定义的有效元素名的集合,可以 ...

  7. jquery学习--选择器

    选择器:basic $('button') html 标签 $('#test') 标签ID $('.test') 标签的class $('.test,#test,h1') 多选用逗号隔开 $('*') ...

  8. sql常识-FULL JOIN

    SQL FULL JOIN 关键字 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行. FULL JOIN 关键字语法 SELECT column_name(s) FROM table_n ...

  9. 如何在UINavigationBar上添加UISearchBar以及UISearchDisplayController的使用 --OC --iOS

    那我们开始吧,下面是Sely写的一个Demo,分享给大家. 新建一个项目, UISearchDisplayController 的 displaysSearchBarInNavigationBar太死 ...

  10. javascript笔记—— call 简单理解

    call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, [,.argN ...