使用 Python 在 HTML 页面上检测 JavaScript

Posted

技术标签:

【中文标题】使用 Python 在 HTML 页面上检测 JavaScript【英文标题】:Detecting JavaScript on an HTML page using Python 【发布时间】:2011-05-14 14:22:37 【问题描述】:

我目前正在从事一个网络安全项目,该项目检查网站上的 XSS 漏洞,希望可以用于那里的渗透测试人员(以防你不相信我并认为我是某种脚本小子,这里是班级网站:http://netsec.cs.northwestern.edu/projects/)。

所以,我无法在给定的 html 页面上检测 javascript。我花了很多时间安装 PyV8 和 V8,它们似乎可以评估简单的 JavaScript 语句。但是,对于更“复杂”的 JavaScript 问题,例如警告框,PyV8 似乎不支持它。所以,我怀疑我是否可以为 PyV8 提供一些任意 JavaScript 代码并期望它给我相应的 JavaScript 输出。

我确实在 DrEval 中找到了这个 JS 服务器/客户端,但它似乎不适用于最新版本的 V8/PyV8。

请帮忙!我的项目从今天开始大约一周后到期,班上似乎没有人能够帮助我,因为这是一个相当奇怪的问题。..

嗯.. 如果这个问题以前在其他地方得到过回答,我提前道歉。我确实搜索了这个主题至少 2 个小时..

提前感谢您的回复!

【问题讨论】:

您为什么不尝试解析 HTML 并寻找脚本标签或 JavaScript 函数调用?这似乎是检测给定页面上是否正在使用 JS 的明显方法。 Nathon:这真的很棘手。 XSS 攻击可以有多种不同的形式。检查 您不会使用正则表达式解析 html。您使用 html 解析器。另外,您提供的链接不适合我吗?最后,这个项目花了多少时间? @Chris:请原谅我糟糕的技术词汇。是的,我想你可以使用解析器,但它又回到了同样的问题:你如何有效地处理编码字符?我知道为什么链接不加载,我给 TA 发了一封电子邮件;所以它应该很快就会备份。我有一个月的时间来完成这个项目,我花了一个月的时间在项目的其他方面(获取链接/输入字段/与某些给定的 python 框架集成)。你为什么要问? 对项目感到好奇,仅此而已。 :-) 【参考方案1】:

在网页源代码中查找“text/javascript”是一种令人难以置信的 hacky 方法。

import urllib2
if urllib2.urlopen('http://www.google.co.uk').read().find('text/javascript') == 0:
    print "It has js."

这不是我很乐意从知道正确方法的人那里听到的最佳答案。

【讨论】:

【参考方案2】:

我不太确定你想做什么,但这里有一些想法:

    如果您想在网页上下文中运行 JavaScript 代码,您需要一个浏览器或一个仿真器。试试envjs。不过,它需要 Java,因为它需要一个 JavaScript 解释器。

    我不知道有哪个库可以为 Python 提供相同的功能。也许你可以解决这个问题。 envjs 主要是用 JavaScript 编写的,但它需要解释器的一些支持功能(打印到控制台、下载数据、打开文件)。

    如果您可以将 JavaScript 代码注入页面,无论已经存在什么代码,都会发生 XSS 漏洞。因此,您需要检查表单的所有字段,将表单发布到服务器,然后检查它是否正确转义了下一页上的所有值。

【讨论】:

您好亚伦,感谢您的回复。我正在尝试使用 python 脚本通过 XSS 字符串注入攻击我自己的(不安全的)论坛。我能够成功执行注入,但我真的不知道如何从我注入的页面读取 javascript 输出。例如,如果我使用警告框进行注入,人类会看到这个警告框,但我的脚本看到的只是 HTTP 响应中的一些文本。我想知道是否有办法在 python 中执行此操作,因为这是我的项目需要编写的内容。与此同时,我将继续探索 envjs.. 好吧,如果页面的其余部分没有使用"alert('XSS')",那么将它添加到您的 XSS 攻击中并搜索这个确切的字符串。 这种方法绝对适用于未编码的 XSS 注入,但编码的 XSS 注入呢?例如,j j在 html 中。因此,您可以构建一个编码的 XSS 攻击,该攻击将正常显示在浏览器上,但在页面源中仍然作为编码字符。这就是为什么我更喜欢使用 JS 解释器而不是使用解析/正则表达式。 这不是重点;解释器将执行它可以找到的任何东西。问题不是“它是如何编码的?”但是“我可以插入代码吗?”如果所有输入都正确转义,则没有任何编码技巧会使 XSS 再次工作。假设您尝试使用 &#6A; 隐藏脚本。如果转义有效,则变为&#6A; -> 死【参考方案3】:

PyV8 是 V8 javascript 引擎的 Python 绑定。它甚至可以评估最复杂的 JavaScript 代码。 Google Chrome 也在使用它。

话虽如此,您需要做一些事情才能使其正常工作。首先,PyV8 只是一个 javascript 引擎。它不构造 DOM。因此,您需要自己创建一个 DOM 并使用它运行 PyV8 上下文。

另外,您说警报功能不起作用。 alert(); 函数是 DOM 的一部分,它是 window.alert(); 的简写。因此,您必须在 DOM 中指定每个函数和属性。

PyV8 源代码带有一个简单的 DOM。可以从http://code.google.com/p/pyv8/source/browse/下载

【讨论】:

以上是关于使用 Python 在 HTML 页面上检测 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫爬取页面源码在本页面展示

如何检测是不是在 HTML 页面上的任意位置按下了某个键?

Python爬虫教程-使用chardet

python selenium模拟滑动操作

如何检测 HTML 页面上的文件拖动

Python爬虫2-检测编码(使用chardet)