0xCTF web题 writeup


最近开始接触CTF,主要是web方向,作为一个小白,遭受了各种社会的毒打,好在有大佬指路,勉强能解出些题来,这篇博文主要写写0xCTF中题目的writeup.

1.soeasy

1

这个题还是蛮简单的,查看源码,稍微找找就能得到flag

稍微总结一下查看源码的方法吧:

a.鼠标右键,点查看源代码

b.F12

c.Ctrl+shift+I

d.ctrl+U

e.在网址前面加上view-source:(火狐反正支持这种方式)


2.GET

image-20200705165429119

稍微判断一下这是一个通过Get方式传参的问题(如果不了解的话提前去了解一下PHP语言,熟悉一下基本语法)

Get方式传参直接在URL后面写上参数并为其赋值即可,本题要传的的参数为0x,值为0xfxxker,故在网址栏应该这么写:

image-20200705165907235

回车一下就得到了flag.


3.POST

image-20200705170036059

本题考察的是POST方式传参,我是用火狐插件hackbar来解的(关于hackbar的下载安装并不难,不必装最新版,最新版需要付费,下个旧版就行了,然后关闭自动更新。具体去百度一下)

F12查看源码,然后点Hackbar, laod URL,勾选post date,在下面的框里输入参数并为其赋值,点击Execute就能成功传参,然后flag就有了

当然,用Burpsuit也一样能做,在这不赘述了

image-20200705170922230

4.XFF&Referer

打开页面只有一句话“只有本地IP才能访问”,刷过攻防世界的新手区的题的话应该会有印象,其实就是伪造一个Ip,然后就可以了

首先利用Burpsuit抓个包,右击发送到repeater,然后在header里面Add一个新的头:X-Forwarded-For , 值为127.0.0.1

image-20200705171807465

点击send(貌似大部分版本是go,小事小事),这时候看右边的响应,多出来一句话“必须来自于:http://0xctf.ctf

这时同样的方法,在headers中再添加一个名为Referer的头,值为http://0xctf.ctf,send一下,响应中就出现了flag

image-20200705172430570

5.ezmd5

image-20200705173020907

核心是那个if 语句,它要求参数a,b 的值相同但是MD5相同,这里可以利用绕过。(绕过蛮有意思的,当时做这题的时候查了查,觉得有篇博文讲的还蛮好的,在这安利一下:CTF中常见php-MD5()函数漏洞

PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0。

以下值在md5加密后以0E开头:

  • QNKCDZO
  • 240610708
  • s878926199a
  • s155964671a
  • s214587387a
  • s214587387a

以下值在sha1加密后以0E开头:

  • sha1(‘aaroZmOk’)
  • sha1(‘aaK1STfY’)
  • sha1(‘aaO8zKZF’)
  • sha1(‘aa3OFF9m’)

所以可以将a,b赋值成上面所列的由md5加密后以OE开头的两个不同的值,再采用get方式传参即可。

image-20200705173943800


6.ezmd5-2

image-20200705182529614

与上一题其实蛮类似的,只不过它的限制又变大了,这次是“===”严格相等,不仅值要相等,类型也要相同

PHP中md5的函数特性

md5([1,2,3]) == md5([4,5,6]) == NULL

[1] !== [2] && md5([1]) === md5([2])
所以GET传入a[]=1&b[]=2就能够绕过了。


7.跳转

点开页面只有一句话“flag is not here”,抓一下包看一下响应,发现有个比较特别的响应头,location: youcanfindme.php,

虽然有所发现,但是一开始不知道怎么用,尝试在原来的URL后加了个youcanfindme.php,发现页面没变化,一筹莫展。

后来向大佬求助,我应该再抓一次包的,加了youcanfindme.php后的页面抓包后状态码变成了302(暂时性转移),响应里多了个0xctf: MHhDVEZ7MWY5NGIwMzZiY2NkOTA5Nzg2Yzc3MTVkZTg1NGJmMTh9的头,很可疑,很像flag,但是一般flag不是这种形式啊。原来他用了Base64编码,需要先解码(百度上有很多在线解码的)。解码后就出来一个flag。

稍微总结一下:

​ 首先,抓包,send to repeater后观察响应头,在原来的URL后面添加发现的youcanfindme.php,再抓一次包,同样观察响应,发现可疑字符串,利用base64编码进行解码即可

image-20200705184218489image-20200705184247594

image-20200705184247594

8.我爱吃饼干

点进页面,也是只有一句话You are guest now, only admin can see flag

抓个包看看吧

抓包后发现响应头里有这样一个头Set-Cookie: Cookie=eyJ1c2VybmFtZSI6Imd1ZXN0In0%3D

首先我尝试的是在请求头里添加一个名为cookie的请求头,并把值赋为eyJ1c2VybmFtZSI6Imd1ZXN0In0%3D,失败!

经过上一道题的毒打,我去试了一下这串字符串是不是又是base64编码,结果如下:

image-20200705185303601

能看出个大概,但是后面出现了乱码,这时候我尝试了一下在请求头里加了一个名为username的请求头,值为guest,失败!又试了一下把值改成admin依旧不行

这时候就得求助了,大佬告诉我%3D这类字符其实是经过特殊编码的,就像%20代表空格一样

比如在网址栏里输入%3D:

image-20200705185957749

这里的%3D其实就相当于=

我实在太菜了,大佬提示到这我还是没能领略,我尝试将原来的%3D替换成=再解码看看,得到{"username":"guest"}

虽然解码正常了。但还是不知道怎么利用这个信息,想想题目那句话“only the admin can see the flag”,我试了一下将{"username":"guest"}中的guest 换成admin,获得一串字符,把这串字符作为请求头cookie 的值,send一波,失败!

此时大佬缓缓打出一个:question:方法对了,但是居然解不出来?

我又重新试了一遍,不行,发现我的base64编码出来的字符串和大佬的不一样,我换了一个在线解码的网站,再解了一次,把字符串作为cookie的值,成功解出flag。(什么?我居然被在线解码网站给克制了:angry:)


9.eztrick

image-20200706183947270

起初我是把它当绕过来做的,试了试绕过空格的一些方法,都失败了。

后来大佬告诉我不是空格,而是URL编码显示空字符,让我试试?%E%280%AC=xxx的形式,我试了一下?%E%280%AC=%E%280%AC,成功得到flag

image-20200706184647653


10.$$

image-20200706184747544

这题考察变量覆盖 此处安利一篇博客:变量覆盖漏洞

准确说是考察由$$引起的变量覆盖,根据题意,在url后面加上?ctf=0xctf,使其满足if 条件语句即可


11.extract

image-20200706185409318

这题考察由extract()函数引起的变量覆盖问题,(关于extract()函数,可自行百度或者阅读上面的博文:arrow_up:)直接在url后面加上?ctf=0xctf,使其满足if 条件语句即可


12.parse_str

image-20200706185724337

这题考察的是由parse_str()函数引起的变量覆盖,主要是通过变量覆盖使得Leon1===Leon2

之前在学习变量覆盖的时候见过几道这方面的例题,这道题中的$_SERVER["QUERY_STRING"]是我没见到过的,去百度了一下:

实例:

1,http://localhost/aaa/** (打开aaa中的index.php)
结果:
$_SERVER[‘QUERY_STRING’] = “”;
$_SERVER[‘REQUEST_URI’] = “/aaa/“;
$_SERVER[‘SCRIPT_NAME’] = “/aaa/index.php”;
$_SERVER[‘PHP_SELF’] = “/aaa/index.php”;

2,http://localhost/aaa/?p=222 (附带查询)
结果:
$_SERVER[‘QUERY_STRING’] = “p=222”;
$_SERVER[‘REQUEST_URI’] = “/aaa/?p=222”;
$_SERVER[‘SCRIPT_NAME’] = “/aaa/index.php”;
$_SERVER[‘PHP_SELF’] = “/aaa/index.php”;

3,http://localhost/aaa/index.php?p=222&q=333
结果:
$$_SERVER[‘REQUEST_URI’] = “/aaa/index.php?p=222&q=333”;
$_SERVER[‘SCRIPT_NAME’] = “/aaa/index.php”;
$_SERVER[‘PHP_SELF’] = “/aaa/index.php”;

由实例可知:
$_SERVER[“QUERY_STRING”] 获取查询 语句,实例中可知,获取的是?后面的值
$

_$SERVER[“REQUEST_URI”] 获取 http://localhost 后面的值,包括/
$_SERVER[“SCRIPT_NAME”] 获取当前脚本的路径,如:index.php
$_SERVER[“PHP_SELF”] 当前正在执行脚本的文件名

其实对于解题来说并没有太大影响

所以直接在url后面添加?Leon1=abc&Leon2=abc即可


13.ezupload

image-20200708184237017

页面很简单,易得这是一道考察文件上传的题

上传了一张图片,得到一句话

you file: ./sandbox/3a64ab0e3d4f435a3ba6e69810dbcd01/wallhaven-0q6qw7.jpg

尝试上传一个.php文件,发现没有提示文件格式不对或者一些其他报错,依旧得到一句话:

you file: ./sandbox/e5e655202a8c03687b43d65e6351159b/shell3.php

尝试了一下分别把这两段话加到url后面,发现图片能够正常显示,而.php回显的是一个空白页面

image-20200708191734385

后来去找了找这方面的例题,发现一道和这个有点类似的,它说页面回显的是一个空白页面说明一句话木马成功了(对了,上面用的那个.php文件是一句话木马,如,新建一个空白文档,然后输入这句话,另存为.php文件即可生成)

按照网上的解法,接下来把空白页面的url 复制到中国菜刀链接一下即可,我去网上找了找中国菜刀,试了好多次都不行。(当时我十分怀疑我遇到了假的菜刀:cold_sweat:)

继而去求助大佬,这才知道原来像上面用的那句一句话木马在用菜刀时要输入密码,密码为aaa(密码是一句话木马中post或者get的值,上面那个一句话木马的post的值为aaa,故密码为aaa).大喜:grin:,以为问题解决了,一试发现还是不行,连接不上。大佬说我可能装了个假菜刀:cold_sweat:此处附上大佬提供的中国菜刀与中国蚁剑的官网网址:

中国菜刀http://www.maicaidao.co/

中国蚁剑https://github.com/AntSwordProject/antSword

一番波折之后,装上了真·:hocho:,一点添加,依旧没得到想要的结果。大佬建议换成蚁剑试试,成功了!

下面把正确的解题过程重新梳理一下:

首先,准备一个一句话木马(.php文件),然后上传,得到一串类似URL的东西,将它添加到原URL 后面,若回显空页面则说明一句话木马已经成功上传(如果404啥的检查一下URL,多试几次)

准备好中国蚁剑,在空白处右击添加数据,将空页面的URL复制进去,输入密码aaa,点击左上角的添加即可(因为我已经添加过了,所以左上角显示的是保存)

image-20200708194242532

连接成功后双击打开:

image-20200708194638547

找了找也没找到flag,,,,实在是菜啊:sob:

问了大佬,flag一般在根目录下,点开那个/文件夹,在最下面发现了flag文件,点开即可得到flag。


14.一键getflag

image-20200709215614854

点进去,它提示你输入0xCTF网站的IP即可得到flag,菜鸡的我还去百度了一下什么是网站的IP:cold_sweat:

其实就类似127.0.0.1这类的,我查了一下有没有能查询某个指定网站IP的工具,找了一个在线查询的,输入网站的URL后得到网站的IP:39.106.164.8

然后一波复制粘贴,发现粘贴不进去,查看源码,发现这样一句话:

maxlength=“4”说明输入的字符串最大长度为4,而我们的IP地址显然超过了,所以输不进去。想了一下利用Burpsuite抓一波包再改包:

先输入一个4个字符以内的IP。如我输入的是1234,抓包后将IP改为39.106.164.8,再发包即可


15.未完成的留言板

image-20200711132555655

点进去,看一下,是一个留言板

image-20200711132711291

随便输入一句留言,点击回复

image-20200711132823635

因为题目说flag在fl4g.php,所以我把这个放到URL后面试了一下,跳转出来的还是留言板界面。

查看了一下源码,再抓包看了看,并没有看出什么端倪。于是我查看了提示,提示为:LFI,即本地文件包含,所以本题考查PHP伪协议与本地文件包含漏洞。通过对知识与例题的学习,我尝试了一下用php://filter去读取一下fl4g.php文件,构造如下payload:

http://ctf.caoyi.site:30002/web8/index.php?file=php://filter/read=convert.base64-encode/resource=fl4g.php

失败,后来又尝试了一下用php://input的方式写入一句话木马,也失败了(可能是我姿势不对吧:joy:)

继而求助大佬,大佬一针见血地指出了我的问题,上面那个payload里的file参数在本题中并不存在

(的确,由于我是模仿的其他题目的解法,并没完全理解,此处就照搬了file参数

include($_GET['file']);

这样的php语句说明file是参数,而本题是action为参数

include($_GET['action']);

从点击回复后的url中便可看出image-20200711135546090

所以将上述payload中的file参数修改为action 即可,不不不,事情没有这么简单,我尝试了一下,直接404,好吧,貌似是index.php中并没有action 这个参数,所以应该在action.php 的基础上再去使用php://filter语句,故修改payload为:

http://ctf.caoyi.site:30002/web8/action.php?action=php://filter/read=convert.base64-encode/resource=fl4g.php

访问一下,一串base64编码后的字符串一闪而过,然后页面又变成了留言板界面,此时想到的是抓包,使用Burpsuite抓包后发现可疑字符串

image-20200711140844022

base64解码后即可得到flag


16.RCE bypass

image-20200716214515665

这道题前前后后花了些时间,一开始无从下手,题目标题是RCE绕过,关于RCE绕过的姿势也了解了一些(此处安利一篇博客:《RCE的Bypass与骚姿势总结》),但完全无从下手。前期试了试get方式传一个cmd参数,我试了一下?cmd=1,并没有什么用。后来大佬建议我去了解一下php system 函数,了解了一波后,再结合刚学的Linux命令,想起来攻防世界里的一句话木马那道题当时有个wp就是采用system+cat来解决的。我踌躇满志地打开hackbar, load Url,post date:shell=system('ls');,然而又是啥都没。一番挣扎尝试后再次求助大佬,经过大佬的点播与提示,上述php语句中有两句话应该好好理解:

$cmd = $_GET['cmd']?$_GET['cmd']:'';

这句话y中用到了三目运算符?:,如果问号前面的条件成立的话,那么它就执行问号与冒号之间的语句,否则执行冒号后面的语句.

那么这句话的意思就是如果以get方式传入了参数的话,那么他就把这个传入的cmd参数赋值给 $cmd,如果没有传入cmd这个参数的话,那么 cmd就为空。

if($cmd)
{   system("$cmd"); }

这个语句表明php用system 函数把cmd这个参数当做系统命令执行,所以其实之前尝试的shell=system('ls');可以以在url 里将cmd 赋值为ls 来代替实现,

image-20200716221117992

此时页面中出现了flag.php和index.php的提示,此时想到利用cmd=cat flag.php的方式来读取文件,但是cat,flag被禁用了,第一时间想到的是用姿势绕过,但大佬说duck不必,cat被ban了可以用tac,tac被ban 了可以用head,head被ban了还可以用其他的。一语惊醒梦中人呐,之前在学习Linux命令的时候,的确很多命令都可以完成文件的读取工作。

小小整理一下,若cat被ban,可以采用以下命令代替:

(1)more:一页一页的显示档案内容

(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页 (补充一下,如果想退出less,按q键就可以了)

(3)head:查看头几行 (默认是前10行)

(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示

(5)tail:查看尾几行 (默认是后10行)

(6)nl:显示的时候,顺便输出行号

(7)od:以二进制的方式读取档案内容

(8)vi:一种编辑器,这个也可以查看

(9)vim:一种编辑器,这个也可以查看

(10)sort:可以查看

(11)uniq:可以查看

(12)file -f:报错出具体内容 For example:image-20200717092841793

关于如何退出vim(命令模式下)

:q,退出(:quit的缩写)

:qL,退出且不保存(:quit的缩写)

:wq,保存并退出

:wq!,保存并退出即使文件没有写入权限(强制保存退出)

:x,保存并退出(类似:wq,但是只有在有更改的情况下才保存):exit,保存并退出(和:x相同)

:qa,退出所有(:quitall的缩写)

:cq,退出且不保存(即便有错误)

尝试采用tail代替cat,下面应该把flag绕过就ok了,构造如下payload:?cmd=tail fl''ag.php,发现页面没有出现爪巴,估计是成功绕过了。

大佬友情提醒,文件内容含有<??>的不会在前端输出,需要查看源码。(由于<??>在前端并不显示,所以此处采用的是编码来让其显示,<在html中可用&lt加上来显示,同理,>用&gt来显示,一定别忘了😢,更多的这样的转义符可以去百度一下)

查看一波源码,成功得到flag

(这里再插几句,关于那个flag的绕过方式,其实fl*这种也很常见,即通配符绕过

此处再安利一篇博文:《CTF下的命令执行漏洞利用及绕过方法总结》

但是让我很苦恼的是那种拼接方式去构造payload的方式我可能还不太理解,在本题中尝试了好多次也没成功,这个坑先留着,以后来填,或者大佬们评论区指点一波


17.RCE_bypass_pro

image-20200720210307946

这道题是RCE的pro版本,料到了绕过有难度。点进去一看,我敲!这么多过滤条件!(手动滑稽_)

稍微理解一下源码:首先要以GET方式传一个ip参数,然后那一长串用于过滤的令人头皮发麻的正则表达式,emmm,怎么说呢,没能完全看懂,但大致能晓得它过滤掉了哪些东西。

先稍微试一试水,我构造了这样一个payload:?ip=d;sort${IFS}fl\ag.php

失败,回显 fxck your symbol!

又仔细看了看,好吧,疏忽了,{}/貌似都被过滤了,额,{}好解决,空格用$IFS也可以替代,但是flag咋搞呢?

百度了一波,大概要么编码解决,要么用拼接(哎,终究逃不过拼接😰

尝试一波拼接 image-20200720214759811

再次失败,不过这次回显的是 no flag,对照源码,应该是咱们的flag没成功绕过,还是被过滤了。

继续百度,我恰巧看到一篇博客里提到了if(preg_match("/.*f.*l.*a.*g.*/", $ip)这个正则表达式,他说这个过滤的话采用一般的拼接不起作用,得换换顺序,因为一旦 f l a g顺序显示,就歇菜了。

OK,那将a,b换换吧,重新构造payload:image-20200720215305374

成功!!😎

然后我又尝试了一下其他的payload,应该不止这一种解法。继续逛百度,居然发现一道和这道题很像的题😲

去找了找它的wp,由于题目还是有点差异,有些wp中的解法并没成功(也可能是我太菜了😵),但是经过我的尝试,还是发现了几种骚姿势:

  • image-20200720220319905
  • image-20200720220434968

第二个实在是太骚了,运行后:

image-20200720220938545

菜鸡的我流下了伤心的泪水😭😭😭


18.EZupload-2

image-20200731115817516

依旧是一道文件上传,首先尝试一波上传shell.php,(让自己死心),回显不允许的文件类型。

又尝试了一波双写绕过,加.绕过,都不行,想了一下可能是得上传图片马,首先制作一个图片马:

首先桌面新建一个shell.php文件,写入一句话木马。

然后打开cmd,用cd desktop定位到桌面,copy 1.jpg/b+shell.php/a 3.jpg(前提是你桌面上有1.jpg这张图和shell.php)

用记事本打开3.jpg,将乱码拉倒最后,如果最后有一句话木马就说明制作成功了。(必要的情况下可以把乱码删掉,乱码太多后续可能解析不了)

图片马制作成功,然后也上传成功,但是菜刀和蚁剑都连不上,几番百度,也没发现问题。后来去问大佬,大佬说图片马没办法像php那样被解析,有两种方法:

  • 文件包含

  • .htaccess

    似乎豁然开朗,但是我之前上传.htaccess文件的时候它显示不允许的文件类型,大佬说抓包改一下文件类型就可以了(奥,我想起来,之前做那个靶场训练的时候好像遇到过这种题)

    此处我当时踩了一个大坑,我的.htaccess文件命名成了1.htaccess,但是其实是不能有文件名的,那个文件直接命名成.htaccess就可

    然后关于.htaccess的内容,第一种写法:SetHandler application/x-httpd-php

    然后还有一种更精准的写法:

     <FilesMatch "shell.jpg">
      SetHandler application/x-httpd-php
     </FilesMatch>
    

    (当然这种写法你的图片马的文件名得是shell.jpg)

    image-20200731122831238

把上面那个文件类型改成image/jpeg 再发包就可了

image-20200731123111676

上传成功!

接着再上传之前的图片木马,上传成功后回显一个地址,访问一波。

image-20200731124839807

应该是成功解析了,这时候将url用蚁剑链接一波,成功链接,然后成功在根目录下找到flag.😙


19.SQL_injection

这是一道SQL注入的问题,应该不是很难。之前刷过几道sqllib的题,有空一定好好刷.

之前我采用的一直是手工注入,这次一开始也是采用的手工注入,但是出了些问题,后来转向sqlmap,由于我之前的sqlmap文件夹貌似又双叒叕被我误删了,这次使用的是kali自带的sqlmap。

  • 第一步,看是否存在注入点:kcm@kali:~$ sqlmap -u "http://59.110.157.4:30010/?id=1' "
image-20200928161245282

提示“id”可能是注入点。

  • 第二步查看数据库名称:kcm@kali:~$ sqlmap -u"http://59.110.157.4:30010/?id=1' " --dbs
image-20200928161505584

显示有两个可用的数据库,一个名为 information_schema(信息模式?),另一个名为user.

  • 知道了数据库的名称,接下来就是去查看数据库中的表:kcm@kali:~$ sqlmap -u "http://59.110.157.4:30010/?id=1' " -D information_schema --tables

    image-20200928161847157

自上而下看了半天,没发现flag字眼,暂且搁置,去另一个库康康:kcm@kali:~$ sqlmap -u "http://59.110.157.4:30010/?id=1' " -D information_schema --tables

image-20200928162050230

只有简简单单的一个表,很可疑啊,觉得有必要深究一下。

  • 查看user数据库中user表的列信息:kcm@kali:~$ sqlmap -u "http://59.110.157.4:30010/?id=1'" -D user -T user --columns

    image-20200928162328554
    • 最后查看你想看的东西就行了,falg应该是字符串,所以我首先查看的是password里的东西:kcm@kali:~$ sqlmap -u "http://59.110.157.4:30010/?id=1'" -D user -T user -C password --dump
    无标题

    flag手动打码😜


未完待续😜


文章作者: Ab4nd0n
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ab4nd0n !
评论
  目录