0x01 XSS介绍

XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型XSS。

DOM型的XSS由于其特殊性,常常被分为第三种,这是一种基于DOM树的XSS。例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也可能是反射型。

0x02 Low级别

代码如下:

<?php

header ("X-XSS-Protection: 0");//header函数向客户端发送原始的HTTP报头,这一句的作用是禁用XSS保护。

// 判断是否有输入。array_key_exists函数用于检查键名是否存在于数组中。
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// 将最终的信息反馈给用户
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
} ?>

简单的输入<script>alert(/xss/)</script>即可。

0x03 Medium级别

代码如下:

<?php

header ("X-XSS-Protection: 0");//禁用XSS保护

// 判断输入。
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// 获取输入。将<script>替换为空
$name = str_replace( '<script>', '', $_GET[ 'name' ] ); // 同low级别
echo "<pre>Hello ${name}</pre>";
} ?>

绕过方法:<sc<script>ript>alert(/xss/)</script>或者可以大小写绕过<Script>alert(/xss/)</script>,因为str_replace函数对大小写敏感。

0x04 High级别

代码如下:

<?php

header ("X-XSS-Protection: 0");

// 同以上两个级别
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// 获取输入。preg_replace函数用于执行一个正则表达式的搜索和替换。
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); // 同以上两个级别
echo "<pre>Hello ${name}</pre>";
} ?>

绕过方法:<img src='1' onerror=alert(/xss/)>不用script,可以用其他的代码。

0x05 Impossible级别

代码如下:

<?php

// 判断是否有输入
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// 检查token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // 获取输入。htmlspecialchars函数把预定义的字符转换为HTML实体。
$name = htmlspecialchars( $_GET[ 'name' ] ); // 给用户的反馈
echo "<pre>Hello ${name}</pre>";
} // 生成token
generateSessionToken(); ?>

0x06 总结

反射型XSS防御:
1.过滤用户输入
2.使用htmlspecialchar()过滤
3.使用owasp等安全xss处理API

最新文章

  1. 《从零开始做一个MEAN全栈项目》(1)
  2. codevs 2491 玉蟾宫
  3. CUBRID学习笔记 39 net使用dataset 返回查询的数据
  4. UDP HelloWord
  5. nopcommerce商城系统--源代码结构和架构
  6. [转载]Ubuntu 14.04设置固定ip
  7. log4j配置文件写法
  8. 【vc】1_Windows程序内部运行机制
  9. mysql 与 oracle 的时间查询
  10. jQuery懒加载插件 – jquery.lazyload.js简单调用
  11. Scrapy基础(五) ------css选择器基础
  12. Centos7系统下修改主机名操作笔记
  13. vue搭建环境并创建项目
  14. python中的__call__()函数
  15. kali linux2.0安装vega
  16. [UE4]通过代码改变材质
  17. selenium的基本定位方式总结
  18. G - Pandaland HDU - 6005 (找最小环)
  19. ngx_lua学习笔记 -- capture + proxy 实现httpclient
  20. C 指针改变变量值

热门文章

  1. 初识phar反序列化&amp;&amp;复现bytectf_2019_easycms&amp;&amp;RSS思路
  2. TensorFlow-keras 100分类
  3. tp5中“前置操作”和“钩子函数”的区别
  4. 监控CPU与GPU的工具
  5. 以命令行界面启动 Ubuntu
  6. 14.在Python中lambda函数是什么
  7. 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  8. CF思维联系–CodeForces - 225C. Barcode(二路动态规划)
  9. 数学--数论--随机算法--Pollard Rho 大数分解算法(纯模板带输出)
  10. 图论——Tarjan 初步 DFS序+时间戳+欧拉序