![]() XSS漏洞一、文章简介XSS漏洞是Web应用程序中最常见的漏洞之一。如果您的站点没有预防XSS漏洞的固定方法,那么很可能就存在XSS漏洞。
二、XSS 漏洞简介跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 xss 分类:(三类)
三、XSS 漏洞原理3.1 反射型XSS在黑盒测试中,这种类型比较容易通过漏洞扫描器直接发现,我们只需要按照扫描结果进行相应的验证就可以了。 相对的在白盒审计中, 我们首先要寻找带参数的输出函数,接下来通过输出内容回溯到输入参数,观察是否过滤即可。 新建 XssReflex.php,代码如下: <html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
<title>XSS</title>
</head>
<body>
<form action='' method='get'>
<input type='text' name='input'>
<input type='submit'>
</form>
<br>
<?php
$XssReflex = $_GET['input'];
echo 'output:<br>'.$XssReflex;
?>
</body>
</html>
这是一个很简单、也很常见的页面: 打开Firefox输入url: ![]() 当我们输入 ![]() 当我们输入 ![]() 以上都为正常的输出,但如果我们输出一些 比如我们输入 ![]() 可以看到浏览器成功弹窗,说明我们输出的JavaScript代码成功被执行了。 ![]() 第12行增加了:
这个弹窗并没有什么实际的意义,但通过它我们知道输入javascript代码是可以被执行的,当我们输入一些其他函数,比如 3.2 存储型XSS和反射性XSS的即时响应相比,存储型XSS则需要先把利用代码保存在比如数据库或文件中,当web程序读取利用代码时再输出在页面上执行利用代码。但存储型XSS不用考虑绕过浏览器的过滤问题,屏蔽性也要好很多。 ![]() 存储型XSS的白盒审计同样要寻找未过滤的输入点和未过滤的输出函数。 使用cat命令查看 XssStorage.php 代码 shiyanlou:~/ $ cat XssStorage.php
代码如下:<参考自
页面功能简述:
打开Firefox输入url: ![]() 我们随意输出一些内容: ![]() 可以看到页面正常显示页面留言信息。 ![]() 并且我们重启浏览器之后再加载该页面,页面依然会弹窗,这是因为恶意代码已经写入数据库中,每当有人访问该页面时,恶意代码就会被加载执行! 我们查看网页html代码: ![]() 这就是所谓的存储型XSS漏洞,一次提交之后,每当有用户访问这个页面都会受到XSS攻击,危害巨大。 3.3 DOM XSS这种XSS用的相对较少,并且由于其特殊性,常见的漏扫工具都无法检测出来,这里先不做讲解。 记个待办,以后来补! 四、XSS漏洞防范4.1 反射型xss漏洞防范php中xss的漏洞防范方法总结:<参考自Segmentfault> A.PHP直接输出html的,可以采用以下的方法进行过滤:
1.htmlspecialchars函数
2.htmlentities函数
3.HTMLPurifier.auto.php插件
4.RemoveXss函数
B.PHP输出到JS代码中,或者开发Json API的,则需要前端在JS中进行过滤:
1.尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容
2.必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤
C.其它的通用的补充性防御手段
1.在输出html时,加上Content Security Policy的Http Header
(作用:可以防止页面被XSS攻击时,嵌入第三方的脚本文件等)
(缺陷:IE或低版本的浏览器可能不支持)
2.在设置Cookie时,加上HttpOnly参数
(作用:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6)
(缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全)
3.在开发API时,检验请求的Referer参数
(作用:可以在一定程度上防止CSRF攻击)
(缺陷:IE或低版本的浏览器中,Referer参数可以被伪造)
这里我们选用htmlentities()函数进行测试:
新建Xss_htmlentities.php, 代码如下:
在Firefox输入url: ![]() 当我们输入 ![]() 可以看到页面并没有弹窗。 ![]() 可以看到htmlentities()函数对用户输入的 4.2 存储型xss漏洞防范存储型XSS对用户的输入进行过滤的方式和反射型XSS相同,这里我们使用
htmlspecialchars和htmlentities的区别: htmlspecialchars 只转义 新建Xss_htmlspecialchars_Storage.php ,代码如下: <span style='font-size:18px;'><meta http-equiv='Content-Type' content='text/html;charset=utf-8'/>
<html>
<head>
<title>XssStorage</title>
</head>
<body>
<h2>Message Board<h2>
<br>
<form action='Xss_htmlspecialchars_Storage.php' method='post'>
Message:<textarea id='Mid' name='desc'></textarea>
<br>
<br>
Subuser:<input type='text' name='user'/><br>
<br>
<input type='submit' value='submit' onclick='loction='XssStorage.php''/>
</form>
<?php
if(isset($_POST['user'])&&isset($_POST['desc'])){
$log=fopen('sqlStorage.txt','a');
fwrite($log,htmlspecialchars($_POST['user']).'\r\n'); # 在此对用户输入数据$_POST['user']进行过滤
fwrite($log,htmlspecialchars($_POST['desc']).'\r\n'); # 在此对用户输入数据$_POST['desc']进行过滤
fclose($log);
}
if(file_exists('sqlStorage.txt'))
{
$read= fopen('sqlStorage.txt','r');
while(!feof($read))
{
echo fgets($read).'</br>';
}
fclose($read);
}
?>
</body>
</html></span>
在Firefox输入url: ![]() 当我们在Message中输入 ![]() 可以看到页面并没有弹窗。 ![]() 可以看到htmlspecialchars()函数对用户输入的 五、总结及回顾
|
|
来自: liang1234_ > 《XSS》