DOM-based xss

本文详细解释了DOM-basedXSS漏洞的产生原理、攻击过程以及防范技术,包括输入验证、数据类型验证、关键过滤在服务端进行、输出数据检查等措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个漏洞往往存在于客户端脚本,如果一个Javascript脚本访问需要参数的URL,且需要将该信息用于写入自己的页面,且信息未被编码,那么就有可能存在这个漏洞。

(一)DOM—based XSS漏洞的产生
DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。

(二)DOM—based XSS攻击原理
DOM—based XSS攻击源于DOM相关的属性和方法,被插入用于XSS攻击的脚本。一个典型的例子如下
所述。
H TTP请求http://www.DBXSSed.site/welcome.html?name=zhangsan使用以下的脚本打印出登录用户zhangsan的名字,即
<SCRIPT>
var pos=docmnent.URL.indexOf(”name=”)+5;
document.write (document.URL.substring(pos,document.URL.1ength));
< /SCRIPT>
如果这个脚本用于请求http://www.DBXSSed.site/wPJconle.html?name=<script>alert(‘‘XSS”)</script>时,就
导致XSS攻击的发生。
当用户点击这个链接,服务器返回包含上面脚本的HTML静态文本,用户浏览器把HTML文本解析成DOM,DOM中的document对象URL属性的值就是当前页而的URL。在脚本被解析时,这个URL属性值的一部分被写入HTML文本,而这部分HTML文本却是JavaScript脚本,这使得<script>alert(“XSS”)</script>成为页面最终显示的HTML文本,从而导致DOM—base XSS攻击发生。
DOM—based XSS攻击过程如图l所示。注意(5)黑客提供的URL被页面的JAVASCRIPT使用,生成攻击载荷。

 

下面是一篇比较易懂的文章,觉得不错,读后对dom xss有比较清晰的认识:

用户可以从一个表单页提交数据,数据提交到服务期端后进行html编码后保存到数据库,然后
有个修改这个提交信息的页面,会把信息从数据库里查询出来,填充到INPUT控件的VALUE属性
里,来达到一个展示现有数据的效果。这里的数据在输出到value之前经过html编码的,所以输
出到value里没有跨站的问题,但是这里程序为了实现一个其他功能,加了段js脚本,脚本取得
前面提到的INPUT控件的VALUE,进行了一系列的动作和条件判断后,符合条件的话就把这个VALUE
值放到一个DIV的INNERHTML里,这一放就放出了一个跨站问题来。可能你比较奇怪,不是VALUE
里的值被HTML编码过了么,为什么这里还有问题呢,其实如果源代码是VALUE="&lt;a&gt;",虽
然经过HTML编码,但是用脚本通过DOM的方式来取得VALUE的值的时候,又会被解码。如果看我语
言描述不太明白的话,下面例子的php语法简单演示:

<?php
// 从数据库取得name
$name = htmlentities(get_name_from_db());
?>
name:
<input id="tb1" type="text" value="<?php echo $name;?>" />
<div id="pnl1"></div>

<script type="text/javascript">
<!–
var tb1 = document.getElementById("tb1");
var pnl1 = document.getElementById("pnl1");

if (…/*一些判断*/…) {
pnl1.innerHTML = tb1.value; // xss
}
//–>
</script>

假设我输入一个<button>,这个修改页面的源代码应该是这样,页面里就会冒出个没有字的按钮:

name:
<input id="tb1" type="text" value="&lt;button&gt;" />
<div id="pnl1"></div>

<script type="text/javascript">
<!–
var tb1 = document.getElementById("tb1");
var pnl1 = document.getElementById("pnl1");

if (…/*一些判断*/…) {
pnl1.innerHTML = tb1.value; // xss
}
//–>
</script>

于是你很容易就会想到写入这样一句:<script>alert(document.cookie);</script>,结果呢?并
没有一个熟悉的对话框弹出来,INNERHTML属性里写入<script>块是不会被执行的,所以呢我们要
用事件来执行我们的代码:

<img src="http://image2.sina.com.cn/home/images/sina_logo2.gif" width="0" height="0" border="0" onload="javascript:alert(document.cookie);">

写完了回头想想,这个例子被我添油加醋后显得不那么合常理了,不过不影响我要表达的意思,所
以合理性大家就不要追究了。

-------------------------------------------------------------------------------------------

luoluo有写过一篇老文章,讲htmldecode dom时的xss,可以参考下,到此dom xss就很容易理解了~

如下:

这个函数是不安全的,如果参数带有用户输入,就可能导致执行JS代码:

function HTMLDecode(strEncodeHTML)
{
var div = document.createElement('div');
div.innerHTML = strEncodeHTML;
return div.innerText;
}

HTMLDecode("<img src=1 onerror=alert(1) />");

有人很傻很天真的以为,这个没有被appendChild到dom树的元素,应该不会执行。

 

例如,假设应用程序返回的错误页面包含以下脚本:

 


这段脚本解析 URL,提取出message参数的值,并把这个值写入页面的HTML源代码中。如果按开发者预想的方式调用,它可以和前面的示例中一样,用于创建错误消息。但是,如果攻击者设计出一个 URL,并以JavaScript代码作为message参数,那么这段代码将被动态写入页面中,并像服务器返回代码一样得以执行。在这个示例中,前面示例中利用反射型XSS漏洞的相同URL也可用于生成一个对话框:https://wahh-app.com/error.php?message=<script>alert('xss');</script>

 

(三)XSS解决方案

常用的防止XSS技术包括:

(1)与SQL注入防护的建议一样,假定所有输入都是可疑的,必须对所有输入中的script、iframe等字样进行严格的检查。这里的输入不仅仅是用户可以直接交互的输入接口,也包括HTTP请求中的Cookie中的变量,HTTP请求头部中的变量等。

(2)不仅要验证数据的类型,还要验证其格式、长度、范围和内容。

(3)不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。

(4)对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出,即使在输入做了编码等操作,在各处的输出点时也要进行安全检查。

(5)在发布应用程序之前测试所有已知的威胁。

转载于:https://www.cnblogs.com/milantgh/p/3603604.html

帮我以下的过程具体到每一步做什么:DVWA(Damn Vulnerable Web Application)是一款专门用于安全测试的漏洞百出的 Web 应用程序,借助它能直观地演示跨站脚本攻击(XSS)及其防范措施。以下结合 DVWA 的不同模块来演示第五点中的内容: 演示反射型 XSS 攻击 攻击步骤:打开 DVWA 并登录,将安全等级设置为 “low” 。找到 “Reflected XSS (GET)” 模块,在输入框中输入恶意脚本,比如<script>alert('反射型XSS')</script>,然后点击 “Submit” 按钮。页面会弹出包含 “反射型 XSS” 的警告框,这是因为服务器直接把输入内容反射回页面,未对输入进行过滤,浏览器误将恶意脚本当作正常内容执行。 防范演示:把 DVWA 安全等级提升到 “high”。再次输入同样的恶意脚本并提交,此时页面不会弹出警告框。查看页面源代码,会发现输入的脚本被转义成了普通文本,这是因为高安全等级下,服务器对输入进行了过滤,把特殊字符转换为 HTML 实体,使脚本无法被浏览器执行。 演示存储型 XSS 攻击 攻击步骤:在 DVWA 中选择 “Stored XSS” 模块。在留言输入框输入恶意脚本,例如<script>alert('存储型XSS')</script>,并提交。当其他用户访问该留言页面时,页面会自动弹出包含 “存储型 XSS” 的警告框。这是由于恶意脚本被存储在服务器数据库中,每次页面加载时都会执行。 防范演示:切换到 “high” 安全等级,重新输入恶意脚本提交。刷新页面后,留言内容里的脚本被过滤掉,以纯文本形式显示。这表明高安全等级下,服务器在存储数据前对输入进行了严格过滤,阻止了恶意脚本的存储和执行。 演示 DOM - Based XSS 攻击 攻击步骤:进入 DVWA 的 “DOM - Based XSS” 模块。查看页面源代码,找到与 DOM 操作相关的 JavaScript 代码。在浏览器地址栏的 URL 后添加恶意脚本,如?default=English</script><script>alert('DOM - Based XSS')</script> 。页面加载后会弹出包含 “DOM - Based XSS” 的警告框,这是因为恶意脚本通过修改 URL 参数影响了 DOM 操作,被插入到页面中执行。 防范演示:修改 DVWA 配置文件,提升此模块的安全性。再次输入同样的恶意 URL,页面不会弹出警告框。这是因为改进后的代码对 URL 参数进行了严格验证和过滤,防止恶意脚本通过 DOM 操作被执行。
03-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值