新手问题 前天微信回调那个 XXE 漏洞

sunjirui · 2018年07月06日 · 最后由 sunjirui 回复于 2018年07月06日 · 2225 次阅读

我就这么解析的,会有问题吗

otify_result = Hash.from_xml(request.body.read)["xml"]

本地验证了一下没有问题,好像 rails 已经帮我们处理。

xml_str = <<-END
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
<!ENTITY xxe SYSTEM "/Users/somebody/test.txt">
]>

<test>&writer;&copyright;&xxe;</test>
END

Hash.from_xml(xml_str)  # => {"test"=>"Bill GatesCopyright W3School.com.cn&xxe;"}

坐等其他发现😀

flydragon 回复

这样看,确实感觉没啥问题😁 😁

发现

通过源码跟踪,最终找到 xml 实体解析类:REXML::Entity ,没有找到对外部实体的引入处理逻辑。
不考虑项目中猴子补丁因素的话,Hash.from_xml() 应该是没有 xxe 漏洞的。

# location: ruby/lib/rexml/entity.rb
def value
  if @value
    matches = @value.scan(PEREFERENCE_RE)
    rv = @value.clone
    if @parent
      sum = 0
      matches.each do |entity_reference|
        entity_value = @parent.entity( entity_reference[0] )
        if sum + entity_value.bytesize > Security.entity_expansion_text_limit
          raise "entity expansion has grown too large"
        else
          sum += entity_value.bytesize
        end
        rv.gsub!( /%#{entity_reference.join};/um, entity_value )
      end
    end
    return rv
  end
  nil
end

跟踪过程

ruby: 2.3.3
rails: 4.2.7.1

  • ActiveSupport::XMLConverter
  • ActiveSupport::XMLConverter
  • ActiveSupport::XmlMini
  • ActiveSupport::XmlMini_REXML
  • REXML::Document
  • ...
  • REXML::Entity
flydragon 回复

十分感谢

sunjirui 关闭了讨论。 07月06日 20:10
需要 登录 后方可回复, 如果你还没有账号请 注册新账号