xss简介及原理复现

0x00 前言

这是爷的第一篇博客,所以或许先来讲讲血泪史(其实也没什么)本来搭建博客是件轻松愉快的事,选主题调颜色也很有意思,在我全部整好以后。今天我不知道把配置文件的哪个地方碰到并且还鬼使神差地git上去了,结果就404了并且项目还变空了,于是我排了半天雷也没找到有效的解决方案…所以只好花了一个中午把它重新整回来了。所以一定要记得备份!千万别手贱动不动就hexo d.先在本地运行之后再上传。好了废话讲完了。
我的第一篇博客就用来讲讲蛮有意思并且富有生命力(?)的xss吧。

0x01 xss简介

xss是攻击者往Web页面插入恶意的script代码,在这之后,嵌入在Web页面的代码将会被执行,从而达到攻击者期望的某种目的。

0x02 分类

  • xss攻击一般被分为两类:

非持久型XSS,
持久型XSS。

非持久型xss:非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。

持久型xss攻击:持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。

  • 根据攻击来源,xss攻击还可以分为三类:

反射型
存储型
Dom型

1.反射型

  • 攻击步骤:攻击者构造出特殊的URL,其中包含恶意代码。当用户打开带有恶意代码的URL时,网站服务端将恶意代码从URL中取出,拼接在HTML中返回浏览器,之后用户浏览器收到响应后解析执行混入其中的恶意代码,恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户行为,调用目标网站接口执行攻击者指定的操作。
  • 常见于通过 URL 传递参数的功能,如网站搜索、跳转等。由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。

2.存储型

  • 攻击步骤:攻击者将恶意代码提交到目标网站的数据库中,用户打开网站时,网站服务端将恶意代码从数据库中取出,拼接在HTML中返回浏览器,之后用户浏览器收到响应后解析执行混入其中的恶意代码,恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户行为,调用目标网站接口执行攻击者指定的操作。
  • 常见于带有用户保存数据的网站功能,比如论坛发帖、商品评价、用户私信等等。
  • 存储型 XSS 跟反射型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。

3.Dom型

  • 攻击步骤:攻击者构造出特殊的URL,其中包含恶意代码,用户打开带有恶意代码的URL,用户浏览器打开带有恶意代码的URL,之后用户浏览器收到响应后解析执行,前端JS取出URL中的恶意代码并执行,恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户行为,调用目标网站接口执行攻击者指定的操作。
  • DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。

0x03 原理

1.反射型

代码:

<html>
<head>
<title>xss原理</title>
</head>
<body>
<form action='' method="get">
<input type="text" name="xss"/>
<input type="submit" value="test"/>
</form>
<?php
$xss=$_GET['xss'];
if($xss !==null){
echo $xss;
}
?>
</body>
</html>

emmm这里由于渲染器的问题不能同时识别php和html…而且php的代码高亮效果也很差 昨天整了半天也没整好 就先这样吧555我还有一大堆ddl 之后有时间再来整这个

部署好并访问后,我们向表单中输入js代码<script>alert('hello')</script>,点击test。

可以看出我们的代码被执行了,F12看看

我们的代码被写入了html中,解释为<script>标签。

反射型 XSS 的数据流向为:浏览器 -> 后端 -> 浏览器。

2.存储型

xss.php中的代码:

<html>
<head>
<title>xss重现</title>
<body>
<form action="" method="get">
<input type="text" name="id">
<input type="text" name="xss">
<input type="submit">
</form>
<?php
$id=$_GET['id'];
$xss=$_GET['xss'];
$con=mysqli_connect("127.0.0.1","root","password");
mysqli_select_db($con,'xss');
if($xss !== null){
$sql = "INSERT INTO XSS(id,xss)values('$id','$xss')";
$retval = mysqli_query($con,$sql);
echo $result;
}
?>
</body>
</head>
</html>

这里有一个坑,在连接数据库的时候如果直接用“localhost“报错会是mysqli_connect(): (HY000/2002): No such file or directory in xxx,因为使用了localhost并且mysqli.default_socket的值为空,而源码中提供的默认路径又不存在,如果先装php后装mysql,那么default_socket就会是个空值,所以可以将mysqli.default_socket的值改为正确的路径,或者把“localhost”改成“127.0.0.1”就可以了。

show.php中的代码:

<html>
<head>
<title>xss重现</title>
<body>
<?php
$con=mysqli_connect("127.0.0.1","root","password");
mysqli_select_db($con,'xss');
$sql = "select id,xss from xss";
$retval = mysqli_query($con,$sql);
while($row=mysqli_fetch_array($retval)){
echo $row['id'].":".$row['xss']."</br>";
}
?>
</body>
</head>
</html>

部署好之后,访问localhost/xss.php,填入一些内容。

这时访问数据库,可以看到内容被写进去了。(记得转义)

再访问show.php,就可以看到这串代码被执行了。F12:

存储型xss的数据流向为:浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器

3.Dom型

xss.php中的代码:

<html>
<head>
<title>xss重现</title>
<body>
<div id="print"></div>
<input type="text" id="text" value="text" value="" />
<input type="button" id="s" value="url" onclick="test()" />
<script>
function test(){
var str = document.getElementById("text").value;
document.getElementById("print").innerHTML = "<a href='"+str+"'>test</a>";
}
</script>
</body>
</head>
</html>

输入'><img src=# onerror="alert('XSS')"><'进行测试

后面的应用什么的之后再加8,我的第一篇文章结束了哈哈哈哈

Author: Neorah
Link: https://neorah.me/pentest/xss%E7%AE%80%E4%BB%8B%E5%8F%8A%E5%8E%9F%E7%90%86/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.