此时另一个页面 select.php 负责提供给其他用户访问,则可以看到我们的信息。
<?php
$id = $_GET['id'];
//链接数据库
$con = mysqli_connect("localhost","root","123456", "xssdb");
//查询数据
$sql = "select * from xss where id='{$id}';";
$result = mysqli_query($con, $sql);
//$data = mysqli_fetch_all($result); // 从结果集中获取所有数据
//print_r($data);
while($row = mysqli_fetch_assoc($result)) {
echo $row['name'];
}
?>
当我们输入正确的值,如下图所示:
id:1
name:yangxiuzhang
此时数据库中可以看到我们插入的值。
通过本地网址(localhost:8088/xss/select.php?id=1)我们能获取id为1对应的name值。
当我们输入JS代码时,该程序又将如何运行呢?接着我们插入如下数据:
id:2
name:< script>alert(‘hack’)< /script>
注意,这里的hack的单引号要进行转义,因为sql语句中的$name是单引号的,所以这里不转义的话就会闭合sql语句中的单引号,不然注入不进去。
原理:用户提交数据到后端,后端存储至数据库中,然后当其他用户访问查询页面时,后端调出数据库中的数据,显示给另一个用户,此时的XSS代码就被执行了。
此时数据库插入的内容如下所示,可以看到JS代码已经成功插入我们的后台。
最后,我们调用 select.php (localhost:8088/xss/select.php?id=2)页面,可以看到成功执行了该脚本文件。
存储型XSS的数据流向为:前端–>后端–>数据库–>后端–>前端。
3.DOM型
首先,什么是DOM呢?
DOM是指文档对象模型,是一个平台中立和语言中立的接口,有的程序和脚本可以动态访问和更新文档的内容、结构和样式。在web开发领域的技术浪潮中,DOM是开发者能用来提升用户体验的最重要的技术之一,而且几乎所有的现在浏览器都支持DOM。
DOM本身是一个表达XML文档的标准,HTML文档从浏览器角度来说就是XML文档,有了这些技术后,就可以通过javascript轻松访问它们。下图是一个HTML源代码的DOM树结构。
其次,什么优势DOM-XSS呢?
DOM-XSS漏洞是基于文档对象模型(Document Objeet Model脚本代码大全,DOM)的一种漏洞,不经过后端,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。
DOM型的XSS是一些有安全意识的开发者弄出来的,比如说接受参数会做一些过滤,把一些字符转义一下,但是转义之后依然会存在着XSS的情况。常见可能触发DOM-XSS的属性包括:document.referer、window.name、location、innerHTML、documen.write等。
如下图所示,我们上面输入的可以看到这行代码规律,把这个大括号、小括号以及双页号进行转移,按理说转移之后它应该不会再作为它的标签存在,不会存在XSS的代码。
下面Script通过ID获得的这个值,复制到了这个DIV上,经过DOM操作之后,之前转义的字符就变为它的标签,所以经过DOM操作的XSS我们称之为DOMXSS。它有可能通过URL传播,也有可能通过服务器传播。
最后,DOM型跨站脚本的攻击是如何实现呢?
下面简单讲解一个DOM-XSS代码,假设前端是一个index3.html页面。
DOM-XSS测试3 <body>
欢迎大家阅读CSDN Eastmount的博客,一起进步,一起加油喔!
接着设置后台页面,xss3.php用于获取提交的值并显示其在页面中。注意,代码是获取username中的值,然后显示在print内,这也是导致XSS的原因。
<?php
//获取提交的表单值
$name=$_POST["name"];
?>
<script type="text/javascript">
//获取username值并输出在print内,这里是导致xss的主要原因
var text = document.getElementById("username");
var print = document.getElementById("print");
print.innerHTML=text.value;
</script>
此时,当我们输入正常的参数,它显示的结果如下图所示,是正常显示的。
而当我们输入恶意代码的时候,比如提交
给后台,它会执行我们的JS代码,弹出hack的窗体。从而证明了DOM-XXSS是存在的。
DOM型跨站脚本漏洞的数据流向是:前端->浏览器。
XSS构造及漏洞利用
1.XSS构造
在进行SQL注入中,我们可以设置相应的过滤函数防止,比如防止万能密码(‘or’='or’或admin),也能调用preg_replace()函数将特色字符过滤。同样,XSS攻击代码也可能会被过滤,如下所示,它将< script>和 < /script>进行了过滤。
<?php
$name=$_POST["name"];
if($name!=null){
//过滤<script>和</script>
$name=preg_replace("/<script>/","",$name);
$name=preg_replace("/<\/script>/","",$name);
echo $name;
}
?>
如何绕过这个过滤呢?这里可以通过大小写成功绕过 ,如下所示:
为了更好地理解XSS跨站脚本攻击,更好地进行防御,这里我们分享常见的绕过XSS过滤(XSS-Filter)的方法。
1) 利用标记注射HTML、JavaScript
通过<script>标签就能任意插入由JavaScript或VBScript编写的恶意脚本代码
常用案例:
<script>alert(/xss/)</script>
2) 利用HTML标签属性值执行XSS
通过javascript:[code]伪协议形式编写恶意脚本
常用案例:
3) 空格回车Tab绕过过滤
注意javas和cript之间的间隔不是由空格键添加的,而是用Tab键添加的。
使用回车分隔:
cript:
alert(/xss/)" width=100>
4) 对标签属性值进行转码
替换成:
其中,t的ASCII码值为116,用”t”表示,:则表示:。
再进一步替换:
5) 产生事件如click、mouseover、load等
W3C(万维网联盟)将事件分为3种不同的类别:
6) 利用CSS跨站过滤
常见示例如下所示:
<style>
body {background-image:url("javascript:alert(/xss/)");}
</style>
<style>
body {background-image: expression(alert("xss"));}
</style>
<style>
@import 'javascript:alert(/xss/)';
</style>
7) 扰乱XSS过滤规则
一个正常的XSS输入:
转换大小写后的XSS:
大小写混淆的XSS:
不用双引号,而是使用单引号的XSS:
不适用引号的XSS:
不需要空格的XSS:
构造不同的全角字符:
利用注释符
\和\0–
<style>
@imp\0ort 'java\0scri\pt:alert(/xss/)';
</style>
<style>
@imp\ort 'ja\0va\00sc\000ri\0000pt:alert(/xss/)';
</style>
CSS关键字转码
<style>
8) 利用字符编码
原始语句:
十进制编码
src="javascript:a&
#108ert('xss');">
src="javascrip&#
0116;:alert('x&#
0115;s');">
src="javasc
4ipt:ale&
#0000114t('xss�
0039);">
十六进制编码
src="javascript:&#
x61lert('xss');">
9) 利用字符编码eval()函数、eval()和string.fromCharCode()函数过滤
<script>
eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29");
</script>
src="javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))">
PS:由于JavaScript代码必须要写在代码块中才能显示,所以文章包含了很多代码块,望读者理解。
2.挖掘其他XSS漏洞
其他恶意攻击包括黑盒攻击测试、源代码审计、Flash XSS等。
1)黑盒攻击测试
Acunetix Web Vulnerability Scanner 是一款商业级的web漏洞扫描程序,它的功能非常强大,可以自动化检查各种web应用漏洞,包括XSS、SQL注入、代码执行、目录遍历、网站源代码暴力等。
注意:下一篇文章作者将结合AWVS详细讲解XSS跨站脚本攻击的实战案例。
黑盒攻击测试手工检测XSS代码常见用法包括:
<script>alert(/xss/)</script>
a M
M
Flash确实存在很多漏洞,后续读者也想深入研究了解,看看能不能复现几个漏洞代码出来。同时,Flash XSS感兴趣的读者可以阅读安全脉搏大神的这篇文章:
由于XSS通常可以插入在script标签、HTML注释、标签属性名、标签属性值、标签名字、CSS等中,所以接下来我们简单讲讲如何防御XSS攻击。
输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当的内容提交,阻止或者忽略除此外的其他任何数据。如下代码,检查用户输入的电话号码是否真确(数字、字母检测)。
有时根本就不需要考虑到它是不是HTML标签,我们根本用不到HTML标签。不管是采用输入过滤还是输出过滤,都是针对数据信息进行黑/白名单式的过滤。不同的javascript写法包括:
大小写混淆:
插入[tab]键;
插入回车符:
asrci
pt:alert(‘xss’);”>
使用/**/注释符:
重复混淆关键字:
使用&#十六进制编码字符:
使用&#十进制编码字符:
使用&#十进制编码字符(加入大量的0000):
在开头插入空格:
白名单仅允许执行特定格式的语法辅助论坛,仅允许< img scr=“” > 格式脚本代码大全,其余格式一律取代为空白。其优点是可允许特定输入格式的HTML标签,确实是验证程序编写难度校高,且用户可输入变化减少。
4.代码实体转义
由于只保留文字部分是一劳永逸的,有时我们还需要展示这个标签,比如说程序论坛当中要贴一个代码,这个时候我们需要用一些转义,它会把这个大括号、小括号以及双引号做一个转义,做为一个字符,就无法执行这个标签型,后面加一个参数,但有时候单引号也会造成XSS。
来源:【九爱网址导航www.fuzhukm.com】 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!