|
XSS 跨站脚本攻击漏洞(一)
原理
Sql 注⼊:⽤户输⼊的内容被当作 sql 语句去执⾏
xss:⽤户输⼊的内容被当作 js 代码执⾏(js 注⼊)
利⽤(危害)
js 代码能够做任何事情
分类
dom 和 xss 都只能触发⼀次
http://10.211.55.3/3.html#alert(123)
http://10.211.55.3/3.html
Dom-xss
document.write
innerHTML
eval()
<meta charset='utf-8'>
<script>
var pos=document.URL.indexOf("name=")+5; //取name=后⾯的值
var username = unescape(document.URL.substring(pos,document.URL.length)); //取name=后⾯的值
var r='<b>'+username+'</b>'
document.write(r);
</script>
poc:http://192.168.10.150/1.html?name=<script>alert(1)</script>
示例代码1:
url总⻓度:100
name:60
substring(65,100)
示例代码 2:
<div id='404'>404</div>
<input type="button" onclick=fun() value="点击有惊喜">
<script>
function fun(){
var url=unescape(document.URL);//获取url
var pos=url.indexOf("name=")+5;//取name=后⾯的值
document.getElementById("404").innerHTML="Hi,
<b>"+url.substring(pos,url.length)+'</b>';}
</script>
poc:http://192.168.10.150/2.html?name=<img src=# onerror=alert(1) />
示例代码 3:
</h1>Hello World</h1>
<script>
//取#后⾯的数据
var a =location.hash.substr(1);
eval(a); // eval是⾼危函数。 把字符串当做代码进⾏执⾏
</script>
poc:http://192.168.10.150/3.html#alert(1);
反射-xss
<?php
// 反射型XSS漏洞示例(vulnerable.php)
$searchTerm = $_GET['search'] ?? '';
?>
<!-- 前端⻚⾯ -->
<!DOCTYPE html>
<html>
<head>
<title>反射型XSS演示</title>
</head>
<body>
<h1>搜索系统</h1>
<form method="GET">
<input type="text" name="search" placeholder="输⼊搜索内容">
<button type="submit">搜索</button>
</form>
<?php if(!empty($searchTerm)): ?>
<!-- 漏洞点:未对⽤户输⼊进⾏过滤处理 -->
<h3>搜索结果:<?php echo $searchTerm; ?></h3>
<?php endif; ?>
</body>
</html>
存储-xss(⾼危)
会将⽤户输⼊的恶意代码存储在服务器⾥⾯,任何⽤户去访问都会触发这段恶意代码
核⼼:
反射型和 dom 型,恶意代码是存放在客户端的(只触发⼀次)
存储型,恶意代码是存放在服务端(多次触发)
<?php
// 存储型XSS漏洞示例(comment.php)
$commentFile = 'comments.txt';
// 处理表单提交(漏洞点:未过滤存储)
if(isset($_POST['submit'])){
$comment = isset($_POST['comment']) ? $_POST['comment'] : '';
if(!empty($comment)){
// 将⽤户输⼊直接存⼊⽂件
file_put_contents($commentFile, $comment . PHP_EOL, FILE_APPEND);//⽤户传⼊的参数会写
⼊⽂本 comments.txt⾥⾯
}
}
// 读取并显示历史评论(漏洞点:未过滤输出) 参数 1 ? 参数 2 :参数 3 三元表达式
$comments = file_exists($commentFile) ? file($commentFile) : []; //判断 txt 存不存在,如果不
存在,那么就会新建⼀个 txt ⽂件,如果存在,那么就会把⾥⾯的数据放到[xxx,ccc,aaa,bbb,ddd]
?>
<!DOCTYPE html>
<html>
<head>
<title>存储型XSS演示</title>
</head>
<body>
<h1>留⾔板系统</h1>
<!-- 留⾔表单 -->
<form method="POST">
<textarea name="comment" rows="4" cols="50"></textarea><br>
<input type="submit" name="submit" value="提交留⾔">
</form>
<hr>
<!-- 显示历史留⾔ -->
<h2>历史留⾔</h2>
<?php foreach($comments as $line): ?>//[xxx,ccc,aaa,bbb,ddd] xxx ccc aaa bbb ddd
<!-- 直接输出数据库/⽂件中的原始内容 -->
<div class="comment"><?php echo $line; ?></div>
<?php endforeach; ?>
</body>
</html>
www.abc.com
反射&dom
www.abc.com?恶意代码
存储
www.abc.com
实体
<script>
<script>
绕过
xss-3
双写绕过
// 定义⼀个 HTTP 处理器函数,⽤于处理 XSS 过滤问题
func(writer http.ResponseWriter, request *http.Request) {
// 从请求的 URL 中获取 "name" 参数
var name = request.URL.Query().Get("name")
// 构建⼀个不区分⼤⼩写的正则表达式,⽤于匹配 "<script>" 标签
scriptRegex := regexp.MustCompile("(?i)<script>")
// 替换所有匹配到的 "<script>" 标签为空字符串,防⽌脚本注⼊
name = scriptRegex.ReplaceAllString(name, "")
// 构建⼀个不区分⼤⼩写的正则表达式,⽤于匹配 "</script>" 结束标签
scriptEndRegex := regexp.MustCompile("(?i)</script>")
// 替换所有匹配到的 "</script>" 标签为空字符串,进⼀步防⽌脚本注⼊
name = scriptEndRegex.ReplaceAllString(name, "")
// ⽣成 HTML 输出,将处理后的 name 参数嵌⼊其中,并写⼊响应输出
writer.Write([]byte(fmt.Sprintf(`<html>Hello %v</html>`, name)))
}
<sc<script>ript>alert(1)</scri</script>pt>
WEB渗透测试工程师系统班250303期 第24节课作业 1、什么是xss? 跨站脚本攻击漏洞,用户输入的内容被当作js代码执行(js注入) 2、xss危害? js代码能做任何事情 3、xss有几种类型? Dom-xxs 反射-xxs 存储型-xxs 4、什么是反射性xss? 利用未对用户输入内容进行过滤的漏洞进行js注入; 反射型XSS攻击中,恶意脚本作为请求的一部分被发送到服务器,然后服务器将恶意脚本"反射"回响应页面中,最终在受害者的浏览器中执行。这种攻击通常需要诱骗用户点击特制的恶意链接。 5、什么是DOM型xss? DOM型XSS攻击是通过修改页面的DOM环境来实现的,攻击载荷不会经过服务器处理,而是直接在客户端被解释执行。这种攻击发生在数据从源到接收器的流动过程中。 6、什么是存储型xss?
存储型XSS(又称持久型XSS)是最危险的一种XSS攻击方式,恶意脚本会被永久存储在目标服务器(如数据库、文件系统、评论区、用户资料等),并在用户访问受影响的页面时自动执行。
|