使用 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的主要内容,如果未能解决你的问题,请参考以下文章