XML语法
1.是树形结构,必须具有根元素
1 | <root> |
例如
1 |
|
2.声明:<?xml version=”1.0” encoding=”UTF-8”?>
3.在标签中,大小写敏感
4.属性的值必须加引号
5.实体引用
一些字符拥有特殊含义,所以使用实体引用代替特殊字符
1 | <message>if salary < 1000 then</message> |
DTD
作用
在XML文档中加入DTD声明可以告诉XML解析器该文档遵循哪个DTD文档类型,对文档进行验证,以确保文档正确性。
1 |
|
限制:<!ELEMENT
XXE
什么是XXE:构造恶意DTD主要是利用实体引用
实体引用介绍:
一、通用实体
1.内部实体(无SYSTEM 不需要应用外部文件)
1 |
|
在user标签中,使用&进行引用,解析输出时就会被test替换
2.外部实体(带有SYSTEM 需要请求外部文件)
1 |
|
相当于在dtd文档中创建了外部实体xxe,该实体的作用是读取本地文件
当解析xml文档时会遇到&xxe,它会自动读取文件的操作
上面的SYSTEM引用的方法还能使用公用DTD的方法操作
二、参数实体
定义:%实体名
引用:%实体名
特点:类似上面通用实体,支持外部引用
举例:
1 | <!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> |
XXE危害
1.file://xxx读取文件
2.SSRF攻击
3.盲注 信息数据泄露
4.结合文件上传 getshell
web373(有回显)
1 |
|
我们来看代码,创建DOMDocument对象,加载XML文件,然后再XML文件中再提取ctfshow标签的内容,进行echo显示
解题:首先存在一个php://input读取我们抓包的内容
那么我们可以写一个xml文件
然后再ctfshow标签中引用外部实体,读取flag文件
1 |
|
得到flag
web374(无回显)
1 |
|
我们来观察这道题和上题的区别,同样存在xml文档的加载,但是却没有了echo进行回显,所以这道题怎么做
我们考虑flag外带,上我们自己的服务器将内容带出
分为两个部分:一个是直接让我们的题目服务器解析的xml文档语句,一个是我们存放在我们自己的vps上的外部dtd文档,然后在题目服务器xml解析时对我们的vps发起请求,然后在vps中将获得的内容传输到端口监听中
- 使用
php://filter
获取目标文件内容,然后将内容以http请求的方式发送到我们的vps上
1 |
|
2.放在我们服务器上的内容
1 |
|
首先在1中会解析%dtds 去调用2的内容
然后2的内容展示在面板上之后会触发2中%dtd的解析 将2中内层嵌套的语句加载到面板上
然后解析%showflag 去加载SYSTEM的语句,访问我们的vps,同时携带file获得的数据,其中%file获得已经在面板中1里面的请求。
注意!一定要注意 POST传输的数据里面一定不要和vps中的文件里面定义的变量重名。比如vps中设置的是dtd我们POST传输的时候需要dtds或者其他任意的。
然后再bp中POST传入payload
在自己服务器开启监听nc -lnvp port
web375
1 |
|
继续与上题进行类比,我们可以发现增加的是对xml头的整个语句的正则匹配
这里匹配到的语句是:<?xml version=”1.0”
绕过方法一:
直接不写了,传一下看看
1 | <!-- 要引用(dtd里面),所以要加百分号% --> |
绕过方法二:添加空格
1 |
|
绕过方法三:引号替换绕过
1 |
|
web376
1 |
|
比较与上题的区别,正则后面添加了一个/i表示整个匹配不区分大小写
和上一题的payload相同
web377
1 |
|
我们来看和上题的区别,添加了对http的限制
在xml文档的编码中,不仅支持utf-8编码,同时也支持utf-16编码,所以我们也可以将payload转为utf-8编码,然后post传送数据
1 | import requests |
我们发现编码后http彻底绕过
然后nc连接,成功获得flag
web378
打开后是一个登录界面,ctrl+u查看一下源码
看到post里存在xxe
访问/doLogin,post传参
1 | <?xml version="1.0" encoding="UTF-8"?> |