XVWA CSRF、Cryptography、Unvalidated Redirects and Forwards

0x00 Cross Site Request Forgery (CSRF)

CSRF已经在owasp top10 2017当中被移除了,目前来看CSRF漏洞确实也是越来越少了。

直接看源码吧

 <?php
 $current_user = isset($_SESSION['user']) ? $_SESSION['user'] : '' ;
 $password = isset($_GET['passwd']) ? $_GET['passwd'] : '' ;
 $confirm = isset($_GET['confirm']) ? $_GET['confirm'] : '' ;
 include('../../config.php');
 if($current_user){
     if(isset($_GET['submit'])){
         if(empty($password) && empty($password)){
             echo "Passwords can not be blank !! Try Again ";
         }else if($password != $confirm){
             echo "Passwords don't match !! Try Again";
         }else{
             $stmt = $conn1->prepare("UPDATE users set password=:pass where username=:user");
             $stmt->bindParam(':pass', md5($password));
             $stmt->bindParam(':user', $current_user);
             $stmt->execute();
             if($stmt->rowCount() > 0){
                 echo "<b>Password Changed successfully<br></b>";
             }else{
                 echo "<b>Invalid user<br></b>";
             }
         }
     }
 }else{
     echo "<b> You are not logged in. </b>";
 }
 ?>

可以看到,先验证了登陆状态,如果没有登陆,是无法修改密码的,做了pdo也无法注入。但是在修改的密码的时候没有其他验证了,存在明显的CSRF

漏洞利用

直接伪造url诱骗其它用户点击,其他用户在登陆的情况下,点击链接就会触发CSRF

http://www.baynkc610.com/xvwa/vulnerabilities/csrf/?passwd=123&confirm=123&submit=submit

在另外一个浏览器中登陆xvwa用户。
在这里插入图片描述
当其它用户访问此链接时,密码就会变成123
在这里插入图片描述
退出再登陆时,用原来的xvwa密码进行登陆就会失败。

修复建议
  1. 防止跨站请求伪造,通常需要在每个HTTP请求中添加一个不可预测的令牌。这种令牌至少应该对每一个用户会话来说是唯一的。最好的方法是将独有的令牌包含在一个隐藏字段中。这将使得该令牌通过HTTP请求体发送,避免其包含在URL中从而被暴露出来。
  2. 该独有令牌同样可以包含在URL中或作为一个URL参数。但是这种方法的巨大风险在于:URL会暴露给攻击者,这样秘密令牌也会被泄漏。
  3. 要求用户重新认证或者判明他们是一个真实的用户(例如通过CAPTCHA )也可以防护CSRF攻击。

0x01 Cryptography

A developer should understand which cryptography should be suitable for each required modules in application, it can be encoding, encrypting or hashing. Insecure implementation of cryptography can leads to sensitive data leakage.

这个主要说的是不安全的加密设置可能会导致敏感数据泄露

直接看源码

<?php

$str = $_GET['item'];
if($str){

    echo "<table style=\"border-collapse:collapse; table-layout:fixed; width:700px;\">";
    echo "<tr><th width>Crypto Used</th><th>Value</th></tr>";
    # --- ENCODING ---
    echo "<tr><td style=\"word-wrap:break-word;\">Base64 Encode</td>";
    echo "<td style=\"word-wrap:break-word;\">". base64_encode($str)."</td></tr>";
    echo "<tr><td colspan=2>&nbsp;&nbsp;</td></tr>";

    # --- ENCRYPTION ---
    echo "<tr><td style=\"word-wrap:break-word;\">AES Encryption<br>"; 

    $key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");

    $key_size =  strlen($key);
    echo "Key Size : " . $key_size. "</td>";

    # create a random IV to use with CBC encoding
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

    # creates a cipher text compatible with AES (Rijndael block size = 128)
    $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
     $str, MCRYPT_MODE_CBC, $iv);

    # prepend the IV for it to be available for decryption
    $ciphertext = $iv . $ciphertext;

    # encode the resulting cipher text so it can be represented by a string
    $ciphertext_base64 = base64_encode($ciphertext);

    echo  "<td style=\"word-wrap:break-word;\">". $ciphertext_base64 . "</td></tr>";
    echo "<tr><td colspan=2>&nbsp;&nbsp;</td></tr>";

    # --- HASHING ---

    echo "<tr><td style=\"word-wrap:break-word;\">MD5 Hashing without salt</td>";
    echo "<td style=\"word-wrap:break-word;\">" . md5($str)."</td></tr>";
    echo "<tr><td colspan=2>&nbsp;&nbsp;</td></tr>";

    include_once('PasswordHash.php');
    echo "<tr><td style=\"word-wrap:break-word;\">PBKDF2 with sha256 and 1000 iteration <br> (salt : hash)</td>";
    echo "<td style=\"word-wrap:break-word;\">" . create_hash($str)."</td></tr>";
    echo "<tr><td colspan=2>&nbsp;&nbsp;</td></tr>";
}
?>

分别做了base64encryptohash。。
另外还有PasswordHash.php里面有自定义的hash算法。。。我就不看了,看着密码学有点怕。

漏洞利用

在这里插入图片描述
提交的数字为1,但是好像丢失了函数,导致后续无法继续下去,只显示了base64出来,解码一下。
在这里插入图片描述
确实是1。其余的就不折腾了,了解下就行。

不懂编码,加密和哈希的区别的还是得再去查一查的。

修复建议
  1. 预测一些威胁(比如内部攻击和外部用户),加密这些数据的存储以确保免受这些威胁。
  2. 对于没必要存放的、重要的敏感数据,应当尽快清除。
  3. 确保使用了合适的强大的标准算法和强大的密匙,并且密匙管理到位。可参考FIPS 140 validated cryptographic modules。
  4. 确保使用密码专用算法存储密码,如:bcrypt、PBKDF2或者scrypt。
  5. 禁用自动完成防止敏感数据收集,禁用包含敏感数据的缓存页面。

0x02 Unvalidated Redirects and Forwards

未验证的重定向和转发同样也从owasp top10 2017移除了,但是在挖src时这个还是比较常见的。

Web应用程序经常将用户重定向和转发到其他网页和网站,并且利用不可信的数据去判定目的页面。如果没有得到适当验证,攻击者可以重定向受害用户到钓鱼软件或恶意网站,或者使用转发去访问未授权的页面。

#home.php
 <strong>
 <a href="redirect.php?forward=https://www.owasp.org">Open Web Application Security Project</a> <br>
 <a href="redirect.php?forward=http://www.webappsec.org/">The Web Application Security Consortium (WASC)</a>
 </strong>
<?php

    if (isset($_GET['forward'])){
        $forward=$_GET['forward'];
        if (strlen($forward)>0){
            ob_start();
            ob_end_flush();
            header("Location: ".$forward);
        }
    }
?>

#redirect.php
<?php
   if (isset($_GET['forward'])){
           $forward=$_GET['forward'];
           if (strlen($forward)>0){
                   header("Location: ".$forward);
           }
   }
?>

homeredirect都可以直接进行跳转。
不过为啥home里面要加个ob_start()就有点没理解了。

漏洞利用

www.baynkc610.com/xvwa/vulnerabilities/redirect/redirect.php?forward=https://www.baidu.com

redirect此页面正常跳转,使用home时,就发现报错了。
在这里插入图片描述
提示在另外一个页面已经开启了缓存了,不折腾了,理解就OK了。

修复建议
  1. 避免使用重定向和转发。
  2. 如果使用了重定向和转发,则不要在计算目标时涉及到用户参数。这通常容易做到。
  3. 如果使用目标参数无法避免,应确保其所提供的值对于当前用户是有效的,并已经授权。建议把这种目标的参数做成一个映射值,而不是真的URL或其中的一部分,然后由服务器端代码将映射值转换成目标URL。

应用程序可以使用ESAPI重写sendRedirect()方法来确保所有重定向的目的地是安全的。避免这种漏洞是非常重要的,因为钓鱼软件为了获取用户信任,往往最喜欢攻击这种漏洞。

发布了265 篇原创文章 · 获赞 266 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u014029795/article/details/105366464