Pikachu靶场通关记录
暴力破解
基于表单的暴力破解
随便输入一个密码并点击登录,用burpsuite抓包
转给爆破模块,由于只用爆破密码这一个变量,使用狙击手模式
导入字典开始爆破,在结果中按长度排序找到正确密码
验证码绕过(on server)
本关多了一个在服务器后台验证的验证码
只要我们不把包放过,许多网页应用的服务器后台是不会刷新验证码,或者验证码在一段时间内有效
保留当前的验证码,仍然以密码作为变量爆破
验证码绕过(on client)
由于验证码判断是在前端进行,我们直接禁用JavaScript功能再爆破即可
token防爆破
本关先抓包观察一下请求内容
可以发现在登录时还需要上传token,所以我们可以使用爆破模块的音叉模式
定义密码和token这两个变量,token抓取页面中的token值即可
当然此时由于payload是抓取页面上的值,所以不能使用多线程,需要将线程设为1
XSS漏洞
反射型xss(get)
尝试<script>alert(1)</script>
输到一半发现存在长度限制,前往页面元素中调整
成功弹窗
反射型xss(post)
本关和上一关不一样的是提交的POST请求,当然构造的xss语句与上一关一致
存储型xss
将之前的注入语句从留言板提交后,会被存储到网站的数据库中,所以只要后续浏览该页面,无论是否提交内容,都会弹窗
DOM型xss
观察页面的js
我们在框中输入的内容会被放入a标签加到页面上
所以和其他类型的注入攻击思路一样,首先思考如何闭合以构造注入语句
我们可以将href属性闭合,后面的内容会被作为a标签的其他属性
当然也可以将a标签闭合,后面的内容则会直接被当作HTML元素
尝试提示的两种方法
1 | '><img src="#" onmouseover="alert('xss')"> |
DOM型xss-x
观察js代码
1 | function domxss(){ |
本关与前一关的方法一致,区别就是这次是从url中获取我们输入的text参数,类似反射型
xss之盲打
盲打即在前端无法看到攻击是否成功,因为XSS注入语句没有直接拼入当前页面的HTML
但是本题提示输入的内容保存在了后台页面,我们在注入后访问admin_login.php
xss之过滤
先尝试<script>alert(document.cookie)</script>
只剩下一个>
,猜测script关键字被过滤
使用a标签绕过
1 | <a href="" onclick="alert('xss')"> |
xss之htmlspecialchars
尝试注入语句<script>alert(document.cookie)</script>
发现被传入了href的属性
构造如下语句绕过
1 | " onclick="alert(document.cookie)"> |
仍然注入失败,查看源代码,发现进行了htmlspecialchars编码过滤
htmlspecialchars编码规则如下
1 | &:转换为& |
当然有时候该函数被设置为仅过滤双引号(默认设置下),这需要我们试出来
修改刚刚的注入语句
1 | ' onclick='alert(document.cookie) |
xss之href输出
传入的内容放在href属性中
尝试上一关的注入语句' onclick='alert(document.cookie)
注入失败,查看源代码
发现单引号被编码了
由于链接标签里可以通过在 href 中使用 javascript:xxx
来执行 JavaScript
构造注入语句javascript:alert(document.cookie)
xss之js输出
查看页面元素和源代码
输入被传给了ms
我们可以尝试闭合源代码中原有的<script>
标签
1 | </script><script>alert('xss')</script> |
CSRF
CSRF(get)
使用提示的账户密码登录到其中一个账号
修改个人信息,提交并使用bp抓包
抓到的数据包如下
请求的URL和请求体中并没有看到token,说明没有防CSRF的措施
我们将住址改为You are hacked
构造的链接为http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=110&add=You+are+hacked&email=114514%40gmail.com&submit=submit
接下来我们登录到另一个用户,并新建一个标签页并访问构造的链接,用于模拟用户点击恶意链接
CSRF(post)
遇到目标参数在请求体中传输,即POST传参的情况时,我们可以构造一个html网站并引诱用户点击
在该站点中发送post请求到目标网站
1 |
|
在靶场环境中新建一个html页面csrf.html
并放入上面的代码
访问该网页http://127.0.0.1/pikachu/csrf.html
CSRF Token
由于服务器生成了token,每次像后端服务器提交请求都需要验证token
而当我们刷新页面时token值会发生变化,所以CSRF漏洞无法生效
SQL注入
数字型注入
查询一下发现是post注入类型
判断一下id是不是注入点,由于题目提示是数字型,所以不需要考虑闭合引号
1 | id = 1000 or 1 = 1 |
按照SQL注入的流程,先找字段数量
1 | id=1 order by n |
一共两个字段,确认字段数量是为了后续联合注入的字段数与主查询一致
接下来就是用联合查询开始脱库
字符型注入
字符型要多考虑引号的闭合
这里我们把目标设简单一些,爆出当前表的所有用户名和邮箱
注入语句为' or 1=1 --
搜索型注入
和字符型类似,我们闭合引号即可
xx型注入
这一关的后端源码中SQL语句为
1 | select id,email from member where username=('$name') |
所以除了引号,我们还需要闭合前面的括号
1 | xx') or 1=1 -- |
insert/update注入
本关有两个注入点,注册时会向数据库插入数据,是一个注入点
登录后修改信息会更新数据库条目,也是一个注入点
这两个注入点都可以使用报错注入,因为原SQL语句不提供select
1 | ' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and ' |
后侧使用and '
闭合即可
delete注入
执行删除留言的操作,并使用bp抓包
只传递了一个参数id
猜测语句为delete from message where id={$_GET['id']}"
此时由于是数字型注入点,不需要考虑引号
1 | 1 and updatexml(1,concat(0x7e,(select database()),0x7e),1) |
需要注意的是由于是Get传参,所以需要url编码一下
http header注入
登录后提示几个请求头的信息被记录,也就是插入数据库
使用bp抓包,选择刚刚的其中一个请求头,使用报错注入' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '
宽字节注入
宽字节注入只需在注入语句的引号前加上%df
远程命令/代码执行
ping
127.0.0.1 & ipconfig
eval
说实话这个靶场做的真的很一般,连关卡名称都能打错
提交phpinfo();
,可以查看该站点的phpinfo信息
文件包含
本地文件包含
测试一下页面,发现URL的filename中传入了文件
更改该文件名称,例如查看后台的配置文件../../../../Windows/System32/drivers/etc/hosts
当然也可以爆破同目录下的重要文件
远程文件包含
本关需要在小皮面板中打开远程文件包含的配置
不安全的文件下载
本关修改filename参数,通过目录遍历的方法可以下载到敏感文件
不安全的文件上传
client check
将一句话木马文件的后缀改为允许的jpg后上传,然后使用bp拦包修改后缀
MIME type
MIME检验在服务端
这一关同样可以使用bp抓包,要注意的是Content-Tyoe
应该是允许的类型
getimagesize
要绕过该函数的检测,我们可以伪造图片的16进制头部字符串,当然更简单的方法是将图片和php文件合成为一个图片
1 | copy test.jpg + test.php synth.jpg |
上传synth.jpg
,后续结合本地文件包含漏洞组合攻击
越权
水平越权
登录后查看个人信息,bp抓包后将username参数改成其他账号的用户名即可
垂直越权
抓一下管理员新增用户时的包,查看URI
退出登录后,切换成普通用户,使用刚刚的目录
目录遍历
使用../dir.php
,可以将上一级页面的内容展示出来
敏感信息泄露
查看源代码
登录后抓包,cookie中也泄露了很多