XML简介
- xml是可扩展的标记语言,设计用来进行数据的传输和存储。
//xml文档声明
<?xml version"1.0" encoding="UTF-8" ?>
//DTD文档类型声明定义
<!DOCTYPE message [//文档类型
<!ELEMENT message(receiver,sender,header,msg)>//元素定义
<!ELEMENT receiver (#PCDATA)>
...
//PCDATA 是被解析的字符数据,这些文本将被解析器检查实体以及标记,文本的标签会被当作标签来进行处理,而实体将会展开;但是解析的字符不应当包含&、< 、> 字符,需要使用&<>来进行替换
//CDATA:字符数据,不会被解析,标签不会当作标记来对待,其中的实体不会展开。
]>
//文档元素
<message>
<to>lalala</to>
...
<message>
- xml介绍
1、可扩展标记语言
2、传输数据,而非显示数据
3、标签需要自行定义
4、具有自我描述性
5、w3c的推荐标准
6、不作为
7、纯文本
8、对http的补充
- 文档定义:
内部声明:< !DOCTYPE 根元素 [元素声明]>
外部引用:< !DOCTYPE 根元素 SYSTEM ”文件名" >
内外部DTD文档结合:< !DOCTYPE 根元素 SYSTEM “DTD文件路径" [定义内容] >
关键字:
DOCTYPE :DTD声明
ENTITY:实体的声明
SYSTEM/PUBLIC:外部资源申请
- 语法规则
所有的xml元素必须有一个关闭标签
xml标签对大小敏感
xml必须正确嵌套
xml属性必须加引号
实体引用
xml中,空格会被保留
xml必须有一个根元素
- 实体
对数据的引用,根据实体的不同,xml解析器将会对实体的替代文本或外部文档的内容来替代实体引用,主要分为四类:
1、内置实体
2、字符实体
3、通用实体
4、参数实体
参数实体用% 实体名 申明 ,引用用%实体名
其余的直接用实体名声明,引用时加&引用
参数实体只能在DTD中声明,DTD中使用
//实体声明:
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ELEMENT xxe "thinking">
]>
<foo>&xxe;</foo>
//外部实体
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ELEMENT xxe SYSTEM "URL/URI">
]>
<foo>&xxe;</foo>
- xxe也叫xml外部实体注入,xxe漏洞发生在应用程序解析xml输入时,没有禁止外部实体的加载,导致加载恶意外部文件,造成文件读取。命令执行。内网端口扫描、攻击内网网站、发起dos攻击等危害:
注入:数据恶意修改,导致服务器最终执行了恶意代码
外部实体:通过调用外部实体声明部分对xml数据进行修改。插入恶意代码;XXE漏洞触发点时可以上传xml文件的位置,没有对恶意的xml文件进行过滤,导致恶意xml文件上传,因此xxe指的是xml数据在传输过程中利用外部实体部分的SYSTEM关键字导致xml解析器可以从本地文件或远程的url中读取受保护的数据;
- 挖掘方式
1、判断数据类型
<?xml version="1.0" encoding="utf=8"?>
2、判断xml是否进行了解析
3、判断是否支持外部实体。尽量使用自己的VPS判断,避免不会显
4、提交post请求xml文件,请求头加cotent-type:application/xml,同时添加:< test >cat< /test >
5、漏洞利用
读取敏感信息/文件
内网探测