CTF—web题库笔记(难度2)

CTF—web题库笔记(难度4)

本篇文章共17道题,目录如下:

目录

1.baby_web

2.ics-06

3.inget

4.easyupload

5.fileinclude

6.fileclude

7.simple_php

8.weak_auth

9.disabled_button

10.cookie

11.backup

12.robots 

13.get_post

14.view_source

15.unserialize3

16.PHP2

17.Training-WWW-Robots


1.baby_web

题目描述:  想想初始页面是哪个

初始界面肯定想到index,直接访问index.php即可。但页面被重定向到1.php,F12打开开发者工具

2.ics-06

题目描述:  云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。

点击场景,首页如下:

除了报表中心,其他界面都没反映

看前端源码没有其他提示,只有一个参数id,第一想法就是sql注入,未果。后来知道是对id参数进行字典爆破, 这里利用butp-intruder模块进行爆破,为了方便展示,只导入了一个简单的测试字典,(首先配置浏览器代理—>burp拦截请求—>发送到intruder—>positions配置要爆破的参数及爆破模式—>payloads导入字典—>options可以设置并发数、超时时常等。最后通过比对length长度筛选爆破结果)

可以双击打开查看报文response,可以查看到flag

3.inget

题目描述:无

点击场景跳转看到提示,请输入id,并尝试绕过,这回是sql注入没跑了吧,既然是sql注入那就先简单的利用单引号、双引号、and、or等进行测试。例如:id=1'      id=1 and 1=1     id=1' and 'm'='m  等等。

因为是前几道都是简单的基础练习题,所以将id试到 id=1' or 1=1 %23    flag就出现了。

%23是#的url编码,#是mysql数据库中的注释符,可使#之后的sql语句失效。通常各数据库通用的注释符是-- (后面要加空格)。 

额外注:(url编码相关知识基础,url组成,ASCII编码,Unicode、UTF-8等编码,这些百度即可)

(我对url编码的理解就是:首先url编码中分三种字符,1.保留字符,2.非保留字符,3.其他字符。举例当url中的name=value传参时,想要value传输保留字符时,就需要url编码,否则会出现歧义,传输非保留字符时,直接传就行,也可以url编码,但编不编码没啥区别。传输其他字符如中文时,要先转换为UTF-8编码,然后对每个字节以%xx(xx是16进制)表示,例如:“蓝天计划”字符对应的UTF-8编码的16进制是\xe8\x93\x9d\xe5\xa4\xa9\xe8\xae\xa1\xe5\x88\x92,因此,它的URL编码是%E8%93%9D%E5%A4%A9%E8%AE%A1%E5%88%92。)个人笔记,见笑。

保留字符: ␣	!	#	$	%	&	'	(	)	*	+	,	/	:	;	=	?	@	[	]

回到题目,提到sql注入当然还可以使用sqlmap,而sqlmap的各种参数网上都有。

推荐:Sqlmap全参数详解 - 狼人:-) - 博客园 (cnblogs.com)

因为是get传参,所以用-u参数即可,-p参数指定要测试参数:

python sqlmap.py -u "http://61.147.171.105:65474/index.php?id=1" -p "id"

可见本题存在基于时间的盲注和union联合注入。 

 最终查取数据如下:

python sqlmap.py -u "http://61.147.171.105:65474/index.php?id=1" -p "id" -D cyber -T cyber -C "user,Id,pw" --dump

4.easyupload

题目描述:  一名合格的黑客眼中,所有的上传点都是开发者留下的后门

访问场景,很明显,具有文件上传功能,最直接的办法就是上传webshell。

文件上传简单的漏洞场景:前端js检验、检测Content-type字段,检测黑名单后缀不严等。而且根据不同的服务端操作系统特性、中间件等可以进行绕过或者配合文件解析漏洞、文件包含漏洞等组合getshell。

本题是我的知识盲区,我只是发现了后缀检测ph字符,内容检测php字符,合成的图片马上传是可以的,php文件不中,八成是文件头也检查了。然后采用常规的00截断、php后缀黑名单绕过,htaccess文件都白费,果断查看wp,官方讲:通过上传.user.ini以及正常jpg文件来进行getshell,可以参考以下文章:.user.ini文件构成的PHP后门 - phith0nhttps://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html

这里先来了解一下.user.ini文件,.user.ini文件是php.ini的补充文件,当网页访问的时候就会自动查看当前目录下是否有.user.ini,然后将其补充进php.ini,并作为cgi的启动项。虽然其中很多功能设置了只能php.ini配置,但是还是有一些危险的功能可以被我们控制,比如auto_prepend_file。(php.ini文件是web服务器php环境的核心的配置文件,它控制着一些重要功能的启用与否。)

先建立.user.ini文件如下:

GIF89a                  
auto_prepend_file=shell.jpg      

在建立shell.jpg文件如下:

GIF89a
<?=system('cat /flag');?>

文件头部的 GIF89a是为了绕过文件头内容检测,auto_prepend_file方法表示在php程序加载应用程序前加载指定的php文件,其作用相当于php代码 require 或 include,这两方法可以文件包含嘛,就是包含的文件不存在就报错,存在的话直就执行,不管你后缀是不是php,只有内容含有php代码就执行。

最后总结:1.检测Content-Type:可用burp拦截后用image/jpeg替换(就不上图了)。

                  2.检查后缀中是否有htaccess或ph:通过上述两个文件来getshell。

                  3.检查文件头部信息:利用图片文件头GIF89a绕过

                  4.检查文件内容是否有php字符串,这里有两中绕过方法,一个是将一句话木马里的php大小写绕过,如Php。(试过有效)

<?Php eval(@$_POST['password']);?>

还有短标签绕过

 <?=eval($_REQUEST[c]);?>

最后在连接webshell需要注意一个小事项,就是页面返回的上传路径并不是你的蚁剑、菜刀等工具连接时的路径。如果你的连接路径是http://x.x.x.x:端口/uploads/shell.jpg这样的话,是不对的。

 正确的连接url地址应为http://x.x.x.x:端口/uploads/index.php   (请回想.user.ini文件及auto_prepend_file方法)

最后在根目录下找到flag如下(但是flag提交显示不对,有点蒙,但是无所谓了)

5.fileinclude

注(这道题记录的是我自己的解题思路及过程,所以有点绕弯了)

题目描述:  无

访问场景如下,提示了网站根目录绝对路径,提示了flag存在flag.php中。

根据题目名字可知,基本上是个文件包含漏洞。ctf的提示很可能出现在前端代码的注释里,所以在做题前,f12瞧一瞧,robots.txt、login.php、admin.php等文件访问看一看。就像做数学题一样,不管什么题,先把解写上,肯定没错。

果然,f12或右键查看到提示的php源码。

 先将各方法百度一下,如下:

整段代码翻译一下有用信息:就是从客户端获取名为language的cookie值,当cookie存在时,则将其值与.php拼接后进行文件包含,不存在则包含english.php文件。所以要获取到flag就很清晰简单了。burp拦截请求,在请求头中增加cookie消息头,并将其language的值设置为  路径/flag就行啦,我刚开始是这么想的,因为要被文件包含的文件,相对路径或绝对路径起码要知道一个嘛,现在还不知道flag.php的路径在那里,但是通常都在网站的根目录下。所以我就试了一下language=/var/www/html/flag   如下:

报错是没了,但也没其他的反应,是我理解不对吗?还是文件不再该路径下,怀揣着疑问我又继续试了一下language=/var/www/html/index,结果是可以的。所以到这里我一直以为是我flag.php的路径没搞对,后来我才知道,想简单了,是需要利用php伪协议配合包含文件的。

php伪协议读取文件最常用的就是 php://filter。网上的payload很多,这里用到的是比较常用的payload:     php://filter/convert.base64-encode/resource=xxx.php    拿到base64后的flag

 baser64解密即可得到flag明文

 总结:还是那个输入了绝对路径没被成功包含的地方每太明白咋回事,可能是官方觉得这样的话太简单了吧,也有可能是我没理解对。不过用了php伪协议确实可以多了解了解新知识。(对于我来说)。在做第六题的时候,也是一道文件包含题,突然想起来了,文件包含内的php文件会被php解释器执行,所以不会显示源码。。。。。

6.fileclude

题目描述:  好多file呀!

访问场景首页如下:一段简单的php代码

翻译一下有用的部分:判断get方式url中变量file1和file2是否存在,都存在的话,在判断这俩变量的值是否为空,都不为空的话,继续判断file_get_contents($file2) === "hello ctf":三个等号是强判断,就是及既判断值得内容,还判断值得类型,都满足才为真,而file_get_contents方法,在百度上查说是将一个文件内容写到字符串中。

所以说我们只需要构造file1和file2两个参数,并让file_get_contents($file2) === "hello ctf"为真,从而包含file1即可。(我是垃圾)file_get_contents($file2) === "hello ctf"   一直想不到办法为真,这里引入php伪协议之php://input,(php://input 是个可以访问请求的原始数据的只读流。当请求方式是post,并且Content-Type不等于”multipart/form-data”时,可以使用php://input来获取原始请求的数据。还可用于执行php代码,)而读取flag使用我们php文件包含常用的payload:php://filter/convert.base64-encode/resource=flag.php

完整请求报文如下:并获取到base64的flag。小知识点,post请求方式也可在url中传参。

这道题没有说的很细, 重点还是在php的各种伪协议,我自己也不是很熟,flag解密后如下:

7.simple_php

题目描述:  小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。

访问场景首页如下:又是一段php代码,前几关的php知识点还是蛮多的。

直接翻译:文件高亮显示,文件包含config.php。接收 url中参数a的值给变量a,b的值给变量b。然后判断变量a是否等于0(双等号在php里面是弱比较,三等号是强比较),这个判断的意思是a不能等于0,因为o是flase,and要左右都为true,整个才为true,才能输出flag1,但是a的变量还要等于0,这不就矛盾了吗。峰回路转,上述提及的双等号弱比较是可以绕过,弱比较介绍:当两个不同类型比较时,会自动转换成相同类型后再比较值。相当于啥呢,举例如下:

if("admin"==0) //true
if("1admin"==1)//true
if("admin1"==1)//false
if("0e12324"=="0e1324")//true

再次解释举例内容:数字和字符串比较中,字符串转换成数字的过程中,会取字符串前面数字的值作为整个字符串转换成数字的值,比较“1admin”,转换成数字就是1,所以"admin"的话,因为字符串没有数字,只能转换成0了,所以if("admin"==0) 会是true。这里的admin换成任意字符都行。

在url构造参数a=admin即可获取flag1,截图如下:(这个弱比较也好,强比较也好,算是php的特性,他就是这么规定的,大家明白啥意思就行。) 

flag已经出来一半了,接来下获取flag2,使is_numeric($b)为flase,才能判断($b>1234),再为true就可以获取flag2了。is_numeric() 函数用于检测变量是否为数字或数字字符串,所以让b=2222b(前面的数字大于1234就可以),这时is_numeric($b)为flase,在判断($b>1234),而弱类型比较的"2222b"恒等于2222,所以($b>1234)为真,输出flag2如下:

8.weak_auth

题目描述:  小宁写了一个登陆验证页面,随手就设了一个密码。

访问场景首页如下:

这道题根据题目描述结合登录界面,八成就是利用常见用户名加上弱口令密码字典爆破,但是奈何我直接一手admin  123456直接拿下flag!!

对于web弱口令的爆破,常见的就是使用burp的intruder模块,当然网上或者github上也有一些其他的python脚本可以利用。我的话,我是用burp比较习惯的,爆破配置流程在本篇文章的第二题ics-06中有详细说明,至于更细节的burp—intruder模块及其他模块参数配置使用,网上有很多,在此就不介绍了。flag如下:

9.disabled_button

题目描述:  X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢?

访问场景如下:

界面中央有个提交框但是不能用鼠标点击,f12查看“元素”,也就是js渲染过后的前端代码,(右键查看源代码和f12查看元素还是有一些区别的,尤其是测试xss漏洞的时候),f12如下:

可以看到input标签中一些常见的属性name、value。type等,我们可能都有所了解,我横线上面的那个disabled 属性没见过,百度一哈:【disabled 属性规定应该禁用 input 元素。被禁用的 input 元素既不可用,也不可点击,直到满足某些其他的条件为止(比如选择了一个复选框等等),然后,就需要通过 JavaScript 来删除 disabled 值,将 input 元素的值切换为可用。注释:disabled 属性无法与 <input type="hidden"> 一起使用。】当然了,这是百度的解释。

对于咱来说直接在f12中删掉这个属性,就相当于解除了“禁用input元素”,就可以点击了嘛,获取flag如下:

10.cookie

题目描述:  X老师告诉小宁他在cookie里放了些东西,小宁疑惑地想:‘这是夹心饼干的意思吗?

访问场景如下:问我知道啥是cookie嘛。

这道题比较简单,在此之前先简单说一下http协议、再去拓展一下cookie,session,token是什么东西。http协议就是浏览器到资源服务器之间相互通信的规定,双方约定成俗的规则。而http协议又是无状态的,客户端浏览器对服务端的每一次访问之间不存在联系。那么问题来了,总不能每一次客户端的请求都要证明自己是自己吧,所以这里就要引入cookie的概念,用cookie来管理用户的状态,通过cookie让服务端知道这次客户端的请求到底是那个用户发出的,以及当前用户的其他的状态等等。这个cookie是服务端生成的,内容是一小段文本。当登录成功后会通过set-cookie返回给客户端并存储在客户端浏览器的某个文件夹下,这样浏览器的每次请求会自动带上这个cookie。那么,session和token又是什么呢(擦,自己百度吧,我怕我的理解不是很准确,影响到刚好没这块基础的同学就不好了)。

回到题目,f12打开开发者工具,查看当前域下的cookie有两种途径,拿win自带的浏览器来说,可在f12—>应用程序—>左侧的cookie,就可以找到当前域下的cookie了,如下图:可看到当前的cookie值是cookie.php,也是这道题的提示。

第二种方式就是在f12后,打开connect控制台 ,输入document.cookie即可,如下图:

不过此种方法在cookie设置了httponly属性的时候是不可以获取的。因为httponly属性可以防止通过js脚本读取到cookie信息,可防止xss攻击。具体用法百度。

 在得到了cookie.php的提示后,访问一下看看:

又提示我们去看response,response在f12的网络处可查看,得到flag。本题虽然简单,但是可以从中了解到一些其他的知识点,还有各浏览的f12灵活运用。知识都是一点一点积累的嘛。就像打麻将一样,屁胡也是肉啊。

11.backup

题目描述:  X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧!

访问场景如下:

 一手百度,常见的网页备份文件后缀名,粘贴回来如下:

“.git” 、“.svn”、“ .swp” “.~”、“.bak”、“.bash_history”、“.bkf”、“.zip” 

最后试到bak拿到flag如下:

12.robots 

题目描述:  X老师上课讲了Robots协议,小宁同学却上课打了瞌睡,赶紧来教教小宁Robots协议是什么吧。

访问场景直接访问robots.txt, 如下:

看到提示f1ag_1s_h3re.php,访问即可获取flag。但是在此简单介绍一下robots.txt文件的作用,它其实就是指robots协议也叫爬虫协议,大概意思就是,我这个robots文件规定的我网站的那些文件可以被别人的爬虫通过搜索引擎爬取,那些文件是不让你爬取的。至于robots文件存在的意义啊、它的写法吖,俩字,百度!!

13.get_post

题目描述: X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗?

访问场景如下:

 get方式直接在url中传参即可,所以如下图:

又提示要用post方式传参b,且b等于2,post传参的话是要放在请求体里面的,(其实post也可以在url中传参,这里不谈这个。)我们要构造一个post请求的数据包,因为比较简单所以不需要上burp,直接在浏览器中操作即可,我平常用火狐,安装个hackbar插件非常方便。但是最近我发现微软的浏览器Microsoft Edge 也可以进行数据包编辑重放,如下图:打开f12,点击网络,找到要编辑重放的http请求,右键编辑并重新发送,这个请求会被转到网络控制台。

 接下来我们在网络控制台中进行编辑重新发送数据包,如下图:就不解释了,都在图里,随后点击send发送。

 然后再回到网络中即可看到编辑后重新发送的数据包,看到flag。

14.view_source

题目描述:  X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。

访问场景如下,右键不好使没反应,看不到前端源码。

 这里还是直接f12查看源码,获取flag如下图:

之前在网上搜索资料的时候,遇到过这么一种情况,可能大家也遇到过。就是我们需要复制当前网站页面的部分内容,但它提示我们要办个会员,本着白嫖的原则,通常就f12在源码中复制出来,可是某一次确实遇到了f12没反应,右键没反应的情况,这时候不要慌,还有一招,如下图:

15.unserialize3

题目描述:  暂无

访问场景如下:

 题目源码就几行,重点就是__wakeup方法,很显然,我么见过,百度起手!

百度说:__wakeup()方法经常用在反序列化操作中,在执行unserialize()时,先会调用__wackup函数,而unserialize()是用于反序列化的,那么啥是反序列化呢。先解释序列化,通俗的讲,就是将对象的状态信息转换为可以存储或传输的形式的过程,那啥是对象呢,就不延伸了,在说反序列化,就是将对象经过序列化后的“东西”再转回成对象,此处我把这个“东西”理解成字符串,也不到对不对。接下来再说php序列化后的格式。

以上面这个图片举例,O是对象的意思,+4表示对象名字的字符串长度,Demo表示序列化类的名字,2表示属性的个数,{}表示属性列表,s表示属性类型为字符串类型,10表示属性名字长度,紧跟着后面那个是属性名字,第二个s代表属性值的类型,8代表值的长度,最后一个就是属性的值喽。

再次回到题目,说了这么多序列化,想要拿到flag肯定是要靠反序列化了。最上面代码的类名叫xctf,属性叫flag,上述也说到了在执行unserialize()反序列化时,先会调用__wackup函数,假如调用了__wackup函数就会执行exit('bad requests');就退出程序了嘛,所以我们要绕过__wackup函数。百度回来了,将上面图片数字为2位置的值换成大于实际的属性数量的值就可以绕过__wackup函数。对,上述图片就已经是绕过的了。不过不对应这道题而已。至于绕过的原理,问,那就是已知条件。

接下来开始构造反序列化后的字符串如下:

O:4:"xctf":2:{s:4:"flag";s:3:"111";}

这道题而言可以手动构造序列化后的字符串,是没问题的,因为其中没有特殊字符。 但要强调一下,最好不要用手动去生成反序列化字符串,因为有一些字符是不可见的,要用php程序序列化出来的才是万无一失的。这是一道让咱们了解php序列化的基础题,以及对__wackup函数的认识。这道题我是没有解题思路的,所以我也是照别人的wp弄出来的,确实菜吖....

最后把O:4:"xctf":2:{s:4:"flag";s:3:"111";}给到url中的code参数即可获得flag。base64或者Unicode编个码传也都是可以的。

16.PHP2

题目描述:  暂无

访问场景如下:F12没提示,首页访问也没提示,所以“御剑”(扫描目录和文件的工具)搂一圈再说

狗屁没扫到,如下图:

看了wp,棋差一招,访问文件index.phps出源码,但我的字典里没有。。。服了  。直接把源码放在默认首页不一样吗。php源码如下:

源码判断get参数id是否等于admin,php三等号是强比较,就是值一样,值的类型也要一样才为真。看题目的意思首先要绕过它,然后再将参数id的值进行一次url解码,再次判断id的是否等于admin,这回是弱比较,弱比较的绕过在本文的第八题有说道。复制过来了一小段方便阅读:

弱比较介绍:当两个不同类型比较时,会自动转换成相同类型后再比较值。相当于啥呢,举例如下:大家要是遗忘了,可回到第七题,说的比较的明白。

if("admin"==0) //true
if("1admin"==1)//true
if("admin1"==1)//false
if("0e12324"=="0e1324")//true

继续回到题目,说到这里有点抱歉,之前的几个强弱类型比较并不是本题的重点,可能被我的主观思路带偏了,这道题考的就是url编码知识,浏览器在发送http请求时会自动对url进行一次url编码,等服务端接收到请求时又会进行一次解码,此题不过是多了一次对参数id的url解码,所以我们刚好用2次url编码id的值,也就是2次编码admin,然后发送请求。可以拿到flag。http请求流程如下:

首先admin的第一次url编码是%61%64%6d%69%6e,这里要注意一点,因为admin是正常字符,是非保留字符,所以你用urlencode编码后还是admin,没有效果。这是正常的。大家可以回顾到本篇文章的第三题,对url编码做了一个详细讲解。那么对于这个admin想要url编码要怎么办呢,第一步,要先转换为UTF-8编码,然后对每个字节以%xx(xx是16进制)表示。举例:例如:“admin”字符对应的UTF-8编码的16进制是\x61\x64\x6d\x69\x6e,因此,它的URL编码就是%61%64%6d%69%6e,它第二次url编码就可以在此基础上直接urlencode编码转换了,转换后是:%2561%2564%256d%2569%256e

utf-8转16进制在网址:UTF-8转16进制计算器 - 计算专家 (jisuan.mobi)

 整个http请求流程如下:我们2次编码转换完成后,通过浏览器发送http请求http://x.x.x.x:xxxx/index.php?id=%2561%2564%256d%2569%256e,这时服务端收到请求自动进行一次url解码,此时id的值为%61%64%6d%69%6e,开始判断,结果不等于admin,所以继续下面的第二次解码,这回为admin,再次判断admin==admin为真输出fag,截图如下:

 这道题坑人的地方还有一点,访问index.php没有源码不说,要访问index.phps,但是最后获取flag却又要用回index.php,真是头大。

17.Training-WWW-Robots

题目描述:暂无

访问场景如下:

 这道题跟第十二题重提了,讲的也是robots文件作用。访问robots.txt如下:

直接访问f10g.php即可获取flag,至于文件内容语义,我是看一次忘一次,次次都百度。

好啦,至此8月30日为止ctf难度1的基础题完工,难度1要是以后有新出的题到时候再回来更新,开始进击难度2的题目啦。链接在首页。

Logo

助力合肥开发者学习交流的技术社区,不定期举办线上线下活动,欢迎大家的加入

更多推荐