0x00 信息收集
web1
直接查看源码
web2
查看不了源码,抓包即可看到(JS拦截了F12)
web3
抓包,发送repeater,在响应包中有Flag字段
web4
题目提示后台地址在robots,访问/robots.txt看到Disallow: /flagishere.txt访问即可
web5
phps源码泄露,尝试访问/index.phps(或者扫描)
phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。
web6
工具扫描或者访问/www.zip,此题需要多熟悉各种源码下的目录结构
web7
hint:版本控制很重要,但不要部署到生产环境更重要。
这题需要了解git或者svn等版本控制软件的使用。访问/.git即可
.git是git这个软件在本地初始化的一个隐藏文件,代码修改后第一次提交是提交到.git文件夹内,再push才是提交到远程管理仓库等,如果配置不当,直接将 .git文件加载到线上环境,这样便引起了.git文件泄露
web8
同样也是考察版本控制,访问/.svn即可
当开发人员使用 SVN 进行版本控制,对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN泄露漏洞
web9
hit:发现网页有个错别字?赶紧在生产环境vim改下,不好,死机了
考察的是使用vim编辑时,突然中断退出,会生成一个文件.swp,访问/index.php.swp直接用sublime打开得到flag。
这个文件是一个临时交换文件,用来备份缓冲区中的内容。如果原文件名是data,那么swp文件名就是.data.swp。如果文件正常退出,则此文件自动删除。需要注意的是如果你并没有对文件进行修改,而只是读取文件,是不会产生swp文件的。
web10
cookie 只是一块饼干,不能存放任何隐私数据
F12--存储--cookie的flag字段中
web11
域名其实也可以隐藏信息,比如flag.ctfshow.com 就隐藏了一条信息
web12
有时候网站上的公开信息,就是管理员常用密码
robots.txt发现disallow:/admin/
访问xxxxxx/admin/出来弹框,输入用户名admin,密码在网页最下方
robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。
web13
技术文档里面不要出现敏感信息,部署到生产环境后及时修改默认密码
发现网页底部的document是可以点击的,点击发现是一个文档(系统使用手册)内含敏感信息。
web14
有时候源码里面就能不经意间泄露重要(editor)的信息,默认配置害死人
小0day:某编辑器最新版默认配置下,如果目录不存在,则会遍历服务器根目录
根据提示,源代码中搜索editor,可以发现
这一题考察的是源码中的敏感信息——目录
img标记中的src属性会暴露出图片的目录,如果图片没有单独存放在同一个文件夹中,则可能会暴露出敏感的目录名
这一题比较考验眼力,/upload一般是文件上传的文件夹,且别的图片都不在该目录下!
访问xxxx/editor/upload——》403Forbidden
访问xxxx/editor:
这里应该考察的就是编辑器的一些漏洞了,查找编辑器版本:kindeditor4.1.11,查找相关漏洞
kindeditor上传漏洞复现(CVE-2017-1002024)
我感觉这才web14,不会出这么复杂吧,查看wp,好像没那么复杂,不过也和文件上传相关
回形针一样的图标那里存在BUG,竟然可以查看根目录,访问/var/www/也就是网站根目录
/var/www/html/nothinghere不是此地无银三百两嘛(fla000g.txt)
访问/nothinghere/fl000g.txt得到flag
web15
公开的信息比如邮箱,可能造成信息泄露,产生严重后果
访问xxx/admin竟然出现后台登录页面
在哪个城市:西安(邮箱暴露了QQ),可疑修改密码得到flag
web16
对于测试用的探针,使用完毕后要及时删除,可能会造成信息泄露
PHP探针:
php探针是用来探测空间、服务器运行状况和PHP信息用的,探针可以实时查看服务器硬盘资源、内存占用、网卡流量、系统负载、服务器时间等信息。
默认的雅黑探针:访问/tz.php
点击查看PHP信息 发现FLAG字段中存在flag
web17
备份的sql文件会泄露敏感信息
一开始访问sql.bak没反应,查看WP发现是backup.sql
web18
不要着急,休息,休息一会儿,玩101分给你flag
太难玩了,直接查看源代码,发现js文件(一般这种玩游戏的题目都会和js有关)
肯定和这行代码有关:
直接复制到控制台
访问/110.php得到flag
web19
密钥什么的,就不要放在前端了
说明密钥就在前端,查看源代码,可疑:
pazzword尝试了base64和DES都没解出来,直接抓包更改密码:
web20
mdb文件是早期asp+access构架的数据库文件,文件泄露相当于数据库被脱裤了。
这一题主要是体验一下以前的文件泄露方法,现在很少见到asp+access架构了
直接访问/db/db.mdb,使用notepad++打开即可
总结
1、在源码中可以搜集,若不能F12可以通过抓包,再抓包的时候flag可能藏在响应包的Flag字段;
2、后台地址可以通过访问/robots.txt得知浏览器第一个爬的页面可以知道哪些文件不被允许查看,还可以访问/admin可能就到了后台的登录页面;
3、phps源码泄露可以访问index.phps查找有用信息,此外要熟悉各种源码的目录结构;
4、考察git和svn版本控制,可能存在泄露;(访问/.svn或者/.git)
5、cookie中可能存在重要信息;
6、有时候网站上公开信息要注意,比如QQ/邮箱/技术文档/源码中一些路径信息都要注意;
7、PHP探针会造成信息泄露,一般默认路径是/tz.php;
8、备份的SQL文件/源码中的JS都要注意。
0x01 爆破
web21
题目自带爆破字典dic.zip
弹出登录框,输入admin/123456后抓包发送到repeater:
使用burp自带解密(base64):
可以authorization包含了“用户名:密码”,使用BP载入字典
添加前缀“admin:”(熟练使用burpsuite)
加编码:base64
去掉√:因为有“=”,base64自带等号,不能让=编码
设置完成后开始爆破,爆破的时候可以不断点击status排序,如果不是401可能就是我们想要的结果了。
or:
web22
考察子域名查询:
域名更新后,flag.ctf.show域名失效,内容是flag{ctf_show_web}
web23
还爆破?这么多代码,告辞!
<?
error_reporting(0);
include('flag.php');
if(isset($_GET['token'])){
$token = md5($_GET['token']);
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
echo $flag;
//substr(字符串,开始位置,个数)
//intval()函数可以获取变量的整数值,常被用来进行数据类型转换,将字符串类型的变量转换为为整数类型
}
}
}else{
highlight_file(__FILE__);
}
?>
根据所给代码写脚本:
<?php
$i=0;
for($i;$i<10000;$i++){
$token = md5($i);
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
//echo 'token= '.$i.' md5= '.$token;
if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
echo 'token= '.$i.' md5= '.$token;
}
}
}
?>
//满足条件的:
token= 422 md5= f85454e8279be180185cac7d243c5eb3
token= 1202 md5= 147702db07145348245dc5a2f2fe5683
web24
<?php
error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(372619038);
if(intval($r)===intval(mt_rand())){
echo $flag;
}
//生成一个随机数种子判断r和随机数种子是否一致
//随机数种子设置:只要种子是相同的,那么生成的值就是一样的
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
?> Linux version 5.4.0-135-generic (buildd@lcy02-amd64-066) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #152-Ubuntu SMP Wed Nov 23 20:19:22 UTC 2022 Linux version 5.4.0-135-generic (buildd@lcy02-amd64-066) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #152-Ubuntu SMP Wed Nov 23 20:19:22 UTC 2022
# PHP中生成随机数的函数有rand()和mt_rand(),它们分别对应srand()和mt_strand()两个用于播种随机数种子的函数
测试:
<?php
mt_srand(372619038);//只要种子是相同的,那么生成的值就是一样的
echo intval(mt_rand());
?>
尝试提交?r=999695185,提交后发现是没有回显,这个和PHP版本有关,换成PHP7(小皮——网站——管理——PHP版本)
提交?r=1155388967
考点:同一个随机数种子生成的随机数序列是一样的,和机器无关(虽然它是在服务器生成,我是在本机生成,但是只要种子一样,生成的随机数种子就是一样的)。
在日常开发中,一般不设置固定值种子,建议如果要设置的话就跟时间相关,这样可以保证更随机。
web25
<?php
error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(hexdec(substr(md5($flag), 0,8)));//hexdec() 函数把十六进制转换为十进制
$rand = intval($r)-intval(mt_rand());//如果r=0,那么值就是负的第一次的随机数
if((!$rand)){ //r要和mt_rand()相等就可以输出flag
if($_COOKIE['token']==(mt_rand()+mt_rand())){
echo $flag;
}
}else{
echo $rand;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
Linux version 5.4.0-135-generic (buildd@lcy02-amd64-066) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #152-Ubuntu SMP Wed Nov 23 20:19:22 UTC 2022 Linux version 5.4.0-135-generic (buildd@lcy02-amd64-066) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #152-Ubuntu SMP Wed Nov 23 20:19:22 UTC 2022
mt_srand()是伪随机,通过分发种子,如果有种子的话,生成随机数的值也是固定的,生成的值也和php的版本有关
此题没有明确的给出种子,需要自己爆破(爆破随机数种子要用到php_mt_seed这款工具,在kali中安装)
$rand = intval($r)-intval(mt_rand());//如果r=0,那么值就是负的第一次的随机数
?r=0,就会得到第一个随机数1979052344
知道随机数要爆破随机数种子,用工具php_mt_seed
可以看到php3-php5没有找到随机数种子,从上一题知道应该是PHP7
seed = 0x0e8c5fc8 = 244080584 (PHP 7.1.0+)
<?php
mt_srand(0xd951c381);
mt_rand();//第一次生成的随机数
echo mt_rand()+mt_rand();//返回第二次和第三次生成的随机数之和
?>
将第二次和第三次生成的随机数之和写入cookie
web25没做出来,具体不知道哪出问题了?
web26
什么都不填,直接抓包:
至于为什么什么都不填就可以造成数据库连接成功,应该是写代码的时候代码的逻辑问题,此题也可以像web21一样使用burp爆破
web27
发现有一份录取名单,还有一个学时信息查询系统,可以根据此系统查询+名单得到线索
身份证六位被隐藏(出生年月),很明显可以用burp爆破,选择高先伊试一下
估摸着差不多1995-2006年这个范围去爆破一下,哎,burp线程调不了,换了个,这个爆破出来就行了。
此外h1xa师傅还写个个python脚本(生成合法身份证号码),用了校验和可以排除非法的身份证号码提高效率:
<?php
$card=array();
//生成所有的从1990年到2000年的身份证号码
for($y=1990;$y<2000;$y++){
for($m=1;$m<13;$m++){
if($m<10){
$m='0'.$m;
}
for($d=1;$d<32;$d++){
if($d<10){
$d='0'.$d;
}
array_push($card,'621022'.$y.$m.$d.'5237');
}
}
}
//这个函数是根据身份证最后面1位的校验位来算是否是合法身份证,如果不是合法身份证可以通过这个函数来剔除
function checkCard($c){
$list=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];//定义一个数组里面有不同的权值,这个是每一个位数的权重,顺序是不能乱的
$crc=[1,0,'X',9,8,7,6,5,4,3,2];//有一个校验码,每个人身份证的最后一位就是在十一个数字之内
$ca=str_split($c);//接收到c,将c拆分为数组
$sum=0;
for($i=0;$i<count($ca);$i++){
$sum+=$ca[$i]*$list[$i];//每个数组拿出来以后,和它的权重相乘,比如身份证第一位*7...,两两相乘求和
}
$crc_ =$sum%11;//取余之后得到最后一位的值,和传入的身份证最后一位进行比较,如果相等说明校验通过,否则false
if($ca[count($ca)-1]==$crc[$crc_]){
return true;
}else{
return false;
}
}
//被刚才所有的身份证号进行校验和的验证,拿到合法的身份证号码
foreach($card as $c){
if(checkCard($c)){
echo $c.'<br>';
}
}
?>
返回值是jason,直接在console台弹框就可以解码:console.log("....")
web28
这个URL看着就古怪
这里0和1比较可疑,url后面不管输入什么都会跳转到/0/1/2.txt这个页面,接下来抓包
txt文件是固定的,改的话不好改,作为一个靶场环境肯定是动态环境,我们可以把2.txt删除,访问默认文件index.php
加入结束符:ctfshow
可以爆破知道:/72/20/index.php