读书频道 > 网站 > 网页设计 > Web前端黑客技术揭秘
6.3.2 动态方法
13-01-23    奋斗的小年轻
收藏    我要投稿   

本文所属图书 > Web前端黑客技术揭秘

Web 前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含Web 前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash 安全、...立即去当当网订购

动态方法很难完美地实现检测引擎,这实际上是一次JavaScript源码动态审计的过程。从输入点到输出点的过程中可能会非常复杂,需要很多步骤,如果要这样一步步地动态跟踪下去,其代价是很高的,如果仅关注输入点与输出点,不关注过程,那么一些逻辑判断的忽视可能会导致漏报,比如,过程中会判断输入点是否满足某个条件,才会进入输出点。
下面先来看一些简单的模型,这有助于我们理解这个动态方法。

比如,如何检测出下面这个DOM XSS?
<script>
eval(location.hash.substr(1));
</script>

1)思路一

借用浏览器自身的动态性,可以写Firefox插件,批量对目标地址发起请求(一个模糊测试过程),请求的形式是:在目标地址后加上#fuzzing内容,比如其中一个模糊测试内容是:var x='d0mx55'。

在响应回来时,我们需要第一时间注入一段脚本劫持常见的输出点函数,劫持方式可以参考2.5.7节的“JavaScript函数劫持”,比如,劫持了eval函数如下:
var _eval=eval;
eval = function(x){
    if(typeof(x)=='undefined'){return;}
    if(x.indexOf('d0mx55')!=-1){alert('found dom xss');}
    _eval(x);
};

当eval(location.hash.substr(1));执行时,实际上是执行我们劫持后的eval,它会判断目标字符串d0mx55是否存在,若存在,则报DOM XSS。

在JavaScript层面劫持innerHTML这样的属性已经没那么容易了,常用的属性劫持可以针对具体的对象设置__defineSetter__方法,比如,如下代码:
window.__defineSetter__('x',function(){alert('hijack x')});
window.x ='xxxxyyyyyyyyyyyy';

当x赋值的时候,就会触发事先定义好的Setter方法。innerHTML属性属于那些节点对象,想劫持具体节点对象的innerHTML,需要事先知道这个具体节点的对象,然后设置__defineSetter__方法。

这样,如果要检测DOM XSS,就要劫持所有的输出点,比较麻烦,有没有更简单的方法?看思路二。

2)思路二

仍然借用浏览器动态执行的优势,写一个Firefox插件,我们完全以黑盒的方式进行模糊测试输入点,然后判断渲染后的DOM树中是否有我们期待的值,比如,模糊测试提交的内容都有如下一段代码:
document.write('d0m'+'x55')

如果这段代码顺利执行了,当前DOM树就会存在d0mx55文本节点,后续的检测工作只要判断是否存在这个文本节点即可,代码如下:
if(document.documentElement.innerHTML.indexOf('d0mx55')!=-1){
 alert('found dom xss');
};

这个思路以DOM树的改变为判断依据,简单且准确,不过同样无法避免那些逻辑判断上导致的漏报。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站