跨站脚本攻击(xss)
xss简介
????????跨站脚本攻击(Cross-Site Scripting)是一种常见的网络安全漏洞,可能有人觉得奇怪,xss的简写不应该属css吗。因为层叠样式脚本叫做CSS(Cascading Style Sheets) ,所以跨站脚本攻击就更名为XSS。
????????XSS是指恶意攻击者利用网站对用户提交的数据过滤不足的缺点,注入恶意脚本代码,然后在用户的浏览器中执行这些代码。这种攻击通常发生在基于Web的应用程序中,如社交媒体站点、在线银行、电子邮件服务等等。
html页面共有3种语言
1.HTML 网页框架结构
2.CSS 颜色字体等
3.JavaScript 操纵浏览器、网页内容
简单弹窗:
<script>alert(/xss/)</script>?? ??? ?警示框
<script>confirm(/xss/)</script>?? ??? ?确认框(类似于布尔)
<script>confirm('xss')</script>
??? ?
<script>prompt('xss')</script>?? ??? ?对话框,可以输入内容
漏洞的分类
xss分为:反射型xss,存储型xss,DOM型xss
反射型xss
非持久性,参数型的跨站脚本攻击,反射型的代码在web应用的参数中。攻击者将恶意脚本代码包含在URL中,然后诱使用户点击包含恶意代码的链接。当用户点击链接并访问特定的页面时,恶意脚本会在用户的浏览器上执行。例如搜索框(使用最多,但是容易被发现)
存储型xss
持久型跨站脚本攻击,攻击者将恶意脚本代码存储在目标网站的数据库中,然后其他用户在访问包含该恶意脚本的页面时,会触发脚本执行。这种类型的XSS攻击通常用于在网站上发布恶意评论、文章或消息等。(危害广)
DOM型xss
是一种xss攻击,这种类型的XSS攻击涉及到修改页面的DOM(文档对象模型),使得恶意脚本代码可以在客户端执行,但是参数不会提交到服务器攻击通常发生在浏览器解析URL参数或用户输入时,攻击者能够注入恶意代码并导致页面行为异常。(难以检测)
xss构造、变形、防御
xss构造
1.利用<>
<script>alert(/zhaokai/)</script>
2.JavaScript伪协议
a标签,img标签
<a href = javascript:alert(/zk/)> click me </a>
?
<img src ="javascript:alert(/xss/)"> (适用于ie6)
3.事件响应
<img src="图片地址" onmouseover = 'alert(/touch me!/)'> 鼠标放到图片上弹窗
?
<input type ='text' onkeydown = 'alert(/zk/)'> 输入框按键盘下键弹窗
<input type ='text' onkeyup = 'alert(/zk/)'> 输入框按键盘上键弹窗
1.windows事件(应用于body)
onafterprint | script | 文档打印之后运行的脚本。 |
---|---|---|
onbeforeprint | script | 文档打印之前运行的脚本。 |
onbeforeunload | script | 文档卸载之前运行的脚本。 |
onerror | script | 在错误发生时运行的脚本。 |
onhaschange | script | 当文档已改变时运行的脚本。 |
onload | script | 页面结束加载之后触发。 |
onmessage | script | 在消息被触发时运行的脚本。 |
onoffline | script | 当文档离线时运行的脚本。 |
ononline | script | 当文档上线时运行的脚本。 |
onpagehide | script | 当窗口隐藏时运行的脚本。 |
onpageshow | script | 当窗口成为可见时运行的脚本。 |
onpopstate | script | 当窗口历史记录改变时运行的脚本。 |
onredo | script | 当文档执行撤销(redo)时运行的脚本。 |
onresize | script | 当浏览器窗口被调整大小时触发。 |
onstorage | script | 在 Web Storage 区域更新后运行的脚本。 |
onundo | script | 在文档执行 undo 时运行的脚本。 |
onunload | script | 一旦页面已下载时触发(或者浏览器窗口已被关闭)。 |
2.form事件(表单触发事件)
onblur | script | 元素失去焦点时运行的脚本。 |
---|---|---|
onchange | script | 在元素值被改变时运行的脚本。 |
oncontextmenu | script | 当上下文菜单被触发时运行的脚本。 |
onfocus | script | 当元素获得焦点时运行的脚本。 |
onformchange | script | 在表单改变时运行的脚本。 |
onforminput | script | 当表单获得用户输入时运行的脚本。 |
oninput | script | 当元素获得用户输入时运行的脚本。 |
oninvalid | script | 当元素无效时运行的脚本。 |
onreset | script | 当表单中的重置按钮被点击时触发。HTML5 中不支持。 |
onselect | script | 在元素中文本被选中后触发。 |
onsubmit | script | 在提交表单时触发。 |
3.keyboard事件(键盘)
onkeydown | script | 在用户按下按键时触发。 |
---|---|---|
onkeypress | script | 在用户敲击按钮时触发。 |
onkeyup | script | 当用户释放按键时触发。 |
4.mouse事件 (鼠标)
onclick | script | 元素上发生鼠标点击时触发。 |
---|---|---|
ondblclick | script | 元素上发生鼠标双击时触发。 |
ondrag | script | 元素被拖动时运行的脚本。 |
ondragend | script | 在拖动操作末端运行的脚本。 |
ondragenter | script | 当元素元素已被拖动到有效拖放区域时运行的脚本。 |
ondragleave | script | 当元素离开有效拖放目标时运行的脚本。 |
ondragover | script | 当元素在有效拖放目标上正在被拖动时运行的脚本。 |
ondragstart | script | 在拖动操作开端运行的脚本。 |
ondrop | script | 当被拖元素正在被拖放时运行的脚本。 |
onmousedown | script | 当元素上按下鼠标按钮时触发。 |
onmousemove | script | 当鼠标指针移动到元素上时触发。 |
onmouseout | script | 当鼠标指针移出元素时触发。 |
onmouseover | script | 当鼠标指针移动到元素上时触发。 |
onmouseup | script | 当在元素上释放鼠标按钮时触发。 |
onmousewheel | script | 当鼠标滚轮正在被滚动时运行的脚本。 |
onscroll | script | 当元素滚动条被滚动时运行的脚本。 |
5.media事件(多媒体)
onabort | script | 在退出时运行的脚本。 |
---|---|---|
oncanplay | script | 当文件就绪可以开始播放时运行的脚本(缓冲已足够开始时)。 |
oncanplaythrough | script | 当媒介能够无需因缓冲而停止即可播放至结尾时运行的脚本。 |
ondurationchange | script | 当媒介长度改变时运行的脚本。 |
onemptied | script | 当发生故障并且文件突然不可用时运行的脚本(比如连接意外断开时)。 |
onended | script | 当媒介已到达结尾时运行的脚本(可发送类似“感谢观看”之类的消息)。 |
onerror | script | 当在文件加载期间发生错误时运行的脚本。 |
onloadeddata | script | 当媒介数据已加载时运行的脚本。 |
onloadedmetadata | script | 当元数据(比如分辨率和时长)被加载时运行的脚本。 |
onloadstart | script | 在文件开始加载且未实际加载任何数据前运行的脚本。 |
onpause | script | 当媒介被用户或程序暂停时运行的脚本。 |
onplay | script | 当媒介已就绪可以开始播放时运行的脚本。 |
onplaying | script | 当媒介已开始播放时运行的脚本。 |
onprogress | script | 当浏览器正在获取媒介数据时运行的脚本。 |
onratechange | script | 每当回放速率改变时运行的脚本(比如当用户切换到慢动作或快进模式)。 |
onreadystatechange | script | 每当就绪状态改变时运行的脚本(就绪状态监测媒介数据的状态)。 |
onseeked | script | 当 seeking 属性设置为 false(指示定位已结束)时运行的脚本。 |
onseeking | script | 当 seeking 属性设置为 true(指示定位是活动的)时运行的脚本。 |
onstalled | script | 在浏览器不论何种原因未能取回媒介数据时运行的脚本。 |
onsuspend | script | 在媒介数据完全加载之前不论何种原因终止取回媒介数据时运行的脚本。 |
ontimeupdate | script | 当播放位置改变时(比如当用户快进到媒介中一个不同的位置时)运行的脚本。 |
onvolumechange | script | 每当音量改变时(包括将音量设置为静音)时运行的脚本。 |
onwaiting | script | 当媒介已停止播放但打算继续播放时(比如当媒介暂停已缓冲更多数据)运行 |
xss变形
1.大小写转换
浏览器对HTML标签大小写不敏感
<sCriPt>alert(/zk/)</sCriPt>
2.关键字双写
绕过一次过滤
<scrscriptipt>alert(/zk/)</scrscriptipt>
3.伪协议转码
????HTML编码:就是将字母字符转换为ascii码,十进制编码:$#+十进制ascii码,十六进制编码:$#+十六进制ascii码
<a href = javascript:alert(/zk/)> click me </a>
javascript?? ??? ?可以将javascript转码绕过关键字过滤
4.插入其他字符
????????将一下字符插入到任意位置
字符 | 编码 |
---|---|
Tab | 	 |
换行 | 
 |
回车 | 
 |
<a href ='j	avasc r ipt:alert(/xss/)'>click me</a>
5.引号的使用
HTML语言大部分对于引号的使用要求不严格
<Img sRc= # OnErRoR= alert(/xss/);>
<Img sRc= '#' OnErRoR='alert(/xss/)'>
<Img sRc= "#" OnErRoR="alert(/xss/)">
6. / 代替空格
<Img/sRc='#'/OnErRoR-'alert(/xss/)'>
7.拆分跨站
将一段js代码拆分为多段
<script>z='alert'</script>
<script>z+='(/xss/)'</script>
<script>eval(z)</script>
<script>eval(alert(/xss/))</script>
xss防御
1.输入过滤
输入验证:对用户提交的信息进行“有效性”验证
? ? ? ? 仅接受指定长度
? ? ? ? 仅包含合法字符
? ? ? ? 仅接收指定范围
? ? ? ? 特殊格式:email,ip地址
? ? 数据消毒:过滤危险输入
<?php
$keywords = $_GET['keywords'];
$keywords = strtolower($keywords);
$keywords = str_replace ("on", "Skeywords);
$keywords = str_replace ("<script>", ", $keywords);
$keywords = str_replace ("<","",$keywords);
$keywords = str replace(">","",$keywords);
echo $keywords;
?>
2.输出编码
HEML编码是HTML实体编码
$keywords = htmlspecialchars( $_GET['keywords'] );
3.黑白名单策略
不管是输入还是输出编码,都是针对用户提交的信息进行黑白名单式的过滤
? ? ? ? 黑名单:非允许的内容
? ? ? ? 白名单:允许的内容
4.防御DOM型xss
避免客户端文档重写,重定向或者其他敏感操作
超级测试代码
? ? ? ? 可以用来测试过滤情况
<sCr<ScRiPt>IPT>OonN'"\/(hrHRefEF)</sCr</ScRiPt>IPT>
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!