::: block-1
用户须知
1.免责声明:本教程作者及相关参与人员对于任何直接或间接使用本教程内容而导致的任何形式的损失或损害,包括但不限于数据丢失、系统损坏、个人隐私泄露或经济损失等,不承担任何责任。所有使用本教程内容的个人或组织应自行承担全部风险。
2.合法性强调:教程中提供的所有信息、技巧、代码示例、工具推荐及操作指南等内容,均须在法律允许的范围内使用。用户应确保其行为遵守所在国家或地区的法律法规,并承担一切因使用、滥用或误用本教程内容而引起的法律责任和后果。
3.目的说明:本个人教程(以下简称“教程”)旨在提供网络安全基础知识与实践技巧,仅供教育和学术研究之用。本教程的编写目的在于提高公众对网络安全重要性的认识,并促进网络环境的健康发展。
4.安全与合法性责任:用户在应用本教程提供的知识和技能时,必须严格遵循道德规范和法律要求。禁止利用本教程内容从事任何非法活动,包括但不限于未授权访问、侵入他人网络系统、窃取隐私数据等行为。
5.内容更新与准确性:本教程内容基于当前网络安全领域的知识和技术标准,作者将尽力保证内容的准确性和时效性,但不对教程内容的更新频率、时效性或未来变化承担任何责任。用户应意识到网络安全技术和法律法规不断发展变化,应当持续关注并适时更新相关知识和技能。
6.第三方链接:本教程可能包含指向第三方网站或资源的链接。这些链接仅为提供便利而设,不代表本教程作者对这些第三方网站的内容、产品或服务的认可。用户访问任何第三方网站和资源将自行承担风险。
:::
CSRF漏洞
CSRF漏洞介绍
csrf漏洞
定义:跨站请求伪造
情景:是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。
原理复现
打开dvwa
<,>
在浏览器输入
http://192.168.1.11/dvwa
<,,,>
可见密码修改成功,账号成功登录
漏洞利用条件
所需要满足以下条件
需要满足以下条件 |
---|
客户登录受信任网站 A,并在本地生成 Cookie。 |
在不登出 A 的情况下,访问危险网站 B。 |
需要伪造请求数据包 |
无过滤防护 |
情景模拟
hacker
想改用户C的dvwa
网站上的密码,hacker
自己也登陆了dvwa
,然后点击修改密码,将修改密码的包用bp抓到,伪造用户C的网页修改密码请求,然后将恶意代码放在自己服务器生成网站B,然后将恶意链接诱导C用户点击,最后执行成功
在制作网站B时,已经拿到了用户修改密码的信息,包括身份验证信息
漏洞利用
low级别
- 用户C 修改密码
<,>
hacker
也登录dvwa
修改自己的密码
<,>
- 将用户C和
hacker
的包进行对比
hacker
将自己的包伪造成用户c的包
- 制作恶意代码
<,>
点击包扩自动提交脚本之后,一定要点击再生成
- 制造恶意网站
服务器操作
sudo su
cd /var/www/html
ls
touch 1.txt
vim 1.txt
mv 1.txt 1.html
cat 1.html
此处hacker
想要将用户c的密码改成hacker
,原来用户密码是123456
- 变成恶意链接让用户c点击
http://43.139.71.196/1.html
- 用户没点击之前密码
可见没点击恶意网站之前密码是1234565
- 用户点击恶意链接后
<,,>
可见密码已经被hacker改成了hacker
medium级别
有防护策略,检测referer头
- 正常客户修改密码情况
- 点击恶意地址后
<,>
- 源码分析
stripos()
函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
分析,这是部分匹配
解决思路
将referer
的数据和host
一致即可
- 错误操作
想法想建立个双层文件夹
服务器端
cd /var/www/html
mkdir 192.168.1.11
mv 1.html 192.168.1.11
生成恶意链接
http://43.139.71.196/192.168.1.11/1.html
<,,,,,,,,>
看到了吧,失败了,给你展示一下错误的原理
- 正确操作方法
你可以配合文件上传漏洞,然后把1.html上传到部署dvwa网站的服务器上
生成恶意链接
http://192.168.1.11/dvwa/hackable/uploads/1.html
<,,,,,,,>
可见,密码已经被hacker
改成了hacker666
温馨提示,改成短连接可以更好的伪装,不过要在公网下,本实验是在内网
high级别漏洞
- 源码分析
<,>
这段代码是一个PHP脚本,主要用于处理用户更改密码的请求。具体来说:
$change = false;:初始化一个变量$change,用于标记密码是否已更改。
$request_type = "html"; 和 $return_message = "Request Failed";:初始化请求类型和返回消息。
通过检查请求方法和内容类型,以及请求中的参数,来确定用户是通过POST方法提交JSON数据还是通过GET方法提交参数。
如果密码更改成功,会检查反跨站请求伪造(Anti-CSRF)令牌,验证密码匹配性,对密码进行加密处理,并更新数据库中的密码。
最后根据请求类型返回相应的消息,如果是JSON请求,则返回JSON格式的消息,否则返回HTML格式的消息。
最后生成反跨站请求伪造(Anti-CSRF)令牌。
总体来说,这段代码实现了用户更改密码的功能,并包含了安全性检查和数据库操作等功能。
- 操作抓包分析
<,>
两次客户端修改密码的结果
:::: column
::: column-left
客户第一次修改密码
:::
::: column-right
客户第二次修改密码
:::
::::
很明显两次不一样
通过分析可得知,增加token进行令牌验证,难度很大