view_source
此题我愿称之为网安领域的hello world
查看网页源代码的方式一般有——
- 右键->查看网页源代码
- F12->源代码/来源
- Ctrl+u
随后可以再代码第17行处找到flag,至此迈入网安第一步。可喜可贺,可喜可贺...
get_post
考察http的两种请求方式,一种是get方式,一种是post方式
get的提交方式为,在网页的URL后面写个英文问号,然后写变量表达式,如下:
提交完成后页面会更新并多一句话提醒用post方式提交变量b,这时候需要借助hackbar插件了(读者请自行查阅资料完成插件的安装)
弄好插件后用快捷键F12进入开发者模式 ,如下:
把该网页的URL复制到(可以直接点LOAD)HackBar中的URL栏中,打开【Use POST method】这个开关,随后在Body中输入b=2,最后点击【EXECUTE】即可刷新页面并获得flag
robots
robots协议_百度百科 (baidu.com)
百度百科:robots协议也称爬虫协议、爬虫规则等,是指网站可建立一个robots.txt文件来告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,而搜索引擎则通过读取robots.txt文件来识别这个页面是否允许被抓取。
简单来说,我们知道网页其实就是服务器下的一个个文件,robots.txt就是其中之一,因此根据提示先直接去访问robots.txt这个文件,看看能有什么新线索。访问方式就是在网页的URL后面加上/robots.txt
发现新页面是如下三行
- 第一行的User-agent: * 这里的*代表的所有的搜索引擎种类,*是一个通配符
- 第二行的Disallow: 后面无内容。
- 第三行的Disallow: f1ag_1s_h3re.php,表示禁止搜索引擎爬虫访问名为f1ag_1s_h3re.php的文件
通过访问robots.txt这个文件,我们获取到的线索就是该服务器下还有一个文件叫f1ag_1s_h3re.php,所以下一步就直接再去访问这个文件即可,就像刚刚访问robots.txt那样做(别忘了回到原来的父路径)
访问后页面刷新,获得flag
backup
这题让找备份文件,打开靶场后提示找的是index.php的备份文件,这样就获得一个线索,要知道,备份文件的名字就是在原文件的名字加上后缀,备份文件有以下几个常用后缀:
.git .svn .swp .~ .bak .bash_history .bkf
因此第一种思路就是枚举去尝试访问index.php.git,index.php.svn...等等这些文件,当试到index.php.bak的时候,网页会自动下载这个文件,说明试到正确答案了
我们用记事本打开它,可以轻松拿到flag
仅仅是这样的话就太浪费这题了,交完flag后回来复盘
这题其实可以通过kali(没装kali?见本篇->linux的kali安装,换源,更新包-CSDN博客)的工具dirsearch对该网页进行一个路径扫描,一扫就知道这个网页路径下有什么文件了
使用命令【dirsearch -u URL】对指定路径进行扫描,进度到60%左右时会出现index.php.bak(这时可以Ctrl+c提前结束扫描),证明该路径下确实有这个文件,然后进行访问即可
(笔者是finalshell连接的kali系统,用起来会比较顺手)
cookie
按F12键进入开发者模式,在【应用】中找到Cookie,可以看到名为【look-here】的项,其值为cookie.php,因此线索为该路径下存在此文件
理所应当地去访问一下这个文件,页面刷新了,提示去看http response,就去【网络】中找到【标头】,在响应标头中能找到flag
disabled_button
题目描述提到“前端知识”,给出这题的线索应该是和前端代码有关,打开靶场,一句话加一个按钮,点了点发现按钮确实按不了
那么F12进入开发者模式,点一个这个我用绿色框框起来的【选中】按钮后把鼠标移动到按钮位置,这样做可以快速定位这个按钮的代码位置
代码被定位到了下面绿色框起来的位置,发现它是一个表单,把它展开仔细观察,发现其存在一个属性【disabled】,这个属性会使该元素不可交互,这就是按钮不可按下的主要原因了
把disabled属性删除,按钮就能按了
按下按钮,轻松获得flag
(怎么说呢,这题有点小学初中那会玩史上最坑爹的小游戏的既视感??啊)
simple_js
这题的难度相对于其它的题目都显得有点高,比较吃做题人的经验,经验不足就会手足无措
首先打开靶场,测试了几下,发现确实如题所说,不管什么密码,结果都提示这个
这时就应该换个思路,比如去看看网页源代码、cookie、http response...等等,找找线索,显然在源代码中我们能提取到不少信息
说实话笔者写这里时也只是个ctf小白,不是很能看懂这个代码,但能根据一点编程经验猜个大概
主要是由一个自定义函数dechiffre(红框部分)和3行代码(绿框部分),函数在未调用时不会起作用,所以先从绿框的3行代码入手
第22行代码:
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
这行代码先调用上面红框自定义的dechiffre函数,传入一个字符串(看这个字符串的格式大概猜得到是16进制编码),dechiffre函数会经过它的逻辑后返回一个字符串A,然后String["fromCharCode"] 函数(JavaScript的API)把字符串A转换为字符串B,除此之外这行代码似乎并没有对其它什么参数有造成影响??那就先放着...吧
第24行代码:
h = window.prompt('Enter password');
这行代码调用一个名为window.prompt的API,其作用是指示浏览器显示一个对话框,用来提示用户输入一些相关信息,也就是打开靶场后显示的这个密码框
接下来的逻辑是把用户输入的密码赋值给变量h,这就是第24行代码的所有作用了
第25行代码:
alert( dechiffre(h) );
这行代码调用alert函数,把其中的参数作为“警告”提示在屏幕,而所谓的参数是通过调用函数dechiffre(h)来获得的一个字符串
自此我们终于理清楚了调用链:
首先调用dechiffre(h),h来自用户输入,然而我们只用稍微看看dechiffre函数的逻辑就能明白,它返回的字符串跟传入的这个h参数根本没关系,而是固定返回一个字符串FAUX PASSWORD HAHA,所以不管输入什么密码,最后显示的结果都是这句话
到了这步,其实仅仅是把这个网页所谓的“bug”给理清楚了,但似乎对解题依旧没什么进展?
所以还是得换换思路,多写几道ctf题目其实不难总结出经验,所谓的flag就是被出题人藏在各种地方,但不一定以明文的形式展示,也可能是密文
而这题的flag就被藏在源代码中的第22行,甚至可以说其它都是无关信息,这一大串的十六进制编码就是密文形式的flag,需要做题人自行想办法去解码
因此接下来的工作就是写一个脚本去解码,写这种脚本最好是用python而不是c、c++等,后者会很麻烦,随便一个字符串转整数就要写一大段算法代码,难顶...
接下来是脚本的编写教学,不想看的自行跳过即可——
①首先把这串十六进制编码打印出来,python识别到非十进制格式的编码时,会自动转成十进制输出,因此得到以下结果:
②通过输出的结果,合理猜测这是一串ASCII编码,我们将其转为对应的字符,或许就能拿到flag但也得进行一些相应的操作,首先把原字符串按逗号分割成字串,得到对应的列表,这里再把列表也打印一下验证正确性
③循环遍历列表list,对于每个元素,采取两次类型转换,先转为整型(int),再转为字符型(chr,python的字符型是chr而不是char),即可获得编码对应的字符,所有字符连在一起,组成了本题的flag,按题目要求的格式把flag包裹起来提交即可
Cyberpeace{786OsErtk12}
完整脚本:
str = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"
print(str)
list = str.split(',')
print(list)
for i in list:print(chr(int(i)), end='')#对每个元素,先转int再转chr后输出,print以空字符连接下次输出(不换行的意思)
xff_referer
百度百科:
X-Forwarded-For_百度百科 (baidu.com)
HTTP_REFERER_百度百科 (baidu.com)
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
简单理解:
xff用来记录用户真实ip以及代理服务器的ip。 referer用来记录当前网页是从哪个链接过来的。 以上两个属性都是可以伪造的!
打开靶机,页面显示说“ip必须来自123.123.123.123”
因此第一步去构造xff:
【F12】进入开发者模式->【HackBar】->【LOAD】把当前URL加载进插件->
【MODIFY HEADER】修改头部,这里先按要求伪造一个xff,值为123.123.123.123->【EXECUTE】发包后,可以看见页面刷新,新的信息显示“必须来自https://www.google.com”
因此第二步去构造referer:
【MODIFY HEADER】修改头部,这里按要求构造一个referer,值为https://www.google.com->
【EXECUTE】发包后,可以看见页面刷新,获得本题flag
weak_auth
weak auth是弱口令、弱认证的意思,打开靶机显示的是一个登录页面
先尝试性地随意输入一个账号密码,结果显示“please login as admin” ,即让我们用admin作为账号去登录
现在知道账号是admin了,那密码呢?不知道,但是题目提示我们了是“弱认证”,即密码安全性极低,因为我们采用字典爆破,把正确密码试出来:
①开启burp代理,使用burp抓包,admin是账号,先随便输入一个密码
②右键【Send to Intruder】,使用burp进行爆破的操作
③选中密码的文本(选中文本时要注意,burp似乎有点错位,选中的与实际相比,前面少一个字符后面多一个字符,所以选中文本过程要注意一点。。。)->【Add】添加需要爆破的position
④【Payloads】->【Load ...】把本地备好的字典(网上随手一搜有一堆)加载进burp
⑤按下【Start attack】开始爆破
⑥把结果按照【Length】倒序排列,发现密码为123456的回复包的长度最长,说明有问题,查看Response,获得flag
⑦也可以回到靶场,【账号:admin 密码:123456】,登录后页面刷新,获得flag
command_execution
百度百科:WAF_百度百科 (baidu.com)
Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
打开靶机,显示的是一个具有ping功能的页面
随意ping了一下比较简单的地址,这里通过显示的信息可以得知,该靶场基于Linux操作系统
本题题目描述说没有waf,可以理解为对于用户的命令不作安全性判断,借此可以利用Linux的管道符命令语法进行命令拼接,原理介绍:
在管道符左边的命令结束后,会将左边命令的结果作为输入,立即执行右边的命令,例如这边的ls,是指列出当前目录的文件夹和文件
因此利用这个语法特性,去进行命令拼接,查看靶机的工作目录下存放了哪些文件,由此获得线索
输入【ping w | ls】命令,这里的w是什么根本不重要,我们的目的是借助管道符拼接其后的命令【ls】,可以看见有名为【index.php】的条目被列举出来
顺理成章地去访问一下此文件,发现页面刷新了一下,但内容没变,看来flag被藏在其它目录下,我们直接借助find函数去全局查找含有flag字样的文件
如法炮制,输入命令【ping w | find / -name "*flag*" 】
find后面的/意味根目录,linux系统中根目录是最高级的父目录,-name表示按名字查找指定文件,"*flag*"即名字中含有flag的文件,可以看到查找结果中显然是第一个【/home/flag.txt】最有可能是我们的目标文件
再次拼接命令,这次我们要访问【/home/flag.txt】这个路径的文件,
输入命令【ping w | cat /home/flag.txt】,这里cat的作用是访问文件
访问结果拿下flag
simple_php
本题考察简单php代码分析,打开靶机就是一段php代码
下面是代码分析:
<?php
show_source(__FILE__);//将当前文件的代码显示出来
include("config.php");//加载自定义配置文件
$a=@$_GET['a'];//get方式传入的参数a将赋值给变量$a
$b=@$_GET['b'];//get方式传入的参数b将赋值给变量$b
if($a==0 and $a){echo $flag1;//重点1:如果$a弱等于0并且$a为真,将输出$flag1
}
if(is_numeric($b)){exit();//如果$b是数字,程序将直接结束
}
if($b>1234){echo $flag2;//重点2:如果$b大于1234,将输出$flag2
}
?>
分析完代码后可以得出:get方式传入一个参数a,a要满足本身为true且a弱等于0,查看php弱相等表:php比较运算,强相等(===)弱相等(==)表-CSDN博客
因此我们先传入一个a="任意字符串"即可,传参方式为在URL后面输入【?a="xxx"】,可以看见传参后页面显示出了flag的前半部分
接下来是b的参数,分析得出b不能是数字,否则会进入第二个if逻辑导致程序直接结束,又要满足b大于1234,进入第三个if逻辑,获取下半的flag
必须输入一个字符串绕过第二个if逻辑,然后涉及到字符串的类型转换,见本篇string类型转整型(int)或者浮点型(float/double)->php基础学习之数据类型-CSDN博客
因此我们输入【&b=1235a】即可(同时提交多个变量,用&符号连接),"1235a"本身被php识别为字符串,在与1234进行比较时,进行类型转换,1235a变为1235,1235>1234,条件为真,输入第二段flag,与第一段flag组成本题flag