学习路线,如如下图所示,
上图只是个参照,具体我们主要通过本地靶场初步认识xss及分类,通过xss平台进一步理解,然后我们会做一些在线xss靶场练习,最后做下总结。
开始学习之前,准备下环境,服务器环境+本地靶场,具体列表如下:
软件 | 版本 | 说明 |
---|---|---|
kali linux | 6.3.0 | 渗透测试系统 |
phpstudy | X1.29 | 集成环境 |
docker | 20.10.25 | 容器 |
area39/pikachu | latest | pikachu本地漏洞靶场docker镜像 |
相关软件安装配置自行查询相关文档,或者参考最后的连接,界面如下图1-1所示:
下面我们将结合本地靶场讲解下xss
反射型跨站脚本攻击(Reflected XSS)是一种常见的Web安全漏洞类型,它涉及将恶意脚本注入到URL参数或输入字段中,然后这些恶意脚本被服务器返回并在受害者的浏览器中执行。
攻击过程如下:
要防止反射型XSS攻击,可以采取以下措施:
通过综合采取这些措施,可以显著减少反射型XSS攻击的风险,从而保护Web应用程序和用户的安全。
首先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源代码:
<!-- 省略 -->
$html='';
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="输入'kobe'试试-_-
";
}else{
if($_GET['message']=='kobe'){
$html.="愿你和{$_GET['message']}一样,永远年轻,永远热血沸腾!
";
}else{
$html.="who is {$_GET['message']},i don't care!
";
}
}
}
?>
<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>
<!-- 省略 -->
?>
基本处理逻辑:
后端php把输入框输入的内容不做任何处理,返回前端,浏览器解析返回值,如果为js代码会执行相应的逻辑。
存储型跨站脚本攻击(Stored XSS)是一种常见的Web安全漏洞类型,与反射型XSS攻击相比,存储型XSS攻击将恶意脚本永久地存储在目标服务器上,然后在其他用户访问受影响页面时执行。
攻击过程如下:
要防止存储型XSS攻击,可以采取以下措施:
通过采取这些措施,可以降低存储型XSS攻击的风险,确保Web应用程序和用户的安全。
如下图3.2-1操作
步骤:
我们查看下xss_stored.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.="数据库出现异常,提交失败!
";
}
}
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 "";
}else{
$html.="删除失败,请重试并检查数据库是否还好!
";
}
}
?>
<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 "{$data['content']}
]}'>删除";
}
echo $html;
?>
</div>
</div>
</div><!-- /.page-content -->
</div>
</div><!-- /.main-content -->
<?php
include_once $PIKA_ROOT_DIR.'footer.php';
?>
源码解析:
看下数据库表message存储内容,如下图所示
DOM-based XSS(DOM XSS)是一种特殊类型的跨站脚本攻击,与存储型和反射型XSS略有不同。DOM XSS攻击是基于浏览器的,它利用网页的DOM(Document Object Model)结构中的漏洞来执行恶意脚本。
攻击过程如下:
与传统的XSS攻击不同,DOM XSS攻击并不总是涉及将恶意脚本从服务器传递到浏览器。相反,攻击是在浏览器内部发生的,因为恶意脚本是通过修改DOM而不是服务器响应来触发的。这使得防御和检测变得更加复杂。
要防止DOM XSS攻击,可以采取以下措施:
由于DOM XSS攻击的特殊性质,防御措施可能需要更多的专业知识和技术。对于开发人员来说,了解DOM操作的安全最佳实践以及相关的Web安全原则至关重要。
直接查看源代码,如下所示:
处理逻辑:
利用方式
报错提示如下
┌──(rootkali)-[~]
└─# 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
sudo iptables -t filter -F
sudo iptables -t filter -X
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].