DVWA--XSS(stored)

XSS

0X01

一、简介

跨站脚本(cross site script)为了不与样式css混淆,因此简称为XSS。javascript

XSS是一种常常出如今web应用中的计算机安全漏洞,也是web中最主流的攻击方式。那么什么是XSS呢?php

XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。css

从而盗取用户资料、利用用户身份进行某种动做或者对访问者进行病毒侵害的一种攻击方式。html

XSS攻击的危害包括:前端

一、盗取各种用户账号,如机器登陆账号、用户网银账号、各种管理员账号java

二、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力mysql

三、盗窃企业重要的具备商业价值的资料web

四、非法转帐正则表达式

五、强制发送电子邮件sql

六、网站挂马

七、控制受害者机器向其它网站发起攻击

首先咱们先来了解一下什么叫XSS XSS原名CSS 因与htmlcss框架同名 因此后来更名为XSS

二、缘由解析

主要缘由:过于信任客户端提交的数据!

解决办法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理而后方可进行下一步的操做。

进一步分析细节:

  客户端提交的数据原本就是应用所须要的,可是恶意攻击者利用网站对客户端提交数据的信任,在数据中插入一些符号以及javascript代码,那么这些数据将会成为应用代码中的一部分了。那么攻击者就能够肆无忌惮地展开攻击啦。

  所以咱们绝不能够信任任何客户端提交的数据!!!

那么咱们今天讲的storedXSS是什么类型的呐?

又称为持久型跨站点脚本,它通常发生在XSS攻击向量(通常指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久性XSS攻击危害性更大,由于每当用户打开页面,查看内容时脚本将自动执行。谷歌的orkut曾经就遭受到XSS。

简单例子:

从名字就可了解到存储型XSS攻击就是将攻击代码存入数据库中,而后客户端打开时就执行这些攻击代码。例如留言板

留言板表单中的表单域:<input type=“text” name=“content” value=“这里是用户填写的数据”>

正常操做:

用户是提交相应留言信息;将数据存储到数据库;其余用户访问留言板,应用去数据并显示。

非正常操做:

攻击者在value填写<script>alert(‘foolish!’)</script>【或者html其余标签(破坏样式。。。)、一段攻击型代码】;

将数据存储到数据库中;

其余用户取出数据显示的时候,将会执行这些攻击性代码

0X02

LOW.xss

这里咱们先来查看一波源码

<?php 

if( isset( $_POST'btnSign' ] ) ) {
    // Get input
    $message trim$_POST'mtxMessage' ] );
    $name    trim$_POST'txtName' ] );

    // Sanitize message input
    $message stripslashes$message );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work."E_USER_ERROR)) ? "" ""));

    // Sanitize name input
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work."E_USER_ERROR)) ? "" ""));

    // Update database
    $query  "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res mysqli_connect_error()) ? $___mysqli_res false)) . '</pre>' );

    //mysql_close();
}

?>

相关函数的介绍http://www.w3school.com.cn

https://www.runoob.com/

trim函数移除字符串两侧的空白字符或其余预约义字符,预约义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外须要删除的字符。
mysqli_real_escape_string对字符串特殊符号(\x00,\n,\r,\,‘,“,\x1a)等进行转义。
stripslashes函数删除字符串中的反斜杠。\
htmlspecialchars把预约义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体:
<!DOCTYPE html>
<html>
<body>
This is some <b>bold</b> text.
</body>
</html>
以上代码的浏览器输出:

This is some <b>bold</b> text.
PDO::prepare — 准备要执行的SQL语句并返回一个 PDOStatement 对象(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 

好了 那咱们大概来说一下这些函数的做用

未对输入数据进行xss检测编码,直接写入到数据库中,存在存储型xss漏洞。

如下是测试代码

https://www.cnblogs.com/baocheng/p/4919691.html

 

这里前端元素对表单提交的name进行了过滤  咱们这里能够用burpsuite绕过

具体绕过方法

 

 

0X03爱之深刻了解Medium级别

OK 咱们来看看源码 多了些什么东西

 <?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = str_replace( '<script>', '', $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    //mysql_close();
}

?>

相关的函数介绍

教程来自 http://www.w3school.com.cn/

strip_tags()函数剥去字符串中的HTML、XML以及PHP的标签,但容许使用<b>标签
PHP addslashes() 函数

addslashes() 函数返回在预约义字符以前添加反斜杠的字符串。

 
 

预约义字符是:

 
 
  • 单引号(')
  • 双引号(")
  • 反斜杠(\)
  • NULL
<?php
$str = addslashes('Shanghai is the "biggest" city in China.');
echo($str);
?>

 

PHP htmlspecialchars() 函数  http://www.w3school.com.cn/php/func_string_htmlspecialchars.asp

这里由于message里面有htmlspecialchars函数  因此没法经过message函数进行XSS注入 只有从name处进行

注入 可是name只是简单过滤了 <script>字符串

构造语句

<<script>alert("XSS")</script>

 

 成功绕过

0X04爱之究极抚摸High

首先来看看源代码

 <?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    //mysql_close();
}

?>

 

能够看见这里用正则表达式过滤了<script>标签 可是却忽略了imgiframe等其它危险的标签,所以name参数依旧存在存储型XSS

展开咱们的攻击吧

 

 

 

成功绕过

0X05爱的总结

这里XSS固然只是只有绕过 方法 具体利用方法可没有这么简单啊呐

具体的利用方法下次写的详细点吧 😃

少就是多 慢就是快

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息