pikachu之CSRF
文章目录
一、神魔是CSRF?
Cross-site request forgery,跨站请求伪造,攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击也就完成了,所以CSRF攻击也被称为“one click”攻击。
二、地位
一般来说安全级别比较低,因为需要满足的条件比较多。
三、场景
小红在某购物网站上修改自己的个人信息,这时小黑为了让小红将个人信息修改为他自己的,于是小黑自己去购物网站上注册后修改个人信息并抓取数据包,将这个修改信息的请求(url)发送给小红,诱导小红去点击,小红此时正在登录此购物网站,当小红点击后就如同以自己的身份去向服务器提交了修改个人信息的请求,但此时请求中的参数内容是小黑的,所以小红无意中将自己的个人信息改成了小黑的。
攻击成功的条件:
–条件1:该购物网站没有对个人信息修改的请求进行防CSRF处理,导致该请求容易被伪造。
判断:我们判断一个网站是否存在CSRF漏洞,其实就是判断其对关键信息(比如密码等敏感信息)的操作(增删改)是否容易被伪造。
–条件2:用户必须在登录了后台的情况下,点击了小黑发送的“埋伏”链接。
(若用户不在登录状态,或没有点击恶意链接,则攻击不会成功)
四、比xss何如?
CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取了用户的权限(比如通过盗取cookie),然后实施破坏。
五、如何确认存在CSRF
1、对目标站点增删改的地方进行标记,并观察其逻辑,判断请求书否可以被伪造
----比如修改管理员账号时,并不需要验证旧密码或otp,导致请求容易被伪造;
----比如对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造;
2、确认凭证的有效期(会提高CSRF被利用概率)
----虽然退出或者关闭了浏览器,但cookie仍然有效,或者session并没有及时过期,导致CSRF攻击变简单。
六、靶场测试
1、CSRF(get)
修改信息 | 修改成功 |
---|---|
![]() |
![]() |
burpsuite抓包
发现修改个人信息是get请求,并且没有设置token随机数,所以直接构造恶意url(直接更改参数内容)
原来url | 构造url |
---|---|
http://192.168.31.212/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=18888888888&add=alianqiu&email=lili%40pikachu.com&submit=submit | http://192.168.31.212/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=19999999999&add=earth&email=xiaohei%40pikachu.com&submit=submit |
模拟用户点击恶意url
如图,信息直接被修改。
2、CSRF(post)
与上次一样,先登录再修改个人信息,用burpsuite抓包
尝试修改个人信息 | 修改成功 |
---|---|
![]() |
![]() |
用burpsuite抓包
利用思路:搭建一个站点,构造一个from表单文件,诱导用户点击链接访问该文件,完成post请求
---------------------构建post.html
构造恶意url,诱导用户访问该文件
http://192.168.31.212/pikachu/vul/csrf/csrfpost/post.html
模拟用户访问该url
信息已修改,攻击成功!
3、CSRF Token
与之前一样,先登录再修改个人信息,用burpsuite抓包
token的产生:
----------------------------------token_get_edit.php
服务器端生成的token值会直接输出到前端,以隐藏表单的方式储存,在提交表单时会一同提交给服务器,服务器会将提交的token值与自身存储的token值比较,若一致才会进行下一步操作。
token在前端存储的位置:
token值的生成--------------function.php
七、CSRF防范措施
-
增加token验证(常用的做法)
对关键操作增加token参数,token值必须随机,每次都不一样;
-
关于安全的会话管理(避免会话被利用)
1、不要在客户端保存敏感信息(比如身份认证信息);
2、测试直接关闭,退出时的会话过期机制;
3、设置会话过期机制,比如15分钟内无操作,则自动登录超时;
-
访问控制安全管理
1、敏感信息的修改时需要对身份进行二次认证,比如修改账号时,需要判断旧密码;
2、敏感信息的修改使用post,而不是get;
3、通过http头部中的referer来限制原页面。
-
增加验证码(用户体验差)
一般用于登录(防暴力破解),也可以用在其他重要信息操作的表单中(需要考虑可用性)