新⼿指南:DVWA全级别教程之CSRF
DVWA(Damn Vulnerable Web Application)是⼀个⽤来进⾏安全脆弱性鉴定的PHP/MySQL Web应⽤,旨在为安全专业⼈员测试⾃⼰的专业技能和⼯具提供合法的环境,帮助web开发者更好的理解web应⽤安全防范的过程。
DVWA共有⼗个模块,分别是Brute Force(暴⼒(破解))、Command Injection(命令⾏注⼊)、(跨站请求伪造)、File
Inclusion(⽂件包含)、File Upload(⽂件上传)、Insecure CAPTCHA (不安全的验证码)、SQL Injection(SQL注⼊)、SQL Injection(Blind)(SQL盲注)、XSS(Reflected)(反射型跨站脚本)、XSS(Stored)(存储型跨站脚本)。
需要注意的是,DVWA 1.9的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过⽐较四种级别的代码,接触到⼀些PHP代码审计的内容。
DVWA的搭建
CSRF(Cross-site request forgery)
CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利⽤受害者尚未失效的⾝份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页⾯,在受害⼈不知情的情况下以受害者的⾝份向(⾝份认证信息所对应的)服务器发送请求,从⽽完成⾮法操作(如转账、改密等)。CSRF与XSS最⼤的区别就在于,CSRF并没有盗取cookie⽽是直接利⽤。在2013年发布的新版OWASP Top 10中,CSRF排名第8。
下⾯对四种级别的代码进⾏分析。
Low
服务器端核⼼代码
可以看到,服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制(当然服务器对请求的发送者是做了⾝份验证的,是检查的cookie,只是这⾥的代码没有体现= =)。
漏洞利⽤
1、构造链接
A) 最基础的:
当受害者点击了这个链接,他的密码就会被改成password(这种攻击显得有些拙劣,链接⼀眼就能看出来是改密码的,⽽且受害者点了链
接之后看到这个页⾯就会知道⾃⼰的密码被篡改了)
需要注意的是,CSRF最关键的是利⽤受害者的cookie向服务器发送伪造请求,所以如果受害者之前⽤Chrome浏览器登录的这个系统,⽽⽤搜狗浏览器点击这个链接,攻击是不会触发的,因为搜狗浏览器并不能利⽤Chrome浏览器的cookie,所以会⾃动跳转到登录界⾯。<?php if ( isset ( $_GET[ 'Change' ] ) ) { // Get input $pass_new = $_GET[ 'password_new' ]; $pass_conf = $_GET[ 'password_conf' ]; // Do the passwords match? if ( $pass_new == $pass_conf ) { // They do! $pass_new = mysql_real_escape_string( $pass_new ); $pass_new = md5( $pass_new ); // Update the data
base $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; $result = mysql_query( $insert ) or die ( '<pre>' . mysql_error() . '</pre>' ); // Feedback for the user echo "<pre>Password Changed.</pre>"; } else { // Issue with passwords matching echo "<pre>Passwords did not match.</pre>"; } mysql_close(); } >
1
server error翻译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
有⼈会说,这个链接也太明显了吧,不会有⼈点的,没错,所以真正攻击场景下,我们需要对链接做⼀些处理。
B) 我们可以使⽤短链接来隐藏URL(点击短链接,会⾃动跳转到真实⽹站):
因为本地搭的环境,服务器域名是ip所以⽆法⽣成相应的短链接= =,实际攻击场景下只要⽬标服务器的域名不是ip,是可以⽣成相应短链接的。
需要提醒的是,虽然利⽤了短链接隐藏url,但受害者最终还是会看到密码修改成功的页⾯,所以这种攻击⽅法也并不⾼明。
C) 构造攻击页⾯
现实攻击场景下,这种⽅法需要事先在公⽹上传⼀个攻击页⾯,诱骗受害者去访问,真正能够在受害者不知情的情况下完成CSRF攻击。这⾥为了⽅便演⽰(才不是我租不起服务器= =),就在本地写⼀个test.html,下⾯是具体代码。
当受害者访问test.html时,会误认为是⾃⼰点击的是⼀个失效的url,但实际上已经遭受了CSRF攻击,密码已经被修改为了hack。Medium
服务器端核⼼代码<img src ="192.168.153.130/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
相关函数说明
int eregi(string pattern, string string)
检查string中是否含有pattern(不区分⼤⼩写),如果有返回True,反之False。
可以看到,Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表⽰来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名,这⾥是192.168.15
3.130),希望通过这种机制抵御CSRF攻击。
漏洞利⽤
过滤规则是http包头的Referer参数的值中必须包含主机名(这⾥是192.168.153.130)<?php if ( isset ( $_GET[ 'Change' ] ) ) { // Checks to see where the request came from if ( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) { // Get input $pass_new = $_GET[ 'password_new' ]; $pass_conf = $_GET[ 'password_conf' ]; // Do the passwords match? if ( $pass_new == $pass_conf ) { // They do! $pass_new = mysql_real_escape_string( $pass_new ); $pass_new = md5( $pass_new ); // Update the database $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; $result = mysql_query( $insert ) or die ( '<pre>' . mysql_error() . '</pre>' ); // Feedback for the user echo "<pre>Password Changed.</pre>"; } else { // Issue with passwords matching echo "<pre>Passwords did not match.</pre>"; } } else { // Didn't come from a trusted source echo "<pre>That request didn't look correct.</pre>"; } mysql_close(); } >
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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论