靶机系统:Win7
如果没有XSS漏洞,还能否盗用用户的身份(cookies)呢?
信安小白,一篇博文讲明白XSS攻击与防御
DVWA实验目标: 修改用户登录密码。
我们日常生活中,碰到修改密码时,需要填入原密码,才能再修改密码,或者填入密保问题再修改,还有的是使用手机验证码验证后才能修改。这些措施的目的是确认用户本人才能修改自己的密码,但如果是 攻击者想冒充他人,能否请求修改密码呢?会有漏洞出现吗?
跨站请求伪造(Cross-site request forgery),通常缩写为 CSRF 或者 XSRF, 盗用(伪造)了用户身份,以用户名义发送恶意请求,这种恶意请求被服务器当做正常请求执行。简单来说就是:攻击者盗用了你的身份,以你的名义发送恶意请求。
我们的目的是冒充用户修改密码,因此修改请求只能是用户(或者带着用户cookie)发出,从XSS漏已知,攻击者可以引诱用户点击恶意链接进入恶意网站,发送请求让攻击者获取用户身份,因此不用担心用户能否跨站发出修改请求。 跨站请求的核心是:构造请求url,因此我们必须要知道目标网站是如何修改密码的需要提供什么信息参数才能修改。
通过实验,我们发现在实验“CSRF”的页面中将管理员密码改为123,可以得到url:
http://192.168.3.37/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#
同时,我们还需要验证:是否能跨站使用此url的相关修改密码参数来进行修改,如果可以,那就是存在CSRF漏洞。但往往不可以,只有用户自己提交修改密码参数(带着用户的合法cookie),服务器才认可。因此综上所述,攻击者如何让用户自己提交参数呢?
在已经登录进入DVWA的状态下,新打开网页,这里的ip地址
是目标网站服务器的ip地址
:
<img src="http://192.168.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>
CSRF攻击满足的必要条件:
if( isset( $_GET[ 'Change' ] ) )
// Checks to see where the request came from
if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) )
函数说明:
int eregi(string pattern, string string)
检查string中是否含有pattern(不区分大小写),如果有返回True,反之False。Medium级别的代码检查了http包头的Referer参数的值(表示来源地址)HTTP Referer是header的一部分,当浏览器向web服务器发送请求时,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,如果是别的网站链接,就不能验证成功。
Burp抓包查看:
用户自己登录:
Host: 192.168.1.120
Referer: http://192.168.1.120/dvwa/vulnerabilities/csrf
访问攻击者网页跨站连接:
Host: 192.168.1.120
Referer: http://192.168.1.121/csrf.html
跨站请求的referer与用户自己的referer完全不一样,ip地址是关键字。但可以把文件名(例如:csrf.php)改成网站的ip地址,有了关键字就可以绕过了。
if( isset( $_GET[ 'Change' ] ) )
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token(令牌),向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。用户每次刷新会重新刷新token。
if( isset( $_GET[ 'Change' ] ) )
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
$pass_curr = $_GET[ 'password_current' ];
Impossible级别不仅检查token,还要求输入原密码。
是源于WEB的隐式身份验证机制
WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,CSRF攻击但却无法保证该请求是用户批准发送的
CSRF防御
实验目的:
1)编写钓鱼网页,修改用户名和密码。
2)提出防御方案。
# url是 目标网站服务器的ip地址+网页路径+新的密码参数+重复的密码
http://192.168.163.128/DVWA-1.9/vulnerabilities/csrf/?password_new=xxx&password_conf=xxx&Change=Change
<img src="http://192.168.163.128/DVWA-1.9/vulnerabilities/csrf/?password_new=xxx&password_conf=xxx&Change=Change#" border="0" style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>
防御方案: