常规思路:先扫描端口,扫描目录
这里有点迷惑了,我用nessus扫了一遍扫出来两个开放端口:80和5335,。但是用nmap只扫描出来了一个80 端口 不知道是什么原因,有懂的大佬可以解释一下
不管了,根据后面的结果来看端口多一个少一个完全不影响
照例访问80:
没啥用,apache默认页面
端口5335访问不了
接下来扫目录,御剑和dirb都可以,看用什么系统了
index.html依然是apache的默认界面
robots.txt:
xxe是目录,admin.php是页面,但是直接访问xxe路径也是可以的
xxe:
xxe登录框,弱密码尝试失败。想了一想这不是废话吗,要是弱密码登录上去的话这靶机也太弱智了。
直接burp抓包看看请求包:
看看post的数据,这不就是xml标签吗?
知道了为什么要叫xxe靶机
看了好多xxe靶机通关的文章没人写为什么可以实现文件读取,我还是打算简单写一下,一来方便自己以后看,二来对还没有接触过xxe漏洞的朋友来说也比较友好
xxe的基本概念:
首先要明白,xml是具有存储功能的,而且当我们输入一个错误的用户名的时候,错误信息就会在name标签那里展现出来,如下图:
这是为什么呢?这里就涉及到xml的特性了,我们先来看看xml的文本结构:
<?xml version="1.0" encoding="UTF-8"?>
这部分是xml声明
<!DOCTYPE 文件名 [ <!ENTITY实体名 "实体内容"> ]>
这部分是xml的定义文档类型的DTD
<元素名称 category=“属性”>
文本或其他元素
</元素名称>
这部分是文档元素
这三块上下连在一起就构成了xml文本的整体结构。
这里的漏洞就出现在DTD中,在xml中,可以在DTD中定义应用外部DTD以供xml来解析,其本意是为了方便在各个文档中创建共享的公共引用(这一点与文件包含有异曲同工之妙)。而且,在引用外部实体之后,xml会自动将引用的外部实体内容体现在xml正文中(注意正文中引用的test的格式一定要写对,前面&后面;)。如果我们可以随意修改引用的外部实体,就有可能造成任意文件读取。
举例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<name>&test;</name>
上面的代码中,xml外部实体test被赋值为/etc/passwd,跟文章上面说的一样,xml读取的时候会直接将被读取的/etc/passwd内容显示在页面上
要注意在name标签里面的格式一定要正确,前面加&后面加; 而且都要注意是英文。
了解了上述思路之后,再看burp拦截出来的包就很简单了:
直接写一段xml通过报错读到/etc/passwd
前面还有个admin.php没有看到,可以读一下php的源码
用php://filter/read=convert.base64-encode/resource=admin.php 来获取base64编码之后的网页源码
解码:
<?php
session_start();
?>
<html lang = "en">
<head>
<title>admin</title>
<link href = "css/bootstrap.min.css" rel =