摘要
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中获取。
来看下保留字符
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