Java el ognl 正则,struts2中ognl表达式 各种合集_struts2 ognl 正则表达式_struts2 ognl表达式...

8b77ca9682e94569e22ba3298b523c78.png

摘要

0x00 前言

它们是对结构说明236的引用(因为字段256中的代码和在字段240中的代码相同)和对数据结构222的开始的引用,字段258包含该开始地址。三、data uri schema将文件包含漏洞变成代码执行漏洞并绕过360网站卫士的waf。如果直接向被拦截函数的入口写入jmp指令,会引起cpu保护错误,因此在修改代码前要采用下面的方法绕过段保护机制:。

0x01 前置知识OGNL

struts2命令执行是利用ognl表达式,所以必须了解ognl。

1、HelloWorld

OGNL有三大要素,分别是表达式、Context、根对象。

栈中添加了student对象浅析ognlognl是object-graphnavigationlanguage的缩写,是一种功能强大的表达式语言通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的,实现字段类型转化等功能ognl用得最多的地方就是和struts2的标签绑定,也可以在配置文件中通过${}使用ognl表达式ognl中$号的使用1..在国际化资源文件中,引用ognl表达式2..在struts.xml文件中,引用ognl表达式ognl中%号的使用1..使用%{}可以取出保存在值。ognl是object-graph navigation language的缩写,它是一种功能强大的表达式语言(expression language,简称为el),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的,实现字段类型转化等功能。object value = ognl.getvalue(ognl, context, context.getroot())。

参数说明:

expressionognl表达式

context是一个实现了Map接口的对象

rootbean对象

来写一个helloworld,将上面抽象的东西实践一番。

class People{ public Integer age; public String realName; public void setAge(Integer age){ this.age = age;

} public void setRealName(String name){ this.realName = name;

} public Integer getAge(){ return this.age;

} public String getRealName(){ return this.realName;

}

} public class Temp{ public static void main(String[] args) throws OgnlException{

People root = new People();

root.setAge(100);

root.setRealName("lufei");

OgnlContext context = new OgnlContext();

context.put("nikename", "lufeirider"); //注意非根对象属性,需要加上#号 Object nikeName = Ognl.getValue("#nikename",context,root);

System.out.println(nikeName); //使用跟对象属性时候,不需要加#号 Object realName = Ognl.getValue("realName",context,root);

System.out.println(realName); //@[类全名(包括包路径)@[方法名|值名]] //执行命令 Object execResult = Ognl.getValue("@java.lang.Runtime@getRuntime().exec('calc')", context);

System.out.println(execResult);

}

}

输出结果

lufei

lufeirider

java.lang.ProcessImpl@1f17ae122、OgnlContext类

首先下载yasm最新源码,yasm下载地址:,下载最新的source .tar.gz源码(我这里使用的是这个版本yasm-1.2.0.tar.gz)。介绍地址也有下载地址,你可以进入下载地址,具体看下源码的大概大小(都是带演示数据的,安装完以后和演示站点一模一样,如果删除演示数据和图片,每个源码大小在20-30m左右。第二步:下载android-4.3.1_r1的device部分源码 由于我之前已经全部下载了android-4.3.1_r1的源码并编译成功运行到我的i9250手机上,具体参考我前面的文章,地址:。

public class OgnlContext extends Object implements Map,它是实现了Map接口的类。

看一下里面的主要方法和属性

重写了Map的put方法,遇到RESERVED_KEYS里面的key,然后根据key进行使用不同方法进行赋值。如果不在RESERVED_KEYS里面的,则放入一个叫_values的Map里面。

public Object put(Object key, Object value){

Object result; if (RESERVED_KEYS.containsKey(key)) { if (key.equals(OgnlContext.THIS_CONTEXT_KEY)) {

result = getCurrentObject();

setCurrentObject(value);

} else { if (key.equals(OgnlContext.ROOT_CONTEXT_KEY)) {

result = getRoot();

setRoot(value);

} else { if (key.equals(OgnlContext.CONTEXT_CONTEXT_KEY)) { throw new IllegalArgumentException("can't change " + OgnlContext.CONTEXT_CONTEXT_KEY

+ " in context");

} else { if (key.equals(OgnlContext.TRACE_EVALUATIONS_CONTEXT_KEY)) {

result = getTraceEvaluations() ? Boolean.TRUE : Boolean.FALSE;

setTraceEvaluations(OgnlOps.booleanValue(value));

} else { if (key.equals(OgnlContext.LAST_EVALUATION_CONTEXT_KEY)) {

result = getLastEvaluation();

_lastEvaluation = (Evaluation) value;

} else { if (key.equals(OgnlContext.KEEP_LAST_EVALUATION_CONTEXT_KEY)) {

result = getKeepLastEvaluation() ? Boolean.TRUE : Boolean.FALSE;

setKeepLastEvaluation(OgnlOps.booleanValue(value));

} else { if (key.equals(OgnlContext.CLASS_RESOLVER_CONTEXT_KEY)) {

result = getClassResolver();

setClassResolver((ClassResolver) value);

} else { if (key.equals(OgnlContext.TYPE_CONVERTER_CONTEXT_KEY)) {

result = getTypeConverter();

setTypeConverter((TypeConverter) value);

} else { if (key.equals(OgnlContext.MEMBER_ACCESS_CONTEXT_KEY)) {

result = getMemberAccess();

setMemberAccess((MemberAccess) value);

} else { throw new IllegalArgumentException("unknown reserved key '" + key + "'");

}

}

}

}

}

}

}

}

}

} else {

result = _values.put(key, value);

}

还重写了get方法,跟上面的类似。Ognl.getValue("#ct['root']",context,root);,context['root']就能获取到保留属性比如获取到保留属性root temp.People@7eda2dbb,而非在_value中获取。

来看下保留字符

5f14b5e49f051d94800f6881fac5d91b.png

public static final String CONTEXT_CONTEXT_KEY = "context"; public static final String ROOT_CONTEXT_KEY = "root"; public static final String THIS_CONTEXT_KEY = "this"; public static final String TRACE_EVALUATIONS_CONTEXT_KEY = "_traceEvaluations"; public static final String LAST_EVALUATION_CONTEXT_KEY = "_lastEvaluation"; public static final String KEEP_LAST_EVALUATION_CONTEXT_KEY = "_keepLastEvaluation"; public static final String CLASS_RESOLVER_CONTEXT_KEY = "_classResolver"; public static final String TYPE_CONVERTER_CONTEXT_KEY = "_typeConverter"; public static final String MEMBER_ACCESS_CONTEXT_KEY = "_memberAccess";

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-114616-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值