使用Python检测HTML页面上的JavaScript

3
我目前正在进行一个网络安全项目,检查网站上的XSS漏洞,希望可以为渗透测试人员提供帮助(如果你不相信我,认为我是某种脚本小子,请看这个课堂网站:http://netsec.cs.northwestern.edu/projects/)。
所以,我在检测给定HTML页面上的JavaScript时遇到了问题。我花费了很多时间安装PyV8和V8,它们似乎可以评估简单的JavaScript语句。然而,对于更“复杂”的JavaScript问题,例如警告框,PyV8似乎不支持。因此,我怀疑是否可以将任意JavaScript代码输入PyV8并期望它给出相应的JavaScript输出。
我找到了DrEval中的JS服务器/客户端,但在最新版本的V8 / PyV8中似乎无法使用。
请帮忙!我的项目将在一周后截止,班里没有人能够帮助我,因为这是一个相当奇怪的问题...
啊...如果这个问题之前已经得到答案,我预先道歉了。我搜索这个主题至少2个小时...
感谢您提前的回复!

1
为什么你不尝试解析HTML并查找脚本标签或JavaScript函数调用呢?这似乎是检测给定页面是否使用JS的明显方法。 - nmichaels
Nathon: 嗯,这真的很棘手。XSS 攻击可以采用许多不同的形式。检查 <script> 标签是一种方法,但我还需要检查编码字符。因此,我目前倾向于使用解释器方法,因为如果我使用解析方法,正则表达式可能会变得相当复杂。 - rith87
你不应该使用正则表达式来解析HTML,而是应该使用HTML解析器。另外,你提供的链接对我来说无法加载?最后,这个项目给了多少时间? - Chris
@Chris:抱歉我的技术词汇不太好。是的,我猜你可以使用解析器,但问题仍然是一样的:如何高效地处理编码字符?我不知道为什么链接无法加载,我已经给TA发送了电子邮件,所以它应该很快就会恢复。我有一个月的时间来完成这个项目,我已经花时间在项目的其他方面(获取链接/输入字段/与某些给定的Python框架集成)上。顺便问一下,你为什么要问呢? - rith87
只是对这个项目感到好奇。 :-) - Chris
3个回答

0

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

  1. 如果你想在网页的上下文中运行JavaScript代码,你需要一个浏览器或者一个模拟器。试试envjs。它需要Java,因为它需要一个JavaScript解释器。

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

  2. XSS漏洞发生在你可以将JavaScript代码注入到页面中时,无论已经存在什么代码。所以你需要检查表单的所有字段,将表单提交到服务器,然后检查它是否正确地转义了下一页的所有值。


你好,Aaron,感谢回复。我正在尝试使用Python脚本使用XSS字符串注入攻击我的(不安全的)论坛。我能够成功执行注入,但我不知道如何读取我注入页面上的JavaScript输出。例如,如果我使用警报框进行注入,人类会看到这个警报框,但是我的脚本只能看到HTTP响应中的一些文本。我想知道是否有一种方法可以在Python中实现这一点,因为这是我的项目需要编写的语言。同时,我将继续探索envjs。 - rith87
如果页面的其余部分没有使用"alert('XSS')",那么将其添加到您的XSS攻击中并搜索此确切字符串。 - Aaron Digulla
这种方法当然适用于未编码的XSS注入,但编码的XSS呢?例如,在html中 j <--> j。因此,您可以构建一个编码的XSS攻击,它在浏览器中正常显示,但在页面源中保持为编码字符。这就是为什么我更喜欢使用JS解释器而不是使用解析/正则表达式的原因。 - rith87
那不是重点;解释器将执行任何它能找到的内容。问题不是“它如何编码?”而是“我能插入代码吗?”如果所有输入都被适当地转义,没有编码技巧可以让跨站脚本攻击再次生效。比如你试图用 &#6A; 来隐藏脚本。如果转义起作用,那就变成了 &amp;#6A; -> 失效。 - Aaron Digulla

0

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

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

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

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


0
一个非常hacky的方法是在网页源代码中查找"text/javascript"。
import urllib2
if urllib2.urlopen('http://www.google.co.uk').read().find('text/javascript') == 0:
    print "It has js."

这并不是最好的答案,我很乐意听到有人知道正确的做法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接