BugkuCTF-WEB-第1题到第42题
https://ctf.bugku.com/challenges
这里整理了bugkuCTF-WEB 1~42题的部分解法,部分题目已失效,很多题目有多种解法,想多了解更多的同学请搜索相关题目的wp,想学习更多的同学,欢迎去bugku新平台CTF论剑场https://new.bugku.com/
1.web2
题目地址:http://123.206.87.240:8002/web2/
F12看一下 flag就在里面
2.计算器
题目地址:http://123.206.87.240:8002/yanzhengma/
文本框限制了输入,F12改一下
成功获得flag
3.web基础$_GET
题目地址:http://123.206.87.240:8002/get/
GET传参,如果what=flag,输出flag
4.web基础$_POST
题目地址:http://123.206.87.240:8002/post/
POST传参,如果what=flag,输出flag
5.矛盾
题目地址:http://123.206.87.240:8002/get/index1.php
num既不能是数字字符,但是要等于1,用科学计数法表示数字1,既不是纯数字,其值又等于1,构造payload:num=1e0.1
6.web3
题目地址:http://123.206.87.240:8002/web3/
打开页面会有弹窗,点很多次也关不掉,我们把这个选项勾选再点确定就不会弹窗了
右键查看网页源代码
最下面有一串Unicode编码转换
复制在http://tool.chinaz.com/tools/unicode.aspx转换后
7.域名解析
将自己电脑的hosts文件最后加上123.206.87.240 flag.baidu.com之后访问flag.baidu.com
得到flag修改回来
windows :c:\windows\system32\drivers\etc\hosts
linux :/etc/hosts
8.你必须让他停下
题目地址:http://123.206.87.240:8002/web12/
查看网页源代码,看到flag is here,检察元素,手快的我截到图了
也可以用BurpSuite抓包,找到刷新出图片的那一张
9.本地包含
题目链接:http://123.206.87.240:8003/ 链接已失效
wp来自https://blog.youkuaiyun.com/Sanky0u/article/details/77197523
右键查看源代码
搜了一下@$_REQUEST 的意思是获得参数,不论是@$_GET还是@$_POST可以得到的参数@$_REQUEST都能得到。 所以构造hello的get参数。
$a应该最后会像字符串替换一样替换成hello的参数值吧。
<1> hello=);print_r(file("flag.php")
<2> hello=);var_dump(file("flag.php")
<3> hello=file("flag.php")
<4> hello=);include(@$_POST['b']
在POST区域:b=php://filter/convert.base64-encode/resource=flag.php
<5> hello=);include("php://filter/convert.base64-encode/resource=flag.php"
之后将获得的flag.php的base64编码后的源码解码得到flag。
10.变量1
题目链接:http://123.206.87.240:8004/index1.php
error_reporting(0); // 关闭php错误显示
include "flag1.php"; // 引入flag1.php文件代码
highlight_file(__file__); //对文件进行语法高亮显示
if(isset($_GET['args'])){
// 条件判断 get方法传递的args参数是否存在
$args = $_GET['args']; //赋值给变量 $args
if(!preg_match("/^\w+$/",$args)){
// /^开始, \w表示任意一个单词字符,即[a-zA-Z0-9_] ,+将前面的字符匹配一次或多次,$/结尾
die("args error!"); //输出 args error!
}
eval("var_dump($$args);"); // 将字符串作为php代码执行结尾加分号 var_dump()函数 显示关于一个或多个表达式的结构信息,包括表达式的类型与 值。数组将递归展开值,通过缩进显示其结构。$$args 可以理解为$($args)
}
?>
抓住两个地方,一个是正则表达式匹配,不匹配则直接die,该正则表达式应该是匹配都是字母的串。然后最关键的是最后的KaTeX parse error: Can't use function '$' in math mode at position 17: …rgs,这是可变变量的意思,如$̲args的值是另一个变量的变量…args就代表另一个变量。所以我们就给args赋值一个变量名,那么PHP的九大全局变量,一个一个试。
$_POST [用于接收post提交的数据]
$_GET [用于获取url地址栏的参数数据]
$_FILES [用于文件就收的处理img 最常见]
$_COOKIE [用于获取与setCookie()中的name 值]
$_SESSION [用于存储session的值或获取session中的值]
$_REQUEST [具有get,post的功能,但比较慢]
SERVER[是预定义服务器变量的一种,所有SERVER[是预定义服务器变量的一种,所有_SERVER [是预定义服务器变量的一种,所有_SERVER开头的都
$GLOBALS [一个包含了全部变量的全局组合数组]
$_ENV [ 是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它]
当args=GLOBALS时,flag出现。
11.web5
题目链接:http://123.206.87.240:8002/web5/
随便提交一下
F12看一下,发现一串超级长的数据
将其复制到控制台,按回车
出现flag,提交不正确,想到题目上提示字母大写,提交正确
12.头等舱
题目链接:http://123.206.87.240:9009/hd.php
查看网页源代码和F12竟然真的什么也没有(没什么有价值的信息),那就抓个包看看
将抓到的包发送到repeater,再点发送,得到flag
13.网站被黑
题目链接:http://123.206.87.240:8002/webshell/
看到url上有webshell,猜测有webshell文件,扫一下后台
发现shell.php,需要登录密码
拿Burp Suite爆破一下,密码是hack
得到flag
14.管理员系统
题目链接:http://123.206.31.85:1003/
随便试了一个账户密码,显示IP禁止访问,请联系本地管理员登陆,IP已被记录. F12看一下,有一串base64编码
解码之后感觉这个是密码,IP禁止被访问,那我们就自己伪造一个XFF头
X-Forwarded-For: 127.0.0.1
得到flag
15.web4
题目链接:http://123.206.87.240:8002/web4/
看看源代码? 那我们就看看
两串url编码,解码看看
代码整理如下:
<script>
var p1 = 'function checkSubmit(){var a=document.getElementById("password");if("undefined"!=typeof a){if("67d709b2b';
var p2 = 'aa648cf6e87a7114f1"==a.value)return!0;alert("Error");a.focus();return!1}}document.getElementById("levelQuest").οnsubmit=checkSubmit;';
eval(unescape(p1) + unescape('54aa2' + p2));
</script>
eval(unescape(p1) + unescape(’%35%34%61%61%32’ + p2));这句代码的含义是:p1串的编码+‘%35%34%61%61%32’的编码+p2串的编码。这是一个拼接的字符串,解码之后,拼接完成,回到网页中提交,网页直接爆出了flag。
16.flag在index里
题目链接:http://123.206.87.240:8005/post/
点击它
观察url出现?file=show.php 于是想到php://filter
这里具体详解见:https://www.leavesongs.com/PENETRATION/php-filter-magic.html
把url改成http://123.206.87.240:8005/post/index.php?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的base64编码,解码后得到flag
https://www.php.net/manual/zh/wrappers.php.php
17.输入密码查看flag
题目链接:http://123.206.87.240:8002/baopo/
5位数字密码,话不多说直接爆破
得到密码为13579
18.点击一百万次
题目链接:http://123.206.87.240:9001/test/ 已失效
wp来自https://www.cnblogs.com/0yst3r-2046/p/10745979.html
要是真的点击一百万次,怕是点到手抽筋,哈哈哈哈
本题要点:控制台js、传参
查看一下源码
查看源码,发现了clicks变量,当它为1000000应该能得到flag
方法一:
直接F12,选择控制台,然后输入clicks=1000000,然后回车,再点击一下网站那个图案,发现得到了flag。
方法二:
用POST提交cllicks=1000000,得到flag。
19.备份是个好习惯
题目链接:http://123.206.87.240:8002/web16/
观察发现是两串相同的MD5,拿去解密,是空密码,题目名叫备份是个好习惯,那么可能存在备份文件,扫一下
果真有备份文件,访问,下载一个文件,打开index.php.bak,里面是php代码
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/
include_once "flag.php";//包含flag.php
ini_set("display_errors", 0);//设置危险等级为0的会报错
$str = strstr($_SERVER['REQUEST_URI'], '?');//设变量str的值为url中?后面的字符串
$str = substr($str,1);//设str为str中第一位开始后的字符串
$str = str_replace('key','',$str);//把str中的key替换成空
parse_str($str);//把str中的字符串解析为变量
echo md5($key1);//输出md5加密的key1
echo md5($key2);//输出md5加密的key2
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}//如果key1的md5加密等于key2的md5加密并且key1不等于key2的值就输出flag
?>
1.将key变为空的函数我们用kkeyey绕过,他会让我们的kkeyey变为key
2.就是if函数的绕过
前面做过,md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。利用==比较漏洞,如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。
下列的字符串的MD5值都是0e开头的:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
20.成绩单
题目链接:http://123.206.87.240:8002/chengjidan/
输入1,2,3都正常回显,输入4无回显,然后输入1‘无回显1’ and 1=1#正常回显
1’ order by 4 #有回显,1’ order by 5 #无回显