Pikachu靶场实战-XSS

Cross-Site Scripting

简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;

XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

反射型xss(get)

Pikachu靶场实战-XSS
最大长度改一下 改成80
输入

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

Pikachu靶场实战-XSS
get形式的XSS会生成相应的url
Pikachu靶场实战-XSS

反射型xss(post)

Pikachu靶场实战-XSS
这个要先登录 然后是上一题的页面
Pikachu靶场实战-XSS
post形式的XSS不会在url显示

存储型XSS

输入

<script>alert("xss")</script>

Pikachu靶场实战-XSS
这类XSS漏洞注入语句会到数据库中,每次进入都会执行

DOM型XSS

DOM

Pikachu靶场实战-XSS
DOM 是 W3C(万维网联盟)的标准。
DOM 定义了访问 HTML 和 XML 文档的标准:
“W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”
W3C DOM 标准被分为 3 个不同的部分:
•核心 DOM - 针对任何结构化文档的标准模型
•XML DOM - 针对 XML 文档的标准模型
•HTML DOM - 针对 HTML 文档的标准模型
注:DOM 是 Document Object Model(文档对象模型)的缩写。
②漏洞利用
DOM可以理解为访问HTML的标准接口,DOM里面会把我们的HTML分成一个DOM树
我们可以以这棵树为入口,通过DOM的某些方法对树进行操作,比如对标签的添加、改变和删除等等。
DOM相当于在前端提供了一个 通过JS去对HTML进行操作 的接口
源码中看到

<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>

代码看出,通过value方式将text的值赋值为str,也就是框里面的值,然后通过innerHTML将标签内的值取出来,比如<label id="lb1">123</label>,取出来的值就是123所以结合前面的’做一个闭合,像<script>这种有前后标签闭合的就不太方便用了,用提示里面的onclick来构造,' onclick=alert('xss')>
Pikachu靶场实战-XSS

DOM型XSS-X

源码

function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
window.location 对象所包含的属性如下:

Pikachu靶场实战-XSS
构造语句' onclick=alert('xss')>
Pikachu靶场实战-XSS
和上一题不同之处:值是从URL中获取到的,就像反射型XSS一样。

XSS之盲打

Pikachu靶场实战-XSS
注: 盲打并不是一种攻击类型,而是一种场景,输入的东西并不会在前端显示,而是提交到了后台。

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

然后
进去后台发现已经受到了攻击
Pikachu靶场实战-XSS

XSS之过滤

Pikachu靶场实战-XSS
输入<script>alert('xss')</script>
发现被过滤了

Pikachu靶场实战-XSS
源码

$html = '';
if(isset($_GET['submit']) && $_GET['message'] != null){
    //这里会使用正则对<script进行替换为空
    $message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);
    if($message == 'yes'){
        $html.="<p>那就去人民广场一个人坐一会儿吧!</p>";
    }else{
        $html.="<p>别说这些'{$message}'的话,不要怕,就是干!</p>";
    }
}

双写绕过也无效
发现script被过滤 <>似乎没有
改变大小写
Pikachu靶场实战-XSS

xss之htmlspecialchars

htmlspecialchars()
函数把一些预定义的字符转换为HTML实体,下列都是预定义字符。

& (和号) 成为 &amp
" (双引号) 成为 &quot
' (单引号) 成为 &#039
< (小于) 成为 &lt
>  (大于) 成为 &gt

输入<script>alert('xss')</script>
Pikachu靶场实战-XSS
默认情况的编码是不会对’(单引号)进行编码的,尝试利用它来构造

试试onclick=alert(‘xss’)
Pikachu靶场实战-XSS
为了闭合 前后都加 '
XSS前后的引号换为双引号

' οnclick='alert("xss")'

Pikachu靶场实战-XSS

XSS之href输出

查看源码

        //输出在a标签的href属性里面,可以使用javascript协议来执行js
        //防御:只允许http,https,其次在进行htmlspecialchars处理
        $message=htmlspecialchars($_GET['message'],ENT_QUOTES);
        $html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";

这次htmlspecialchars函数使用了ENT_QUOTES类,也加上了对单引号的转义,但是在a标签的href属性里面,可以使用javascript协议来执行代码

javascript:alert(123)

Pikachu靶场实战-XSS

XSS之js输出

源码

$ms='kobe';
    if($ms.length != 0){
        if($ms == 'tmac'){
            $('#fromjs').text('tmac确实厉害,看那小眼神..')
        }else {
 //                  alert($ms);
            $('#fromjs').text('无论如何不要放弃心中所爱..')
        }

    }

这里使用的时候应该是先把之前的

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

直接成功弹框。
这里输入动态的生成到了js中形成xss,javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义
输出点在js中的xss问题在JS的输出点应该使用\对特殊字符进行转义

Pikachu靶场实战-XSS

上一篇:pikachu 漏洞平台sql注入 之 字符型注入


下一篇:CTFHub-技能树-SSRF