DVWA之XSS Stored–存储型XSS
1、测试工具:Firefox浏览器,FireBug工具
2、测试页面
3、Security = Low
(1)输入正常数据
(2)输入XSS Payload:<script>alert(“xss”);</script>
测试发现name属性值最大值为10,长度明显受到限制
没关系,在message中输入payload足够,最大长度50
返回结果,成功弹窗
查看评论,插入的代码不会显示
4、Security = Medium
(1)输入XSS Payload:<script>alert(“xss”);</script>
没有弹出对话框,结果如下:
发现<scritp>以及引号”已经被过滤转义
尝试了几种不同的payload变种,包括大小写混写和嵌套标签都失败了。
不得已,查看Medium源代码发现了问题 orz
代码将message中的内容经过htmlspecialchars()处理,基本上很难跨成功,发现对name属性没有进行此处理,只是简单的字符串转换str_replace(),只需要将name的输入长度限制去掉就可以输入payload了
(2)去掉name最大长度限制,使用FireBug审查元素,修改maxlength = “100”
然后在name栏中输入XSS Payload:<scRipt>alert(document.cookie);</scripT>
弹窗成功
输入的Payload不会在评论中显示
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漏洞出现的地方一般就是该处对输入字符处理不严格造成的,需要对每一处用户输入的内容都进行严格字符处理。