【漏洞】请求伪造漏洞
前言
部分网站的后台可以处理非当前域名的请求,此时可以使用请求伪造进行渗透
CSRF跨站请求伪造
- 跨站请求伪造(Cross-Site Request Forgery)来自于客户端
漏洞利用
- 某网站的修改密码GET请求为
http:example.com/reset?new_password=123456
,此时我们可以创建一个以当前网站域名为文件名的网页文件example.com.html
,并在文件中将修改密码请求的URI作为<img>
标签的参数
文件名改为与当前网站同名是因为部分网站在接收请求时会检测请求中是否包含以当前网站域名的关键字,此时虽然伪造网站的域名不是与当前网站相同,但是如果当前网站源码中只做了检测是否包含关键字的代码进行验证,就依然能通过验证
更高级的请求需要分析原请求的结构进行伪造,此处只是给一个示例
example.com.html
1 | <img src="http:example.com/reset?new_password=123456"> |
- 此时进入这个网页的用户密码将被强制修改
防御
无效防御
- 使用Cookie进行身份认证
所有Cookie,即便是加密的Cookie,也会随着每个请求一起提交
- 仅接收POST请求
不仅仅是GET请求可以被伪造,POST依然可以被伪造,只需要在页面创建一个隐藏的表单即可构造POST请求
- 多步交易
多步交易不足以防御CSRF,只要攻击者可以完整预测整个事务的每个步骤,就可以实现CSRF
- URL重写
这可能被视为一种有用的CSRF防御技术,因为攻击者无法猜测受害者会话的ID。但是用户的会话ID通常在URL中公开,所以仍然可以被攻击者获取
- HTTPS
HTTPS本身无法防御CSRF,但是应该作为任何防御的先决条件
有效防御
- 验证请求头中的Referer
请求头中的Referer字段是请求发送者的源地址,通过验证源地址可以有效防御CSRF
- 添加Token认证
在请求中添加用户不能伪造的的信息
- 二次验证
在关键操作之前要求用户二次认证密码或验证码,有效防御CSRF
- 用户养成良好的上网习惯
不要随意点击链接或图片;及时退出长时间不使用的已登陆账户;安装合适的防护软件
SSRF服务端请求伪造
- 服务端请求伪造(Server-Side Request Forgery)来自于服务端
出现漏洞的代码
- 传递其他网络资源地址作为请求参数
- 服务器会通过curl向url发送请求
- 将请求得到的数据以文件的形式存储在当前目录下
- 将请求得到的数据回显在页面中
1 |
|
漏洞利用
访问其他url
- 让服务器访问其他url
<url>
:网络资源地址
1 | http://example.com/index.php?url=http://<url> |
内网Web应用指纹识别
- 如果访问的url是内网的IP地址,可以通过访问内网的其他Web应用识别应用指纹
<ip>
:服务器所在内网的其他IP地址<webapp>
:其他web应用的访问路径
1 | http://example.com/index.php?url=http://<ip>/<webapp> |
进行端口扫描
利用字典协议,进行端口扫描,可以扫描服务器所在的内网信息
当端口开放的情况下,页面才会正常返回
<port>
:端口<ip>
:服务器所在内网的其他IP地址
1 | http://example.com/index.php?dict://127.0.0.1:<port> |
读取服务器文件
<src>
:服务器所在的本地资源路径
1 | http://example.com/index.php?file://<src> |
漏洞挖掘
- 从Web应用的功能上寻找
- 分享功能
- 转码功能
- 在线翻译
- 图片的加载与下载
- 收藏功能
- 未公开的API及其他调用URL的功能
- 从URL关键字中寻找
- share
- wap
- url
- link
- src
- source
- target
- u
- 3g
- display
- sourceURI
- imageURL
- domain
防御绕过
- 如果服务端做了字符串匹配
- 可以使用
http://example.com@real.com
格式进行绕过,实际访问的地址为real.com
- 可以将IP地址转换为其他进制
- 可以使用
防御
限制协议
仅允许http和https协议的请求
限制IP
避免应用被用来获取内网数据
- 限制端口
限制请求的端口为常用的端口
过滤返回信息
统一报错信息
避免用户可以根据报错判断服务器的端口状态,例如将所有不正常的页面都返回404