浏览器执行js脚本

发布时间 2023-04-20 09:22:06作者: 挖洞404

1、四种基本的形式

(1)script内部

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

(2)script引入外部js文件

<script src='check.js'></script>
<script src=https://www.freebuf.com/freebuf/2.1.0.cd254c064b386bee9d41.js></script>
  • 需要注意如果当前页面是https,则只能引入https的js文件
  • 某些站点对跨域请求js做了禁止,报405,测试freebuf的脚本可以跨域请求
  • 大多数站点可能会包含baidu,jquery,google等站点的脚本,所以这些站点的脚本一般不能作为xss测试

(3)javascript伪协议

<a href="javascript:alert(123)">点击触发</a>
<iframe src="javascript:alert(123)"></iframe>加载触发
<form onsubmit="javascript:alert(123)"></form>
  • 事件都可以写作javascript伪协议的形式,但意义不大

(4)html事件

<button onclick=alert(123)>点击触发</button>
<img src=1 onerror=alert(123)>

2、两种jsonp形式

(1)script标签

<script src="https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction"></script>
  • script标签可以不指向js文件,而是指向一个接口,携带参数。其响应内容为脚本代码,和引入外部js是一致的
  • 一般,在前端写js函数,接口负责查询数据,然后以函数调用方式,将数据作为函数的参数

(2)jquery的getJSON函数

<script>
$.getJSON("https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=?", function(data) {
    
    var html = '<ul>';
    for(var i = 0; i < data.length; i++)
    {
        html += '<li>' + data[i] + '</li>';
    }
    html += '</ul>';
    
    $('#divCustomers').html(html); 
});
</script>
  • getJSON的第一个参数为jsonp接口地址
  • 第二个参数为回调函数,其具有一个参数,是jsonp返回函数调用的参数

3、基于js代码

3.1 document.write

(1)页面加载时触发

document.write("<script>alert('123')<\/script>")
document.write("<script src='test1.js'><\/script>")
  • 不论是直接写,还是引入外部js,都会正确执行

(2)页面加载后触发

<script>
function fun1(){
  document.write("<script src='test1.js'><\/script>")
}
</script>
<button onclick="fun1()">点击</button>
  • 正确引入外部js并执行

3.2 eval

<script>
function fun1(){
  eval("alert(55)")
}
</script>
<button onclick="fun1()">点击</button>
  • 点击之后正确执行

3.3 直接篡改script的src属性

该方法尝试并不可行,外部js并未下载,控制台也无报错

<script>
function fun1(){
// document.getElementsByTagName("script")[0].src = "test2.js"		document.getElementById("s1").setAttribute("src","test2.js")
}
</script>
<button onclick="fun1()">点击</button>

3.4 新建元素

<script>
function fun1(){

s = document.createElement("script")
s.setAttribute("src", "test2.js")
document.body.appendChild(s)
}
</script>
<button onclick="fun1()">点击</button>
  • 验证是可行的,成功执行

5、基于jquery