最近开始接触CTF,主要是web方向,作为一个小白,遭受了各种社会的毒打,好在有大佬指路,勉强能解出些题来,这篇博文主要写写0xCTF中题目的writeup.
1.soeasy
这个题还是蛮简单的,查看源码,稍微找找就能得到flag
稍微总结一下查看源码的方法吧:
a.鼠标右键,点查看源代码
b.F12
c.Ctrl+shift+I
d.ctrl+U
e.在网址前面加上view-source:
(火狐反正支持这种方式)
2.GET
稍微判断一下这是一个通过Get方式传参的问题(如果不了解的话提前去了解一下PHP语言,熟悉一下基本语法)
Get方式传参直接在URL后面写上参数并为其赋值即可,本题要传的的参数为0x,值为0xfxxker,故在网址栏应该这么写:
回车一下就得到了flag.
3.POST
本题考察的是POST方式传参,我是用火狐插件hackbar来解的(关于hackbar的下载安装并不难,不必装最新版,最新版需要付费,下个旧版就行了,然后关闭自动更新。具体去百度一下)
F12查看源码,然后点Hackbar, laod URL
,勾选post date
,在下面的框里输入参数并为其赋值,点击Execute
就能成功传参,然后flag就有了
当然,用Burpsuit也一样能做,在这不赘述了
4.XFF&Referer
打开页面只有一句话“只有本地IP才能访问”,刷过攻防世界的新手区的题的话应该会有印象,其实就是伪造一个Ip,然后就可以了
首先利用Burpsuit抓个包,右击发送到repeater,然后在header里面Add一个新的头:X-Forwarded-For
, 值为127.0.0.1
点击send(貌似大部分版本是go,小事小事),这时候看右边的响应,多出来一句话“必须来自于:http://0xctf.ctf
”
这时同样的方法,在headers中再添加一个名为Refere
r的头,值为http://0xctf.ctf
,send一下,响应中就出现了flag
5.ezmd5
核心是那个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方式传参即可。
6.ezmd5-2
与上一题其实蛮类似的,只不过它的限制又变大了,这次是“===”严格相等,不仅值要相等,类型也要相同
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编码进行解码即可
8.我爱吃饼干
点进页面,也是只有一句话You are guest now, only admin can see flag
抓个包看看吧
抓包后发现响应头里有这样一个头Set-Cookie: Cookie=eyJ1c2VybmFtZSI6Imd1ZXN0In0%3D
首先我尝试的是在请求头里添加一个名为cookie
的请求头,并把值赋为eyJ1c2VybmFtZSI6Imd1ZXN0In0%3D
,失败!
经过上一道题的毒打,我去试了一下这串字符串是不是又是base64编码,结果如下:
能看出个大概,但是后面出现了乱码,这时候我尝试了一下在请求头里加了一个名为username
的请求头,值为guest
,失败!又试了一下把值改成admin
依旧不行
这时候就得求助了,大佬告诉我%3D这类字符其实是经过特殊编码的,就像%20代表空格一样
比如在网址栏里输入%3D:
这里的%3D其实就相当于=
我实在太菜了,大佬提示到这我还是没能领略,我尝试将原来的%3D替换成=再解码看看,得到{"username":"guest"}
虽然解码正常了。但还是不知道怎么利用这个信息,想想题目那句话“only the admin can see the flag”,我试了一下将{"username":"guest"}
中的guest
换成admin
,获得一串字符,把这串字符作为请求头cookie 的值,send一波,失败!
此时大佬缓缓打出一个:question:方法对了,但是居然解不出来?
我又重新试了一遍,不行,发现我的base64编码出来的字符串和大佬的不一样,我换了一个在线解码的网站,再解了一次,把字符串作为cookie的值,成功解出flag。(什么?我居然被在线解码网站给克制了:angry:)
9.eztrick
起初我是把它当绕过来做的,试了试绕过空格的一些方法,都失败了。
后来大佬告诉我不是空格,而是URL编码显示空字符,让我试试?%E%280%AC=xxx
的形式,我试了一下?%E%280%AC=%E%280%AC
,成功得到flag
10.$$
这题考察变量覆盖 此处安利一篇博客:变量覆盖漏洞
准确说是考察由$$引起的变量覆盖,根据题意,在url后面加上?ctf=0xctf
,使其满足if 条件语句即可
11.extract
这题考察由extract()函数引起的变量覆盖问题,(关于extract()函数,可自行百度或者阅读上面的博文:arrow_up:)直接在url后面加上?ctf=0xctf
,使其满足if 条件语句即可
12.parse_str
这题考察的是由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
页面很简单,易得这是一道考察文件上传的题
上传了一张图片,得到一句话
you file: ./sandbox/3a64ab0e3d4f435a3ba6e69810dbcd01/wallhaven-0q6qw7.jpg
尝试上传一个.php文件,发现没有提示文件格式不对或者一些其他报错,依旧得到一句话:
you file: ./sandbox/e5e655202a8c03687b43d65e6351159b/shell3.php
尝试了一下分别把这两段话加到url后面,发现图片能够正常显示,而.php回显的是一个空白页面
后来去找了找这方面的例题,发现一道和这个有点类似的,它说页面回显的是一个空白页面说明一句话木马成功了(对了,上面用的那个.php文件是一句话木马,如,新建一个空白文档,然后输入这句话,另存为.php文件即可生成)
按照网上的解法,接下来把空白页面的url 复制到中国菜刀链接一下即可,我去网上找了找中国菜刀,试了好多次都不行。(当时我十分怀疑我遇到了假的菜刀:cold_sweat:)
继而去求助大佬,这才知道原来像上面用的那句一句话木马在用菜刀时要输入密码,密码为aaa(密码是一句话木马中post或者get的值,上面那个一句话木马的post的值为aaa,故密码为aaa).大喜:grin:,以为问题解决了,一试发现还是不行,连接不上。大佬说我可能装了个假菜刀:cold_sweat:此处附上大佬提供的中国菜刀与中国蚁剑的官网网址:
中国蚁剑:https://github.com/AntSwordProject/antSword
一番波折之后,装上了真·:hocho:,一点添加,依旧没得到想要的结果。大佬建议换成蚁剑试试,成功了!
下面把正确的解题过程重新梳理一下:
首先,准备一个一句话木马(.php文件),然后上传,得到一串类似URL的东西,将它添加到原URL 后面,若回显空页面则说明一句话木马已经成功上传(如果404啥的检查一下URL,多试几次)
准备好中国蚁剑,在空白处右击添加数据,将空页面的URL复制进去,输入密码aaa,点击左上角的添加即可(因为我已经添加过了,所以左上角显示的是保存)
连接成功后双击打开:
找了找也没找到flag,,,,实在是菜啊:sob:
问了大佬,flag一般在根目录下,点开那个/
文件夹,在最下面发现了flag文件,点开即可得到flag。
14.一键getflag
点进去,它提示你输入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.未完成的留言板
点进去,看一下,是一个留言板
随便输入一句留言,点击回复
因为题目说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中便可看出
所以将上述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抓包后发现可疑字符串
base64解码后即可得到flag
16.RCE bypass
这道题前前后后花了些时间,一开始无从下手,题目标题是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 来代替实现,
此时页面中出现了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:
关于如何退出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中可用<
加上;
来显示,同理,>用>
加;
来显示,一定别忘了;
😢,更多的这样的转义符可以去百度一下)
查看一波源码,成功得到flag
(这里再插几句,关于那个flag的绕过方式,其实fl*这种也很常见,即通配符绕过
此处再安利一篇博文:《CTF下的命令执行漏洞利用及绕过方法总结》。
但是让我很苦恼的是那种拼接方式去构造payload的方式我可能还不太理解,在本题中尝试了好多次也没成功,这个坑先留着,以后来填,或者大佬们评论区指点一波
)
17.RCE_bypass_pro
这道题是RCE的pro版本,料到了绕过有难度。点进去一看,我敲!这么多过滤条件!(手动滑稽_)
稍微理解一下源码:首先要以GET
方式传一个ip
参数,然后那一长串用于过滤的令人头皮发麻的正则表达式,emmm,怎么说呢,没能完全看懂,但大致能晓得它过滤掉了哪些东西。
先稍微试一试水,我构造了这样一个payload:?ip=d;sort${IFS}fl\ag.php
失败,回显 fxck your symbol!
又仔细看了看,好吧,疏忽了,{}
、/
貌似都被过滤了,额,{}
好解决,空格用$IFS
也可以替代,但是flag咋搞呢?
百度了一波,大概要么编码解决,要么用拼接(哎,终究逃不过拼接😰)
尝试一波拼接
再次失败,不过这次回显的是 no flag,对照源码,应该是咱们的flag没成功绕过,还是被过滤了。
继续百度,我恰巧看到一篇博客里提到了if(preg_match("/.*f.*l.*a.*g.*/", $ip)
这个正则表达式,他说这个过滤的话采用一般的拼接不起作用,得换换顺序,因为一旦 f l a g顺序显示,就歇菜了。
OK,那将a,b换换吧,重新构造payload:
成功!!😎
然后我又尝试了一下其他的payload,应该不止这一种解法。继续逛百度,居然发现一道和这道题很像的题😲
去找了找它的wp,由于题目还是有点差异,有些wp中的解法并没成功(也可能是我太菜了😵),但是经过我的尝试,还是发现了几种骚姿势:
第二个实在是太骚了,运行后:
菜鸡的我流下了伤心的泪水😭😭😭
18.EZupload-2
依旧是一道文件上传,首先尝试一波上传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/jpeg
再发包就可了
上传成功!
接着再上传之前的图片木马,上传成功后回显一个地址,访问一波。
应该是成功解析了,这时候将url用蚁剑链接一波,成功链接,然后成功在根目录下找到flag.😙
19.SQL_injection
这是一道SQL注入的问题,应该不是很难。之前刷过几道sqllib的题,有空一定好好刷.
之前我采用的一直是手工注入,这次一开始也是采用的手工注入,但是出了些问题,后来转向sqlmap,由于我之前的sqlmap文件夹貌似又双叒叕被我误删了,这次使用的是kali自带的sqlmap。
- 第一步,看是否存在注入点:
kcm@kali:~$ sqlmap -u "http://59.110.157.4:30010/?id=1' "
提示“id”可能是注入点。
- 第二步查看数据库名称:
kcm@kali:~$ sqlmap -u"http://59.110.157.4:30010/?id=1' " --dbs
显示有两个可用的数据库,一个名为 information_schema(信息模式?),另一个名为user.
知道了数据库的名称,接下来就是去查看数据库中的表:
kcm@kali:~$ sqlmap -u "http://59.110.157.4:30010/?id=1' " -D information_schema --tables
自上而下看了半天,没发现flag字眼,暂且搁置,去另一个库康康:kcm@kali:~$ sqlmap -u "http://59.110.157.4:30010/?id=1' " -D information_schema --tables
只有简简单单的一个表,很可疑啊,觉得有必要深究一下。
查看user数据库中user表的列信息:
kcm@kali:~$ sqlmap -u "http://59.110.157.4:30010/?id=1'" -D user -T user --columns
- 最后查看你想看的东西就行了,falg应该是字符串,所以我首先查看的是password里的东西:
kcm@kali:~$ sqlmap -u "http://59.110.157.4:30010/?id=1'" -D user -T user -C password --dump
flag手动打码😜
- 最后查看你想看的东西就行了,falg应该是字符串,所以我首先查看的是password里的东西:
未完待续😜