Pikachu-XSS

0x00 XSS(跨站脚本)概述

Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:

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

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

  输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
  输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

0x01 反射型xss(get)

Pikachu-XSS_第1张图片
直接输入,但是输入一半的时候,发现字符框长度不够了。Pikachu-XSS_第2张图片
直接改前端代码,修改完成后,成功弹框。
Pikachu-XSS_第3张图片


0x02 反射性xss(post)

Pikachu-XSS_第4张图片
这个题弄的我有点蒙,一开始这个登陆框试了半天,发现没XSS,于是登陆后,发现又出一个框,原来敢情是在这里进行XSS
Pikachu-XSS_第5张图片
这个地方让他弹框还是比较简单的,关键是这其实还是一个反射型的XSS,虽然是用post请求提交的参数,但是我感觉利用场景还是比较少,和上一关一样还是得发链接给被害者访问,无非这里是构造一个post的表单。。。


0x04 存储型xss

Pikachu-XSS_第6张图片
熟悉的留言板,直接提交语句就可以构造成功了,并且每次访问都会有框出现。
Pikachu-XSS_第7张图片


0x05 DOM型xss

Pikachu-XSS_第8张图片
直接输入,但是发现并没有弹框,审查源码。。。
Pikachu-XSS_第9张图片
发现输入的值发生了一定的变化,仔细检查后,发现还有一段JS代码。

function domxss(){
	var str = document.getElementById("text").value;
	document.getElementById("dom").innerHTML = "what do you see?";
}
	//试试:'>
	//试试:' οnclick="alert('xss')">,闭合掉就行              

从上面可以看出来,通过value方式将text的值赋值为str,也就是框里面的值,然后通过innerHTML将标签内的值取出来,比如,取出来的值就是this is a label。所以结合前面的'做一个闭合,像,但是发现script似乎被过滤掉了。
Pikachu-XSS_第22张图片
先用大小写,双写啥的试试。大写就直接成功了。
Pikachu-XSS_第23张图片
去服务器上查看php代码:

$html = '';
if(isset($_GET['submit']) && $_GET['message'] != null){
    //这里会使用正则对
    $message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);
    if($message == 'yes'){
        $html.="

那就去人民广场一个人坐一会儿吧!

"
; }else{ $html.="

别说这些'{$message}'的话,不要怕,就是干!

"
; } }

这里只是把script进行了过滤,双写就绕不过了,但是没有区分大小写。


0x09 xss之htmlspecialchars

Pikachu-XSS_第24张图片
明显做了元素实体符号的处理,先随便输入,看看结果。
Pikachu-XSS_第25张图片
这里看到已经被处理过了,上面的情况也很奇怪,输入的代码前半段没有被转义为实体。。。
还是先来了解下htmlspecialchars吧。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体,下列都是预定义字符。

& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >

语法
htmlspecialchars(string,quotestyle,character-set)
Pikachu-XSS_第26张图片
这里要注意,默认情况的编码是不会将'进行编码的,尝试着利用这一点去试试构造onclick=alert('xss')
Pikachu-XSS_第27张图片
发现和想象中有点不一样,研究了好一会,这里应该是后端php在处理时会将'当作一个分割符来看待,所以在前面加上一个' onclick=alert('xss')再来看。
Pikachu-XSS_第28张图片
发现前面的已经闭合上了,后面还多出了一个',那干脆在alert前面再加一个'形成'onclick='alert('xss')
Pikachu-XSS_第29张图片
发现还是不太行,这样会把'alert('当作onclick的值的,最后直接用双引号替换掉'xss'中的单引号,构造语句' onclick='alert("xss")
Pikachu-XSS_第30张图片
成功闭合,并且弹窗,不过这里双引号居然也没有被转义,查了后台php,确实是默认的编码风格,有点奇怪,当然如果被转义这里也可以弹整形类的嘛,影响不大,经过了大量测试,应该是被当作字符串处理了,所以就没有被当作标签进行转义。


0x10 xss之href输出

Pikachu-XSS_第31张图片
这个试了老半天没有成功绕过,感觉应该是都被转义了,于是找了个没有这些符号的XSS攻击代码javascript:alert('XSS');成功弹窗。
Pikachu-XSS_第32张图片
这里感觉应用起来的话,也可以直接用http指到其他有攻击代码的网站上。这里有点小搞笑,输入www.baidu.com。。。
Pikachu-XSS_第33张图片
还是去看下源代码吧,感觉就是自己点背,哈哈。

$html='';
if(isset($_GET['submit'])){
    if(empty($_GET['message'])){
        $html.="

叫你输入个url,你咋不听?

"
; } if($_GET['message'] == 'www.baidu.com'){ $html.="

我靠,我真想不到你是这样的一个人

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

0x11 xss之js输出

Pikachu-XSS_第34张图片
测试了半天,只有一句话。
Pikachu-XSS_第35张图片
查了下前端代码。
Pikachu-XSS_第36张图片
发现有个fromjs,搜索了下,发现一段JS代码,具体的可以看https://baynk.blog.csdn.net/article/details/103122459

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

    }
</script>

输入tmac,太帅了,哈哈。

那这里使用的时候应该是先把之前的,直接成功弹框。
Pikachu-XSS_第37张图片
用作者的话来说就是:

这里讲输入动态的生成到了js中形成xss,javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义
//讲这个例子主要是为了让你明白,输出点在js中的xss问题,应该怎么修?
//这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。
//所以在JS的输出点应该使用\对特殊字符进行转义

你可能感兴趣的:(#,Pikachu)