跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS。
XSS是一种经常出现在web应用中的计算机安全漏洞,也是web中最主流的攻击方式。那么什么是XSS呢?
XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。
从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
XSS攻击的危害包括:
1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
3、盗窃企业重要的具有商业价值的资料
4、非法转账
5、强制发送电子邮件
6、网站挂马
7、控制受害者机器向其它网站发起攻击
首先我们先来了解一下什么叫XSS XSS原名CSS 因与htmlcss框架同名 所以后来改名为XSS
主要原因:过于信任客户端提交的数据!
解决办法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。
进一步分析细节:
客户端提交的数据本来就是应用所需要的,但是恶意攻击者利用网站对客户端提交数据的信任,在数据中插入一些符号以及javascript代码,那么这些数据将会成为应用代码中的一部分了。那么攻击者就可以肆无忌惮地展开攻击啦。
因此我们绝不可以信任任何客户端提交的数据!!!
那么我们今天讲的storedXSS是什么类型的呐?
又称为持久型跨站点脚本,它一般发生在XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久性XSS攻击危害性更大,因为每当用户打开页面,查看内容时脚本将自动执行。谷歌的orkut曾经就遭受到XSS。
简单例子:
从名字就可了解到存储型XSS攻击就是将攻击代码存入数据库中,然后客户端打开时就执行这些攻击代码。例如留言板
留言板表单中的表单域:
正常操作:
用户是提交相应留言信息;将数据存储到数据库;其他用户访问留言板,应用去数据并显示。
非正常操作:
攻击者在value填写【或者html其他标签(破坏样式。。。)、一段攻击型代码】;
将数据存储到数据库中;
其他用户取出数据显示的时候,将会执行这些攻击性代码
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
trim函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符。
mysqli_real_escape_string对字符串特殊符号(\x00,\n,\r,\,‘,“,\x1a)等进行转义。
stripslashes函数删除字符串中的反斜杠。\
htmlspecialchars把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体:
This is some bold text.
PDO::prepare — 准备要执行的SQL语句并返回一个 PDOStatement 对象(PHP >= 5.1., PECL pdo >= 0.1.)
好了 那我们大概来讲一下这些函数的作用
未对输入数据进行xss检测编码,直接写入到数据库中,存在存储型xss漏洞。
以下是测试代码
https://www.cnblogs.com/baocheng/p/4919691.html
这里前端元素对表单提交的name进行了过滤 我们这里可以用burpsuite绕过
具体绕过方法
OK 我们来看看源码 多了些什么东西
', '', $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( '' . ((is\_object($GLOBALS\["\_\_\_mysqli\_ston"\])) ? mysqli\_error($GLOBALS\["\_\_\_mysqli\_ston"\]) : (($\_\_\_mysqli\_res = mysqli\_connect\_error()) ? $\_\_\_mysqli\_res : false)) . '' ); //mysql\_close(); } ?>
相关的函数介绍
教程来自 http://www.w3school.com.cn/
strip_tags()函数剥去字符串中的HTML、XML以及PHP的标签,但允许使用标签
PHP addslashes() 函数
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
PHP htmlspecialchars() 函数 http://www.w3school.com.cn/php/func_string_htmlspecialchars.asp
这里因为message里面有htmlspecialchars函数 所以无法通过message函数进行XSS注入 只有从name处进行
注入 但是name只是简单过滤了
成功绕过
0X04爱之究极抚摸High
首先来看看源代码
' . ((is\_object($GLOBALS\["\_\_\_mysqli\_ston"\])) ? mysqli\_error($GLOBALS\["\_\_\_mysqli\_ston"\]) : (($\_\_\_mysqli\_res = mysqli\_connect\_error()) ? $\_\_\_mysqli\_res : false)) . '' ); //mysql\_close(); } ?>可以看见这里用正则表达式过滤了