PHP代码审计学习(7)——XSS漏洞

XSS介绍 

  跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Web脚本代码(htmljavascriptcss等),当用户浏览该页面时,嵌入其中的Web脚本代码会被执行,从而达到恶意攻击用户的特殊目的。

  攻击者利用漏洞,可以获取其他合法用户的Cookie身份信息、访问地址等通过获取到的Cookie信息,即可以被攻击者的身份访问Web应用,如获取到管理员的Cookie,就可以以管理员的身份访问应用系统。

挖掘思路

  XSS漏洞的关键在于寻找没有被过滤的参数,且这些参数传入到输出函数

  经常存在于富文本、图片引用、文字格式设置、论坛留言、用户信息等

XSS类型分类

  案例参照https://www.jianshu.com/p/4fcb4b411a66

反射型XSS

  又称非持久型XSS,之所以称为反射型XSS,则是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来的。而称为非持久型XSS,则是因为这种攻击方式具有一次性。攻击者通过电子邮件等方式将包含恶意代码的链接发送给受害者,当受害者点击该链接时,恶意代码被传输到目标服务器上,然后服务器将恶意代码“反射”到受害者的浏览器上,从而在该浏览器上执行了恶意攻击脚本。目前大多数浏览器都具有反射型XSS保护功能,所以相对来说反射型的危害相对较低。

  案例

<html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>XSS</title> 
</head> 
<body> 
<form action="" method="get"> 
<input type="text" name="input">     
<input type="submit"> 
</form> 
<br> 
<?php 
echo 'output:<br>'.$_GET['input'];
?> 
</body> 
</html> 

  上述案例是当将以GET方式提交的字符串输出,因为没有任何过滤所以当提交JS代码时候会触发提交的语句

 

  这个弹窗并没有什么实际的意义,但通过它我们知道输入javascript代码是可以被执行的,当我们输入一些其他函数,比如document.cookie就可以成功盗取用户的cookie信息,或者读取用户浏览器信息等,为我们进一步深入攻击做铺垫。

储存型XSS

  又称持久型XSS,它和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库或文件中。这种攻击多见于论坛、SNS社交网站、微博等系统,攻击者在发帖、发表文章、发微博的过程中,将恶意脚本连同正常信息一起注入到内容之中,发送到网站服务器储存下来,恶意脚本也永久地被存放在论坛服务器的后端储存器中,当其他用户浏览这个被注入了恶意脚本的内容时,恶意脚本则会在他们的浏览器中得到执行,从而实现攻击目的。

   案例

    <span style="font-size:18px;"><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>  
    <html>  
    <head>  
    <title>XssStorage</title>  
    </head>  
    <body>  
    <h2>Message Board<h2>  
    <br>
    <form action="xss1" method="post">  
    Message:<textarea id='Mid' name="desc"></textarea>  
    <br>  
    <br>  
    Subuser:<input type="text" name="user"/><br> 
    <br>
    <input type="submit" value="submit" onclick='loction="XssStorage.php"'/>  
    </form>  
    <?php  
    if(isset($_POST['user'])&&isset($_POST['desc'])){  
    $log=fopen("sqlStorage.txt","a");  
    fwrite($log,htmlspecialchars($_POST['user'])."
"); # 在此对用户输入数据$_POST['user']进行过滤
    fwrite($log,$_POST['desc']."
"); 
    fclose($log);  
    }  
      
    if(file_exists("sqlStorage.txt"))  
    {  
    $read= fopen("sqlStorage.txt",'r');  
    while(!feof($read))  
    {  
        echo fgets($read)."</br>";  
    }  
    fclose($read);  
    }  
    ?>  
    </body>  
    </html></span>  

  当输入字符串时候,先将输入的数据保存在一个地方,可以是文件也可以是数据库,这里是保存在sqlStorage.txt,然后再返回到页面

   我们这边发现只有XSS2弹出,因为htmlspecialchars()函数对用户输入的<>做了转义处理。

   再看一下文件

   可以看到这些都是刚刚输入的保存在文本里的字符,可以明显发现<>被转义了

DOM型XSS

  基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞

  特征:整个过程都是在前端完成的,没有后端的参与(纯前端的操作!)

  案例参考:https://www.cnblogs.com/wangtanzhi/p/12239918.html

 <?php
$xss = $_GET['xss'];
?>
<input type="text" id="text" value="<?php echo $xss;?>">
<div id="print"></div>
<script type="text/javascript">
    var text = document.getElementById("text");
    var print = document.getElementById("print");
    print.innerHTML = text.value;

</script>
  playload: ?xss=<img src=x onerror=alert(/xss/)>

杂言

  XSS其实原理很简单,就是闭合标签,不过正因为这个,所以有很多骚姿势,后续还会出XSS系列的闯关游戏,最近被考试和实习问题缠的没时间,系统学习代码审计进度慢下来了,还要去看一下以前一些零碎的东西,害

原文地址:https://www.cnblogs.com/Lee-404/p/13198932.html