zoukankan      html  css  js  c++  java
  • S2-029

    前言

        S2-029漏洞是由于Struts2的i18n、text标签中的name属性的值会经过两次Ognl表达式解析。

    正文

        假设有如下缺陷代码:

        jsp文件中使用Struts2的i18n标签获取请求中的参数“jinqi”,放入了attribute中。struts2的i18n标签中的name属性通过%{}的形式读取该参数值后将该值当作ognl表达式处理(这是第一次ognl表达式处理,这是因为struts2的标签中本来就是通过OgnlValueStack值栈来取值的)。
        访问http://localhost:8088/struts2-showcase-2.1.6/S2-029.jsp?jinqi=aaaa,在I18n.class的start方法中打断点停下来看看:

    跟进findString方法中:

        TextParseUtil.translateVariables这个方法我们之前分析过,就是将expr中%{}里面的字符串当作ongl表达式解析,此时%{}里面包含的字符串是#request.jinqi,也就是说读取request对象中的jinqi属性,而jinqi属性的值在上面是我们可控的,此时是aaaa,回到I18n.class的start方法中:

        可以看到,此时获取的name就是aaaa,然后用作字符串拼凑后,放入了findValue方法中,跟进该方法:

        很明显,调用了OgnlValueStack.findValue(),我们知道这个方法里面也是将输入的参数当作了Ognl表达式执行,此时的参数expr是getTexts('aaaa'),由于aaaa是受我们控制的,且该参数值是直接通过字符串拼凑的,我们只需要将字符串前半部分 getTexts('  和后半部分 ') 闭合掉就好了,中间接我们的poc就好了。

        本地windows测试用的弹计数器的poc(get请求,所以用的url编码):%27)%2c%23cmd%3d%27calc%27%2c%23cmds%3d%7b%27cmd.exe%27%2c%27%2fc%27%2c%23cmd%7d%2c%23p%3dnew+java.lang.ProcessBuilder(%23cmds)%2c%23process%3d%23p.start()%2cnew+java.lang.String(%27

    总结

         本来还想整个有回显的poc出来的,但是一直没成功,后来想想这个漏洞利用起来较为麻烦,难以批量,于是就放弃了,这个漏洞就当了解算了。

  • 相关阅读:
    SSH服务附带----SFTP
    SSH附带的远程拷贝----SCP
    linux下的SSH服务
    model.form使用,配合form的钩子
    import_module 导入变量的包
    dir函数
    python爬虫之scrapy
    python爬虫之解析库Beautiful Soup
    django 过滤器,标签
    django 验证码实现
  • 原文地址:https://www.cnblogs.com/jinqi520/p/10814915.html
Copyright © 2011-2022 走看看