DVWA之XSS Stored–存储型XSS

1、测试工具:Firefox浏览器,FireBug工具

2、测试页面

xs0

3、Security = Low

(1)输入正常数据

xs11

(2)输入XSS Payload:<script>alert(“xss”);</script>

测试发现name属性值最大值为10,长度明显受到限制

xs4

没关系,在message中输入payload足够,最大长度50

xs1

返回结果,成功弹窗

xs2

查看评论,插入的代码不会显示

xs3

4、Security = Medium

(1)输入XSS Payload:<script>alert(“xss”);</script>

xs5

没有弹出对话框,结果如下:

xs6

发现<scritp>以及引号”已经被过滤转义

尝试了几种不同的payload变种,包括大小写混写和嵌套标签都失败了。

不得已,查看Medium源代码发现了问题 orz

xs7

代码将message中的内容经过htmlspecialchars()处理,基本上很难跨成功,发现对name属性没有进行此处理,只是简单的字符串转换str_replace(),只需要将name的输入长度限制去掉就可以输入payload了

(2)去掉name最大长度限制,使用FireBug审查元素,修改maxlength = “100”

xs8

然后在name栏中输入XSS Payload:<scRipt>alert(document.cookie);</scripT>

xs12

弹窗成功

xs9

输入的Payload不会在评论中显示

xs10

5、源代码

Low Stored XSS Source

<?php 

if(isset($_POST['btnSign'])) 
{ 

   $message = trim($_POST['mtxMessage']); 
   $name    = trim($_POST['txtName']); 
    
   // Sanitize message input 
   $message = stripslashes($message); 
   $message = mysql_real_escape_string($message); 
    
   // Sanitize name input 
   $name = mysql_real_escape_string($name); 
   
   $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');"; 
    
   $result = mysql_query($query) or die('

<pre>' . mysql_error() . '</pre>

' ); 

} 

?>

Medium Stored XSS Source

<?php 

if(isset($_POST['btnSign'])) 
{ 

   $message = trim($_POST['mtxMessage']); 
   $name    = trim($_POST['txtName']); 
    
   // Sanitize message input 
   $message = trim(strip_tags(addslashes($message))); 
   $message = mysql_real_escape_string($message); 
   $message = htmlspecialchars($message); 
     
   // Sanitize name input 
   $name = str_replace('<script>', '', $name); 
   $name = mysql_real_escape_string($name); 
   
   $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');"; 
    
   $result = mysql_query($query) or die('

<pre>' . mysql_error() . '</pre>

' ); 

} 

?>

High Stored XSS Source

<?php 

if(isset($_POST['btnSign'])) 
{ 

   $message = trim($_POST['mtxMessage']); 
   $name    = trim($_POST['txtName']); 
    
   // Sanitize message input 
   $message = stripslashes($message); 
   $message = mysql_real_escape_string($message); 
   $message = htmlspecialchars($message); 
    
   // Sanitize name input 
   $name = stripslashes($name); 
   $name = mysql_real_escape_string($name);  
   $name = htmlspecialchars($name); 
   
   $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');"; 
    
   $result = mysql_query($query) or die('

<pre>' . mysql_error() . '</pre>

' ); 

} 

?>

6、代码分析

Low级别代码对message内容进行初步处理,删除反斜杠以及转义一部分字符,但是对于<>没有处理,可以造成XSS

Medium级别代码对message进行了字符处理,最重要的是采用htmlspecialchars()处理,基本很难XSS,但是对name属性只做了一个简单的字符串替换,将<script>替换成空,很容易用如大小写、嵌套等方法绕过

High级别代码将message和name值都进行了htmlspecialchars()处理,很难实现XSS了

综上,XSS漏洞出现的地方一般就是该处对输入字符处理不严格造成的,需要对每一处用户输入的内容都进行严格字符处理。

您可能还喜欢...