pikachu

Posted by wx_x on 2022-03-06
Words 3.2k and Reading Time 11 Minutes
Viewed Times

暴力破解

大量的认证信息在认证接口进行尝试登录,使用带有字典的工具来进行自动化操作

pikachu靶场-暴力破解 - 陈子硕 - 博客园 (cnblogs.com)

引子 · burpsuite实战指南 (gitbooks.io)

基于表单的破解

填写本机ipv4号到url,burp抓包,action进入intruder模块

Sinper:一个变量设置一个payload进行攻击

Battering ram:可以设置两个变量,把payload同时给两个变量

Pitchfork:两个变量分别设置payload,然后按顺序一一对应进行破解

Cluster bomb:两个变量分别设置payload,然后交叉列所有情况进行破解(常用)

选择attack type,这里选择cluster bomb,clear取消默认选择区域,选择账号密码区域,点击add即可,进入payload,这里有两个payload,账号和密码,选择simple list,先在payload set:1,导入字典,然后再切换到payload set 2,导入字典,点击start attack即可。

点击start attack后,可以从长度上判别正确账号密码,正确的账号密码对应的长度是与其他的不一样的,爆破的时候会有很多项组合,只需找出不同于清一色的长度即可。

验证码绕过(**On Server**)

验证码作用:防止直接暴力破解,也就是直接拿去burp爆账号密码。

无头绪就看源码,打开php的根目录: 。

查看源码,发现vcode一直有效,也就是说验证码没有设置任何提交的次数限制以及时间限制,那么可以直接拿去填写在burp上进行爆破。

username=admin&password=§1234§&vcode=67fy0v&submit=Login

爆破操作和上面操作相同,点击start attack后,弹出的Intruder attack 界面,可以通过length判断是否为正确,因为成功爆破与失败爆破的length是不一样的,也可以点击payload里的密码,在界面下方有一个response是回显页面,可以知道这串密码是否正确:

可以做一个小实验,提示告诉我们,账号密码没变,那么我们可以直接用之前的尝试:1.正确的账号密码,正确的验证码,结果成功登录;2.使用错误的账号密码,正确的验证码,发现提示的是账号密码不存在,那么就是说验证码对了,因为验证码错了的话,是不会进行表单提交。于是这里我看健哥博客,无条件不刷新的条件下,这个实验才成立。

验证码绕过(**On Client**)

既然说是绕过在客户端生成的验证码,也就是没有点击验证码更新的时候没有与服务器进行交互,那我们就去验证一下。

点击验证码图片进行更新,并且抓包,发现没有数据包,说明验证码的生成是在前端,是js生成滴,直接利用burp进行爆破即可。

之所以与上文on server爆破方式差不多,是因为它虽然有交互,但是没有设置任何限制,安全性等同于在js前端生成验证码。

确定验证码提交后台后并没有进行验证,而是直接在前端进行了验证。下面进行一下暴力破解步骤和前面的差不多,这里只需将这两个设置为动态变量,验证码不用管。

发送至intruder模块,选择sniper(狙击手),也就是一次只能选择一组进行爆破。这里还是尝试admin作为username,爆破密码

Toker**防爆破**

Token信息来源:什么是token - 简书 (jianshu.com)

Token-令牌作用-识别:在client第一次访问服务端的时候,服务端生成一串字符串,用来识别client身份,在这次访问结束后,client下次访问只需用提交令牌就可以不用输入账号密码来请求服务端数据。

Token-优点:减少服务器压力(通过减少请求次数,减少数据库查询次数)

Token-使用:

一.

-client:使用mac地址/设备号(具有唯一性),作为参数传至服务端。

-server:服务端接收到该参数后,便用一个变量来接收同时将其作为Token保存在数据库,并将该Token设置到session中,客户端每次请求的时候都要统一拦截,并将客户端传递的token和服务器端session中的token进行对比,如果相同则放行,不同则拒绝。

一优点:client无需重复登录

一缺点:client需要将设备号或者mac地址作为参数传送给server,server需要保存

二.用session值作为Token

-client:client携带账号密码

-server:server无需存储数据,当client输入正确账号密码时,server将本地的sessionid作为token传给client,之后client只用携带该令牌就可以请求数据,但是有时效,session会过期,此时就需要重复上述步骤,重新获取token令牌。

二优点:server无需保存令牌

二缺点:session过期之后只能再次重复上述步骤

正文:

了解token之后,token用于识别,每次服务器返回的登录页面都会包含一个随机的token值,是在后端保存不在前端显示出来的,抓个包看看,发现这个token在欺骗自己,看不起我,直接显示出来,那就说明每一次token毫无作用,使用options的Grep Extract(这些设置可用于提取响应消息中的有用信息)提取其token(点击add,进去点击refetch,下部分搜索value找到token,选定可以看到上方在加载,然后ctrl+c(后面用到)然后点击下方ok),request engine(设置burp intruder攻击参数,设置在什么时候攻击:网络连接失败时重试次数,重试前暂停次数等)中number of threads设置为1,payload sets中密码为simple list正常load字典,token则选择recursive grep,在ininta payload for first request中ctrl+v。

Start attack

CSS(cross site scripting)

XSS漏洞一直被评估为web漏洞中危害较大的漏洞。

XSS跨站脚本攻击 - 那一叶随风 - 博客园 (cnblogs.com)

XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。

形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。

因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:

输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;

输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

学习要求:熟悉JS,GET和POST两种基本请求方法的区别

GET和POST两种基本请求方法的区别 - 在途中# - 博客园 (cnblogs.com)),

以及http与php以及

dom(DOM-XSS攻击原理与防御 - Mysticbinary - 博客园 (cnblogs.com)

pikachu-xss教程:

Pikachu漏洞练习平台实验——XSS(二) - 那少年和狗 - 博客园 (cnblogs.com)

这里我了解到http认证机制中的Basic认证,找了篇比较全面的文章:

HTTP认证之基本认证——Basic(一) - xiaoxiaotank - 博客园 (cnblogs.com)

Dom型xss: DOM这个东西相当于在前端提供了一个通过JS去对HTML进行操作的接口

文件上传

稍微跳一下,学的太不扎实了,现在才进入一些节奏

前端过滤

前端不谈安全

直接进入源文件修改源码即可

1
2
搜索 开始上传
在选中区域改为 this.value

image-20220306105612880

然后就可以顺利过了,但是我这边没有显示保存至指定路径,估计是phpstudy配置问题,懂原理就好

解决方案:(79 条消息) 解决 php 上传文件过程中 Warning move_uploaded_file, failed to open stream 的一种思路_zhao 不到的博客 - CSDN 博客

服务器过滤

抓包过,上传的时候,肯定会检测类型,然后发送给服务器审核,要是发送的就是假的,那么服务器也没办法

image-20220306122510009

然后老样子路径报错,参考上面修改

这里我发现了我已经忘记了,http头的结构。。

参考(79条消息) HTTP 请求 / 响应报文头部结构_飞扬的梦想王国 - CSDN 博客_http 头部结构

image-20220306123257291

基于文件内容的上传检测

getimagesize (string filename) 函数

函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。即函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。

可以看到,High 级别的代码读取文件名中最后一个”.” 后的字符串, 即取最后一个后缀,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”.jpg”、”.jpeg” 、”*.png” 之一。同时,getimagesize 函数更是限制了上传文件的文件头必须为图像类型。

简单来说,检查的更加细致了,这时候提供两种办法写入

  1. 加图片的文件头,达到绕过

    1
    2
    3
    4
    GIF89
    <?php
    @eval...
    ?>

    但是需要改一下包,像上面绕过服务器一样image-20220306122510009

  2. echo在图片里写入,绕过

    直接就是写入在sublime写一个ma,然后就直接保存格式为jpg就行,直接上传就过了

绕过后,给出了图片位置,使用 fileinclude 文件包含漏洞进行调用

1
http://xx.xx.xx.xx/pikachu-master/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2022/03/06/2307796224648d3413b661301025.jpg&submit=提交查询

文件包含

什么是文件包含漏洞?

文件包含函数,使开发人员在一个代码文件中可以直接调用另外一个代码文件,通常来说,是没有什么安全问题的,问题就在于,这个文件包含函数的代码文件变成了可前端传入的变量

1
2
防护
不要让前端可以直接传递文件到包含函数里面

本地包含

就参考上面文件上传那里即可

远程包含

调用其他网站的恶意文件并且执行

详细点呢,就是 网站允许攻击者包含一个远程文件,这个远程文件一般挂于服务器之上的txt格式的文件,里面写着恶意内容,访问指定上传位置,即可getshell

具有一定条件

1
2
3
1. php.ini 中 allow_url_include 和 allow_url_fopen 的开启

2. 所包含的远程文件后缀不能与目标服务器语言相同. (比如目标服务器是 php 解析的,远程服务器的文件不能是 php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
include()
include_once()
require()
require_once()

include()和require()的区别:
require()如果在包含过程中出错,就会直接退出,不执行后续语句
require()如果在包含过程中出错,只会提出警告,但不影响后续语句的执行

参考 https://xz.aliyun.com/t/7176
伪协议很重要喔,记住那几个函数,才能读到指定的php文件
下面简单介绍一下

php://filter
用法:index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php

php://input
用法:?file=php://input 数据利用 POST 传过去
。。。。
还是看这个链接吧,我不想打字辽。。

image-20220306162103544

然后打开网址,打开hackbar,输入其他网站上面的恶意文件,然后就

image-20220306163853996

打开shell工具,设置监听,然后运行这个网站目录下的恶意文件就可以了

但是我这里遇到了一个问题,这个答主是直接用自己的服务器挂了一个php文件,但是我不懂我这个云服务器,我的文件应该放在云服务器的哪里才可以传到指定位置。。还是说要建一个站,来互传,还有很长的路走咧

参考 PiKachu 靶场之文件包含漏洞 (File Inclusion)angry_program 的博客 - CSDN 博客文件包含漏洞靶场

我发现不要看那些一篇写完的教程,太不详细了,一点细节都没有,完全就是为了过而去过

修复方案

1
2
3
PHP 中使用 open_basedir 配置限制访问在指定的区域(基本上都拦截完了,所以这个包含在ctfweb考的挺多,虽然我不打ctf。。太难了。)
过滤.(点)/(反斜杠)\(反斜杠)等特殊字符
尽量关闭 allow_url_include 配置

本博客所有文章除特别声明外,均采用CC BY-SA 4.0 协议 ,转载请注明出处!

...

...

00:00
00:00