跨站脚本攻击(cross site Script)是攻击者利用网站程序对用户的输入过滤不足,输入内容可以显示在页面上从而对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或进行病毒侵害的一种攻击方式。为了与层叠样式表CSS进行区分,通常简写为XSS .
反射性:
反射性XSS攻击只是简单的将数据直接或未经完善的安全过滤就在浏览器中进行输出,导致输出的数据中存在可能被浏览器执行的代码。由于此种代码通常存在于URL中,所以攻击者往往需要通过诱骗受害者点击恶意连接,从而实施攻击。
存储型:
指web应用程序对用户输入数据过滤不严格,导致web应用程序将黑客的恶意跨站攻击脚本存入数据库或其他形式的文件中,当受害者进行查询时,会从中获取脚本内容并执行。从而导致存储型跨站脚本攻击。
DOM型:
DOM型XSS攻击指通过修改DOM节点数据信息而形成的XSS攻击。开展相关攻击需要针对JavaScript DOM代码进行分析,并根据实际情况进行利用。DOM型XSS攻击类似于反射型的XSS攻击,但是DOM型XSS攻击的区别在于javascript代码并不经过后端处理,而是在前端使用javascript代码处理后进行的输出。
XSS攻击的利用方式多种多样,包括窃取用户信息,XSS盗取Cookie,XSS 钓鱼攻击,XSS蠕虫攻击、插入黑链、点击劫持、键盘记录等。
XSS作为一种被动型的攻击,如何诱骗用户点击就是一个大的问题。往往涉及到URL、短链接变形以及嵌入其他页面进行点击劫持等。
常见攻击方式:
行间式
<div onclick="alert('yea...这样子可以执行JS哦')"></div>
<a href="javascript:alert('执行JS代码但不跳转');">点我</a>
<a href="javascript:void(0)" onclick="alert('点击执行JS代码');">再来点我啊</a>
<img src=1 onerror=alert("XSS");> #使用onerror事件在源地址加载错误时执行XSS代码
<input onfocue=alert("XSS");> #规定一个输入字段,在对象获得焦点时执行
<details ontuggle=alert("xss");> #一个提供用户开启和关闭功能的交互式可见或影藏补充内容的控件,ontoggle事件在用户打开元素时触发
<svg onload=alert("XSS");> #在HTML网页中嵌入SVG文件来引入JS代码
<select onfocus=alert("XSS");></select> # <select>标签用于创建下拉列表,获得焦点时触发JS代码
<iframe onload=alert("XSS");></iframe> #<iframe>标签会创建一个包含另外一个文档的内联框架
<video sourse=1 onerror=alert("XSS");>
.........
外链式
<script src="../test.js"></script>
<img src=http://xxx.xxx/com/xxx.js>
.....
嵌入式
<script>
alert('js hello world!');//弹窗
</script>
通过事件引入
常见的js事件:
onchange:当HTML元素已被改变时执行JS
onclick: 当用户点击了 HTML 元素时执行JS
onmouseover: 当用户把鼠标移动到 HTML 元素上时执行JS
onmouseout: 当用户把鼠标移开 HTML 元素时执行JS
onkeydown: 当用户按下键盘按键时执行JS
onload:当浏览器已经完成页面加载时执行JS
onerror: 当执行错误时加载JS代码
常见的测试工具:
eg: ![]()


首先先看一下代码:
没有找到和".htmlspecialchars($str)."相关的结果."."
";
?>
这里首先使用了GET方式获取了传入的keyword,然后在输出的两个地方,都使用了htmlspecialChars()函数对传入的结果进行HTML实体编码,然后使用了单引号来包裹value属性的值。
我们知道,htmlspecialChars()会对<,>,&,",',",@符号进行编码,所以我们需要考虑一种JS代码不带这些符号的使用方式。
仔细看代码我们知道,他在input的标签的的Value属性的位置输出了我们的输入内容,那么我们就可以考虑引入JS事件的方式来进行利用但是在JS代码中并不能存在上述的那些符号。这里有这样一个payload:
‘ οninput=alert(1) ’
当我们输入这个payload后,我们的输出内容就会变成这样:
由于我们输入的JS代码中没有特殊符号,所以不会被进行转义,而前后用于闭合的单引号被编码后输出,也同样会被前端解析成引号从而成功闭合value属性。不过这里还利用了一个特性,那就是我们的alert()函数的输出内容可以不需要引号包裹,所以能够被绕过。
实际测试:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pp2Qhfra-1658803199484)(img/
)]
还是先看代码:
没有找到和".htmlspecialchars($str)."相关的结果.".'
';
?>
可见,和Less-3的区别挺大.
区别一:使用了strtolower()函数将输入内容转换为小写。
区别二:对输入内容使用了str_replace()函数替换on和