文章目录
- 0 概述
- 1 环境准备
- 2 反射型xss
- 2.1 概述
- 2.1 靶场-反射型xss(get)
- 3 存储型xss
- 3.1 概述
- 3.2 靶场-存储型xss
- 4 DOM型xss
- 4.1 概述
- 4.2 靶场-DOM型xss
- 5 问题总结
- 6.1 再次启动pikachu容器报错
- 结语
0 概述
学习路线,如如下图所示,
上图只是个参照,具体我们主要通过本地靶场初步认识xss及分类,通过xss平台进一步理解,然后我们会做一些在线xss靶场练习,最后做下总结。
1 环境准备
开始学习之前,准备下环境,服务器环境+本地靶场,具体列表如下:
软件 | 版本 | 说明 |
---|---|---|
kali linux | 6.3.0 | 渗透测试系统 |
phpstudy | X1.29 | 集成环境 |
docker | 20.10.25 | 容器 |
area39/pikachu | latest | pikachu本地漏洞靶场docker镜像 |
相关软件安装配置自行查询相关文档,或者参考最后的连接,界面如下图1-1所示:
下面我们将结合本地靶场讲解下xss
2 反射型xss
2.1 概述
反射型跨站脚本攻击(Reflected XSS)是一种常见的Web安全漏洞类型,它涉及将恶意脚本注入到URL参数或输入字段中,然后这些恶意脚本被服务器返回并在受害者的浏览器中执行。
攻击过程如下:
- 注入恶意脚本:攻击者构造一个恶意URL,其中包含注入的恶意脚本。通常,攻击者会将恶意脚本作为参数添加到URL中。
- 用户点击恶意链接:攻击者通过各种方式诱使用户点击包含恶意脚本的链接,例如通过社交工程、钓鱼邮件等。
- 服务器响应:受害者点击链接后,恶意的URL参数被发送到服务器。服务器接收到参数后,将恶意脚本包含在返回的响应中。
- 浏览器执行恶意脚本:受害者的浏览器接收到响应后,会解析并执行恶意脚本。这可能导致攻击者在受害者的上下文中执行任意代码,例如窃取用户的敏感信息、会话劫持等。
要防止反射型XSS攻击,可以采取以下措施:
- 输入验证和过滤:在服务器端对输入数据进行验证和过滤,确保输入数据不包含恶意脚本。验证数据是否符合预期的格式和范围。
- 输出编码:在将用户生成的内容呈现在网页上之前,确保对其进行适当的编码,以防止恶意脚本的执行。使用适合上下文的编码函数。
- 使用CSP:实施内容安全策略(CSP),限制允许在网页上运行的脚本源。这有助于减轻反射型XSS攻击的影响。
- 警惕点击不明链接:作为用户,要警惕点击不明链接,尤其是来自不信任来源的链接。
- 教育用户:教育用户识别和避免点击可疑链接,提高他们对网络安全的意识。
- 正则安全审计和渗透测试:定期审计代码,寻找潜在的反射型XSS漏洞。进行渗透测试,发现并解决可能被忽视的漏洞。
- 使用安全库和框架:使用已验证和被广泛接受的安全库和框架来处理用户输入和输出,以减少XSS风险。
通过综合采取这些措施,可以显著减少反射型XSS攻击的风险,从而保护Web应用程序和用户的安全。
2.1 靶场-反射型xss(get)
首先F12观察输入框,如下图2.1-1所示
-
有长度限制,这个好解决,直接修改长度
-
也可以在url参数位置直接输入
-
输入最简单的js弹窗函数alert(1)
<script>alert(1)</script>
效果如下图2.1-2所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I3diGOrE-1692025472178)(L:\BaiduSyncdisk\study\security\web\xss\images\2023-08-03_230158-pikachu-reflect-get-effect.png)]
我们看下相应xss_reflected_get.php源代码:
<?php
<!-- 省略 -->
$html='';
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p class='notice'>输入'kobe'试试-_-</p>";
}else{
if($_GET['message']=='kobe'){
$html.="<p class='notice'>愿你和{$_GET['message']}一样,永远年轻,永远热血沸腾!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
}else{
$html.="<p class='notice'>who is {$_GET['message']},i don't care!</p>";
}
}
}
?>
<div class="main-content">
<div class="main-content-inner">
<div class="breadcrumbs ace-save-state" id="breadcrumbs">
<ul class="breadcrumb">
<li>
<i class="ace-icon fa fa-home home-icon"></i>
<a href="xss.php">xss</a>
</li>
<li class="active">反射型xss(get)</li>
</ul><!-- /.breadcrumb -->
<a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
data-content="管tmd什么xss,首先你应该输入kobe看一下再说">
点一下提示~
</a>
</div>
<div class="page-content">
<div id="xssr_main">
<p class="xssr_title">Which NBA player do you like?</p>
<form method="get">
<input class="xssr_in" type="text" maxlength="20" name="message" />
<input class="xssr_submit" type="submit" name="submit" value="submit" />
</form>
<?php echo $html;?>
</div>
<!-- 省略 -->
?>
基本处理逻辑:
- message接收input输入框中内容
- 点击sumit提交给当前php处理
- 如果通过get方式提交的message为空,$html赋值字符串,在表单下方显示
- 如果不为空把message内容拼接在字符串内,显示在表单下方
后端php把输入框输入的内容不做任何处理,返回前端,浏览器解析返回值,如果为js代码会执行相应的逻辑。
3 存储型xss
3.1 概述
存储型跨站脚本攻击(Stored XSS)是一种常见的Web安全漏洞类型,与反射型XSS攻击相比,存储型XSS攻击将恶意脚本永久地存储在目标服务器上,然后在其他用户访问受影响页面时执行。
攻击过程如下:
- 注入恶意脚本:攻击者将恶意脚本注入到目标应用程序中,通常是通过输入字段、评论框、消息等用户可输入内容的地方。这些恶意脚本会被存储在应用程序的数据库或其他数据存储中。
- 存储恶意脚本:应用程序将恶意脚本永久地存储在服务器上。
- 用户访问受影响页面:其他用户访问受影响页面,例如查看评论、浏览消息等。
- 服务器返回恶意脚本:当用户请求受影响页面时,服务器将存储的恶意脚本包含在响应中。
- 浏览器执行恶意脚本:用户的浏览器接收到响应后,解析并执行恶意脚本。这可能导致攻击者在受害者的上下文中执行任意代码,从而可能窃取敏感信息、会话劫持等。
要防止存储型XSS攻击,可以采取以下措施:
- 输入验证和过滤:在服务器端对输入数据进行验证和过滤,确保输入数据不包含恶意脚本。验证数据是否符合预期的格式和范围。
- 输出编码:在将用户生成的内容呈现在网页上之前,确保对其进行适当的编码,以防止恶意脚本的执行。使用适合上下文的编码函数。
- 限制脚本执行:使用内容安全策略(CSP)来限制允许在网页上运行的脚本源,从而减轻存储型XSS攻击的影响。
- 输入限制和白名单:限制用户输入的内容,使用白名单来定义允许的HTML标签和属性,阻止不安全的内容进入数据库。
- 定期安全审计和渗透测试:定期审查应用程序代码,寻找潜在的存储型XSS漏洞。进行渗透测试,发现并解决可能被忽视的漏洞。
- 教育用户:教育用户识别和避免点击可疑链接,提高他们对网络安全的意识。
通过采取这些措施,可以降低存储型XSS攻击的风险,确保Web应用程序和用户的安全。
3.2 靶场-存储型xss
如下图3.2-1操作
步骤:
- 在留言板输入框中输入js代码,点击submit
- 相应的内容显示留言列表中,当我们点击留言,浏览器解析执行js代码
我们查看下xss_stored.php源代码:
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "xss_stored.php"){
$ACTIVE = array('','','','','','','','active open','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR.'header.php';
include_once $PIKA_ROOT_DIR."inc/config.inc.php";
include_once $PIKA_ROOT_DIR."inc/mysql.inc.php";
$link=connect();
$html='';
if(array_key_exists("message",$_POST) && $_POST['message']!=null){
$message=escape($link, $_POST['message']);
$query="insert into message(content,time) values('$message',now())";
$result=execute($link, $query);
if(mysqli_affected_rows($link)!=1){
$html.="<p>数据库出现异常,提交失败!</p>";
}
}
if(array_key_exists('id', $_GET) && is_numeric($_GET['id'])){
//彩蛋:虽然这是个存储型xss的页面,但这里有个delete的sql注入
$query="delete from message where id={$_GET['id']}";
$result=execute($link, $query);
if(mysqli_affected_rows($link)==1){
echo "<script type='text/javascript'>document.location.href='xss_stored.php'</script>";
}else{
$html.="<p id='op_notice'>删除失败,请重试并检查数据库是否还好!</p>";
}
}
?>
<div class="main-content">
<div class="main-content-inner">
<div class="breadcrumbs ace-save-state" id="breadcrumbs">
<ul class="breadcrumb">
<li>
<i class="ace-icon fa fa-home home-icon"></i>
<a href="xss.php">xss</a>
</li>
<li class="active">存储型xss</li>
</ul><!-- /.breadcrumb -->
<a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
data-content="无用提示:这个留言板的框框是可以拉长和拉宽的,还行不,大兄弟!">
点一下提示~
</a>
</div>
<div class="page-content">
<div id="xsss_main">
<p class="xsss_title">我是一个留言板:</p>
<form method="post">
<textarea class="xsss_in" name="message"></textarea><br />
<input class="xsss_submit" type="submit" name="submit" value="submit" />
</form>
<div id="show_message">
<br />
<br />
<p class="line">留言列表:</p>
<?php echo $html;
$query="select * from message";
$result=execute($link, $query);
while($data=mysqli_fetch_assoc($result)){
echo "<p class='con'>{$data['content']}</p><a href='xss_stored.php?id={$data['id']}'>删除</a>";
}
echo $html;
?>
</div>
</div>
</div><!-- /.page-content -->
</div>
</div><!-- /.main-content -->
<?php
include_once $PIKA_ROOT_DIR.'footer.php';
?>
源码解析:
- 输入框输入内容,点击submit
- php接收内容,存入数据库表message中
- php查询message表,把留言记录显示在输入框下方
看下数据库表message存储内容,如下图所示
4 DOM型xss
4.1 概述
DOM-based XSS(DOM XSS)是一种特殊类型的跨站脚本攻击,与存储型和反射型XSS略有不同。DOM XSS攻击是基于浏览器的,它利用网页的DOM(Document Object Model)结构中的漏洞来执行恶意脚本。
攻击过程如下:
- 构造恶意输入:攻击者通过在URL参数、输入字段或其他可控制的地方输入恶意数据。
- 网页加载和解析:受害者浏览器加载和解析带有恶意输入的网页。恶意输入可能会被浏览器解释为脚本。
- DOM修改:恶意输入触发了网页中的脚本,该脚本修改了网页的DOM结构。
- 恶意脚本执行:由于DOM结构的修改,恶意脚本被插入并执行在受害者的浏览器上下文中。
与传统的XSS攻击不同,DOM XSS攻击并不总是涉及将恶意脚本从服务器传递到浏览器。相反,攻击是在浏览器内部发生的,因为恶意脚本是通过修改DOM而不是服务器响应来触发的。这使得防御和检测变得更加复杂。
要防止DOM XSS攻击,可以采取以下措施:
- 输入验证和过滤:仍然需要在服务器端对输入数据进行验证和过滤,以防止恶意数据进入应用程序。
- 输出编码:确保在将用户输入显示在页面上之前对其进行适当的编码,以防止脚本注入。
- 避免直接操作DOM:避免通过字符串拼接等方式直接操作DOM,因为这可能会导致不当的脚本插入。
- 使用安全的API:使用安全的DOM操作API来动态修改网页内容,以避免不受控制的脚本插入。
- 安全库和框架:使用已验证和被广泛接受的安全库和框架来处理用户输入和输出,以减少XSS风险。
- 教育用户:教育用户识别和避免点击可疑链接,提高他们对网络安全的意识。
由于DOM XSS攻击的特殊性质,防御措施可能需要更多的专业知识和技术。对于开发人员来说,了解DOM操作的安全最佳实践以及相关的Web安全原则至关重要。
4.2 靶场-DOM型xss
直接查看源代码,如下所示:
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "xss_dom.php"){
$ACTIVE = array('','','','','','','','active open','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR.'header.php';
include_once $PIKA_ROOT_DIR."inc/config.inc.php";
include_once $PIKA_ROOT_DIR."inc/mysql.inc.php";
if(isset($_GET['text'])){
$haha = "这里是后台的处理逻辑";
}
?>
<div class="main-content">
<div class="main-content-inner">
<div class="breadcrumbs ace-save-state" id="breadcrumbs">
<ul class="breadcrumb">
<li>
<i class="ace-icon fa fa-home home-icon"></i>
<a href="xss.php">xss</a>
</li>
<li class="active">DOM型xss</li>
</ul><!-- /.breadcrumb -->
<a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
data-content="先到这里把什么是dom搞明白了在说http://www.w3school.com.cn/htmldom/">
点一下提示~
</a>
</div>
<div class="page-content">
<div id="xssd_main">
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
</script>
<!--<a href="" onclick=('xss')>-->
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />
<div id="dom"></div>
</div>
</div><!-- /.page-content -->
</div>
</div><!-- /.main-content -->
<?php
include_once $PIKA_ROOT_DIR.'footer.php';
?>
处理逻辑:
- 把我们输入的内容直接放在了a标签的href属性中
利用方式
- 闭合href属性或者a标签,后接js代码就可以
- 代码处理直接在前端操作DOM,由浏览器解析执行
5 问题总结
6.1 再次启动pikachu容器报错
报错提示如下
┌──(root💀kali)-[~]
└─# docker container start pikachu
Error response from daemon: driver failed programming external connectivity on endpoint pikachu (3b21e12093978ba2477a22cd872ee2074e50854990788188dd79636fc42734c0): (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.2 --dport 3306 -j ACCEPT: iptables: No chain/target/match by that name.
(exit status 1))
Error: failed to start containers: pikachu
- 参考stackoverflow 解决方法
- 第一步 Clear all chains
sudo iptables -t filter -F
sudo iptables -t filter -X
- 第二步,重启docker服务
systemctl restart docker
结语
❓QQ:806797785
⭐️文档笔记地址:https://gitee.com/gaogzhen/math
参考:
[1]2021Kali系列 – Kali安装与配置[CP/OL].
[2]Kali Linux安装及基本配置[CP/OL].
[3]phpstudy-linux面板(小皮面板)[CP/OL].
[4]安全漏洞靶场docker安装系列-pikachu[CP/OL].
[5]centos7安装docker并搭建DVWA靶场和Pikachu靶场[CP/OL].