web常见漏洞四

2021/12/13 网络安全

xxe、文件读取、cookie、session等漏洞

1、XXE 漏洞

XML 外部实体注入(XML External Entity)简称 XXE 漏洞,XML 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素。

概括一下就是”攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题”也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

  • 实体是对数据的引用;根据实体种类的不同,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>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>

其中,文档定义类型(DTD)可以是内部声明也可以引用外部 DTD。

  • 内部声明 DTD 格式:<!DOCTYPE 根元素 [元素声明]>

  • 引用外部 DTD 格式:<!DOCTYPE 根元素 SYSTEM “文件名">

在 DTD 中进行实体说明时,将使用 ENTITY 关键字来声明。实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体可在内部或外部进行声明。

  • 内部声明实体格式:<!ENTITY 实体名称 “实体的值">
  • 引用外部实体格式:<!ENTITY 实体名称 SYSTEM “URI">

SYSTEM、PUBLIC 对外部资源进行申请。

漏洞代码:

<?php
if(isset($_POST['submit']) and $_POST['xml'] != null){
    $xml =$_POST['xml'];
    // $xml = $test;
    $data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
    if($data){
    	$html.="<pre>{$data}</pre>";
    }else{
    	$html.="<p>XML 声明、DTD 文档类型定义、文档元素这些都搞懂了吗?</p>";
    }
}
?>

获取 post 的 xml 文件 传递到 simplexml_load_string 再进行输出会遭成 xxe 注入

测试的payload

<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///etc/passwd"> ]> <x>&f;</x>

xxe漏洞常用利用如下

  • 读取敏感文件,一些需要进行url编码
<?xml version="1.0"?><!DOCTYPE a [<!ENTITY b SYSTEM "file:///etc/passwd">]><c>&b;</c>

<?xml version="1.0"?><!DOCTYPE a [<!ENTITY b SYSTEM"file:///C:/Windows/win.ini">]><c>&b;</c>
  • 扫描内网和端口,通过扫描 ip 和端口确定内网机器的 ip 和端口开发情况,访问端口会获取 baner 信息

    <?xml version="1.0"?>
    <!DOCTYPE ANY [
    <!ENTITY test SYSTEM "http://127.0.0.1:80">
    ]>
    <abc>&test;</abc>
    

防御的话有以下几点

  1. 使用开发语言提供的禁用外部实体的方法
  2. 过滤用户提交的 XML 数据关键词:<!DOCTYPE 和<!ENTITY,或者,SYSTEM 和 PUBLIC
  3. 升级 libxml 组件

2、任意文件读取与下载漏洞

任意文件读取与下载又名不安全的文件下载,一些网站的业务需要,可能提供文件查看或下载的功能,如果对用户查看或下载的文件不做限制,就能够查看或下载任意的文件,可以是源文件,敏感文件等等。

通过任意文件下载,可以下载服务器的任意文件,web 业务的代码,服务器和系统的具体配置信息,也可以下载数据库的配置信息,以及对内网的信息探测等等

出现漏洞的注意原因:传入的文件名没有任何过滤,接着判断文件是否存在,存在设置文件头下载。

192.168.0.103/06/vul/unsafedownload/execdownload.php?filename=../../../../../../../etc/passwd

2.1 windows 常见敏感文件目录

C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS 配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql 配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php 配置信息
C:\Windows\my.ini //Mysql 配置信息

2.2 linux敏感文件

/etc/passwd
/etc/shadow
/etc/hosts
/root/.bash_history //root 的 bash 历史记录
/root/.ssh/authorized_keys
/root/.mysql_history //mysql 的 bash 历史记录
/root/.wget-hsts
/opt/nginx/conf/nginx.conf //nginx 的配置文件
/var/www/html/index.html
/etc/my.cnf
/etc/httpd/conf/httpd.conf //httpd 的配置文件
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz
/proc/sched_debug // 提供 cpu 上正在运行的进程信息,可以获得进程的 pid 号,可以配合后面需要 pid的利用
/proc/mounts // 挂载的文件系统列表
/proc/net/arp //arp 表,可以获得内网其他机器的地址
/proc/net/route //路由表信息
/proc/net/tcp and /proc/net/udp // 活动连接的信息
/proc/net/fib_trie // 路由缓存
/proc/version // 内核版本
/proc/[PID]/cmdline // 可能包含有用的路径信息
/proc/[PID]/environ // 程序运行的环境变量信息,可以用来包含 getshell
/proc/[PID]/cwd // 当前进程的工作目录
/proc/[PID]/fd/[#] // 访问 file descriptors,某写情况可以读取到进程正在使用的文件,比如access.log

# ssh
/root/.ssh/id_rsa
/root/.ssh/id_rsa.pub
/root/.ssh/authorized_keys
/etc/ssh/sshd_config
/var/log/secure
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/syscomfig/network-scripts/ifcfg-eth1

2.3 任意文件读取与下载防御

  1. 过滤点(.)使用户在 url 中不能回溯上级目录
  2. 正则严格判断用户输入参数的格式
  3. php.ini 配置 open_basedir 限定文件访问范围

3、xpath 注入漏洞

XPath 是一种查询语言,它描述了如何在 XML 文档中查找特定元素(包括属性、处理指令等)。既然是一种查询语言,XPath 在一些方面与 SQL 相似,不过,XPath 的不同之处在于它可以用来引用 XML 文档的几乎任何部分,而不受访问控制限制。在 SQL 中,一个“用户”(在 XPath/XML 上下文中未定义的术语)的权限被限制在一个特定的数据库,表,列或者行。使用 XPath 注入攻击,攻击者可以修改 XPath 查询语句来执行所选择的操作

XPath 盲注攻击可以从一个使用不安全方式嵌入用户信息的应用中提取数据。在输入未被过滤的情况下,攻击者可以提交并执行有效的 XPath 代码。这种类型的攻击适用于以下情况:攻击者不清楚 XML 文档的架构,或者错误消息被抑制,一次只能通过布尔化查询来获取部分信息,就像 SQL 盲注一样。

demo代码入下:

<?php
if(file_exists('xpath_user.xml')){
    $xml = simplexml_load_file('xpath_user.xml');
    if($_POST['submit']){
        $username=$_POST['username'];
        $password=$_POST['password'];
        # //:从匹配选择的当前节点选择文档中的节点,不考虑它们的位置
        $sql="//user[@username='{$username' and @password='{$password}']";
        $result = $xml->xpath($sql);
    }
}
?>

读取 user.xml 获取 post 的账号和密码拼接字符串进行查询。直接获取然后拼接,没有做任何处理,可以进行注入

username=admin' or '1'='1 &password=xxxxxxxxxxx&submit=submit

可以进行盲注,和sql一样,先判断长度

  • string-length()获取字符长度
  • substring 截取字符
  • username=admin'and string-length(@password)=5 or '1'='1&password=0&submit=submit
  • 返回正确是就等于登录成功
  • 去猜密码username=admin'and substring(@password,1,1)='a' or '1'='1&password=0&submit=submit

防御方案:

  1. 数据提交到服务器上,在服务端正式处理这批数据之前,对提交数据的合法性进行验证。
  2. 检查提交的数据是否包含特殊字符,对特殊字符进行编码转换或替换、删除敏感字符或字符串。
  3. 对于系统出现的错误信息,以 IE 错误编码信息替换,屏蔽系统本身的出错信息。
  4. 参数化 XPath 查询

4、cookie 登录绕过漏洞

如果用户登录验证使用,cookie 身份验证会存在安全隐患,cookie 信息是外部可控制的。如果验证不严很容易被绕过。

cookie 机制则是在客户端保持状态的方案,cookie又叫会话跟踪机制,而session 机制采用的是在服务器端保持状态的方案。

cookie 分为会话 cookie 和持久 cookie,会话 cookie 是指在不设定它的生命周期 expires 时的状态,前面说了,浏览器的开启到关闭就是一次会话,当关闭浏览器时,会话 cookie 就会跟随浏览器而销毁。当关闭一个页面时,不影响会话 cookie 的销毁。持久 cookie 则是设定了它的生命周期 expires,对于持久 cookie,可以在同一个浏览器中传递数据。

在 WEB 安全中存在安全隐患,多数发生在验证登录。不少程序在验证处判断 cookie 是否为空,假如不为空即可登录,cookie 可预测。

服务端demo:

<?php
include 'init.php';
if($_COOKIE['username']){
	echo "登录成功【{$_COOKIE['usernme']}】"
}
?>

简单的验证了cookie,而cookie可以在浏览器提交的数据进行修改的,用 buspteuie 修改 username 不等于空即可绕过。

防御也很简单:

  1. 使用 cookie 身份验证时,不要使用简单的验证,对外部输入的参数进行过滤.
  2. 尽量使用 session 安全认证,seesion 是外部不可控的.

5、session 身份绕过漏洞

session 主要用于身份验证,登陆后的 session 保存在服务器,如果 session 存在网站目录,或者 session 存储于数据库,如果存在 sql 注入或者目录浏览等漏洞,得到这个用户登录后的 session,恶意用户得到这个 session 可以伪造进行登录.

session 的机制 是会在浏览器生成一个 cookie session_id 也会在服务器里生产一个 session id 文件 假如在做身份证认证的时候就会在这个服务器里的文件写入要验证的内容。

因为id在服务器,所以需要扫描服务端的敏感文件,假设需要找到tmp目录,tmp目录可被浏览并且当用户访问当前的页面的时候就会在tmp目录下生成session_id 登录过后的用户就会 session_id 里存在用户名。就可以进行绕过

扫描出来目录文件之后检索所有当前的 session_id 进行验证。 如果存在用户即可绕过。用 burpsuite 替换 cookie PHPSESSID 的值 就可以绕过。

防御也很简单:不要把 seesion 放置网站目录,如果需要请设置权限访问.除了本地其他用户禁止访问。

6、伪随机码漏洞

伪随机码,是程序语言生成的一定范围的一串数字字符,它的范围是可控的,可以遍历的,很多程序员在开发过程中,如果使用了伪随机数,对提交没做限制,会造成漏洞。

伪随机码 结构可以预先确定,重复产生和复制,具有某种随机序列的随机特性的序列号。在 WEB 开发中 伪随机码主要用于确定范围 例如 6 位数的范围是 000000-999999 这个范围内随机生成一个值。在 php 里就有这样的函数 rand()函数是产生随机数的一个随机函数例如生成 000000-999999 可以这样设置 rand(000000,999999)

在 WEB 安全里 用到这样的伪随机数一般是手机获取验证码。

如果这个验证码使用这种模式,我们就可以枚举所有数值进行对比,即可绕过。

首先提交手机 获取验证码抓包发送到 intruder 设置 payload 为 number 设置范围,提交攻击。

防御办法:

  1. 使用安全性高的随机码,保证随机码是唯一的。
  2. 在随用伪随机码进行程序验证时,设置提交的次数,超过指定的次数进行销毁。
  3. 在一段时间内的次数进行限定,超过无效。

7、密码找回漏洞

为了防止用户遗忘密码,大多数网站都提供了找回密码功能。常见的找回密码方式有:邮箱找回密码、根据密码保护问题找回密码、根据手机号码找回密码等。虽然这些方式都可以找回密码,但实现方式各不相同。无论是哪种密码找回方式,在找回密码时,除了自己的用户密码,如果还能找回其他用户的密码,就存在密码找回漏洞。

假设一个服务端的找回密码流程如下:

  1. 输入邮箱忘记密码
  2. 根据邮箱查询到用户,然后根据账户和邮箱和密码进行md5加密
  3. 创建token
  4. 根据token修改密码
  5. 修改成功

所以修改用户的密码是根据 token 来修改的,所以知道 token 的值就可以修改密码。

生成token的函数如下

function create_pass($username,$email){
    $token=md5(time().$username.$email);
    return $token;
}

我们在提交 key 的之前 生成一分钟或者一个小时以内的 token 用脚本去访问每一个链接,假如存在的 token 就可以修改密码

<?php
function create_pass($username,$email){
    $token=md5(time().$username.$email);
    return $token;
    }
    for($i=1;$i<=3600;$i++){
    $timex= create_pass('admin','moon@moonsec.com');
    write_file($timex."\n");
    echo $i."\r\n";
    sleep(1);
}
function write_file($c){
	fwrite(fopen("time.txt", "a+"),$c);
}
?>

根据以上原理,程序生成一小时的 token

防御方案:

  1. 验证码爆破的,从验证码有效期和请求次数进行限制;
  2. token 验证之类的,不要直接返回给用户;
  3. 修改加密算法和加密内容,一定要是强加密,也要做到增加猜解难度或密文不可猜解;
  4. 用户身份验证一定要在后端实现;
  5. 在最后一步修改密码的动作时,一定要校验帐号是否通过了验证、短信与手机号是否对应、发送短信与已校验帐号不要使用同一个 session 名称;
  6. 非常重要的一点:上线前一定要经过安全测试! !

Search

    Table of Contents