【问题标题】:How to confirm a JavaScript popup using Nokgiri or Mechanize如何使用 Nokgiri 或 Mechanize 确认 JavaScript 弹出窗口
【发布时间】:2017-04-09 04:15:34
【问题描述】:

我正在运行一个将在我的本地主机上打开的脚本。我的本地服务器是一个易受攻击的 Web 应用测试套件。

我正在尝试确认来自 JavaScript 警报的 XSS 弹出窗口。例如:

http://127.0.0.1:65412/v?=0.2<script>alert("TEST");</script>

我需要使用 Mechanize 或 Nokogiri 确认弹出窗口是否发生。是否可以使用 Nokogiri 或 Mechanize 确认弹出窗口?

例如:

def page(site)
  Nokogiri::HTML(RestClient.get(site))
end

puts page('http://127.0.0.1:65412/v?=0.2<script>alert("TEST");</script>')

【问题讨论】:

    标签: ruby xss nokogiri mechanize ruby-2.3.1


    【解决方案1】:

    Nokogiri 和 Mechanize 因为它构建在 Nokogiri 之上,所以可以解析 HTML 并返回 &lt;script&gt; 标签的内容。标签的内容是文本,所以此时有必要查看文本内部以找到您想要的内容:

    require 'nokogiri'
    
    doc = Nokogiri::HTML(<<EOT)
    <html>
    <head>
    <script>alert("TEST");</script>
    </head>
    </html>
    EOT
    
    script_content = doc.at('script').content # => "alert(\"TEST\");"
    

    很容易检查此时是否存在子字符串:

    script_content['alert("TEST");'] # => "alert(\"TEST\");"
    

    或:

    !!script_content['alert("TEST");'] # => true
    

    注意:Nokogiri 或 Mechanize 无法判断弹出窗口是否发生,因为它会在浏览器运行 JavaScript 时发生。 Nokogiri 或 Mechanize 都不理解或解释 JavaScript。只有像 Watir 这样的工具或解释 JavaScript 的工具才能做到这一点。

    【讨论】:

      【解决方案2】:

      肯定不是,那是因为 Mechanize 和 Nokogiri 都没有运行 Javascript。

      相反,您可以使用Selenium

      类似这样的:

      require 'selenium-webdriver'
      
      class AlertChecker
        Driver = Selenium::WebDriver.for :firefox
        def initialize(url)
          Driver.navigate.to url
        end
        def raise_alert(text)
          Driver.execute_script "alert('#{text}')"
          self
        end
        def safely_get_alert
          begin
            Driver.switch_to.alert
          rescue Selenium::WebDriver::Error::NoAlertOpenError
          end
        end 
      end
      

      用法:

      alert_checker = AlertChecker.new("http://my.website")
      
      alert = alert_checker.safely_get_alert
      # => nil
      
      alert_checker.raise_alert("hack")
      alert = alert_checker.safely_get_alert
      puts alert.text
      # => 'hack'
      
      # As far as I'm aware Selenium doesn't have a built-in way
      # to tell you if it's an alert, confirm, or prompt.
      # But you know it's a prompt, for example, you could also send
      # keys before accepting or dismissing
      alert.accept
      
      alert = alert_checker.safely_get_alert
      # => nil 
      

      不过,Selenium 处理警报有一些棘手的问题。

      如果不使用rescuetry 之类的内容,您的代码将无法检测类型(提示、确认或警报)。一切都通过switch_to.alert 到达。

      此外,如果您的浏览器打开了警报,则除非您处理警报,否则您将无法运行任何后续命令。假设您在警报打开时尝试navigate.to;您会收到类似于 您没有处理警报 的错误,并且您的 navigate.to 命令必须重新运行。引发此错误时,警报对象也将丢失。

      以这种方式使用救援作为控制结构有点不吸引人,但我不知道有任何其他选择

      【讨论】:

      • 那么这个怎么样,有没有办法通过html找到它?像要解析的脚本标签吗?
      • 可能确定发生 XSS 的最简单方法是运行 Javascript(不能使用 Nokogiri / Mechanize)。
      • 是的,我认为这并不容易
      • 运行 javascript 是什么意思?
      • Mechanize/Nokogiri 只需获取 HTML。它包括 Javascript,但实际上从未运行过。就像如果您有一个通过 AJAX 加载其所有内容的网站,那么您将永远看不到它。另一方面,Selenium 使用实际的浏览器,因此它可以运行 Javascript。
      猜你喜欢
      • 2011-10-19
      • 2012-09-10
      • 1970-01-01
      • 2011-03-24
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      相关资源
      最近更新 更多