CTF的web之旅(bugku平台)(持续更新)

v## 1.web2
查看元素即可

2.计算器


查看元素后将需要输入数字的文本框的最大长度改一下(例如10)即可。

3.web基础$_GET

$what=$_GET['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';

$_GET变量:

预定义的 $_GET 变量用于收集来自 method=“get” 的表单中的值。

从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。

这个题都在说要构建一个payload,那么什么是payload呢

通俗一点讲,在程序的世界里,payload(有效载荷)就是对于接收者有用的数据

具体到这个题,也就是将【参数what】赋值为【flag】,也就是在原来的URL(网络地址)后面加上 ?what=flag 即可,即:

http://123.206.87.240:8002/get/?what=flag

得到flag:

4.web基础$_POST

$what=$_POST['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';

$_POST变量:

预定义的 $_POST 变量用于收集来自 method=“post” 的表单中的值。

从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。

注释:然而,默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置 php.ini 文件中的 post_max_size进行更改)。

这一题和上一题差不了太多,也是传参数,可以使用在线工具。也可以用hackbar传参。
然后点击 发送请求 ,即可完成传参,得到flag

记得去掉多余的空格

5.矛盾

$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}

关于PHP is_numeric()函数:

> bool is_numeric (  mixed  $var  ) 

如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。

那么题目中代码的意思就是,定义一个num参数,并收集一个不是数字但等于1的值。
两种方法:
1.%00截断

在url中,%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。

http://123.206.87.240:8002/get/index1.php?num=1%00

2.直接在1后面随便加一个不是数字的字符即可,比如

http://123.206.87.240:8002/get/index1.php?num=1+

得到flag:

6.web3

先阻止此页面创建更多对话框

然后查看元素,发现这个:

在线Unicode转ASCll,得到flag

7.域名解析

听说把 flag.baidu.com 解析到123.206.87.240 就能拿到flag

域名解析:

域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。

题目意思是把 flag.baidu.com 解析到 123.206.87.240
在 C:\Windows\System32\drivers\etc 路径下找到 hosts 文件,在最后一行加入

123.206.87.240 flag.baidu.com


保存之后在浏览器中访问 flag.baidu.com 即可得到flag

8.你必须让他停下

要用bp抓包,抓到数据包后转到Repeater,go几次就可以得到flag

9.本地包含

这个我点开链接是空白…不会搞…<(_ _)>

10.变量1

flag In the variable ! <?php  		

error_reporting(0);		//关闭php错误显示
include "flag1.php";		//引入flag1.php代码
highlight_file(__file__);		//高亮显示
if(isset($_GET['args'])){		//定义一个args变量
    $args = $_GET['args'];		//通过get函数传参
    if(!preg_match("/^\w+$/",$args)){		//见下面
        die("args error!");
    }
    eval("var_dump($$args);");			//"$$"可变变量
}
?>

接上边,preg_match是用于执行一个正则表达式匹配的函数

/^\w+$/中, 两个/ / 表明正则表达式的开始与结束, ^是开始字符,$是结束字符, \w 包含【a-z, A-Z, ,0-9】中的字符,+代表可以有一个或多个。 总的加起来意思就是 以[a-z,A-Z,,0-9]中的其中一个字符开始,中间可以有任意个[a-z, A-Z, ,0-9]字符,最后再以[a-z,A-Z,,0-9]中的一个字符结束 这是对args传入的参数的要求。

最后的var_dump($$args)var_dump函数用来打印变量的相关信息,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

查看元素发现这些奇奇怪怪的东西:
在这里插入图片描述应该是一种加密方式,附上一个加密解密网站汇总,通过里面的网站可以进行解密,得到答案。
在这里插入图片描述
然后根据题目要求将字母大写即可成功提交。

12.头等舱

首先查看元素,没有什么有价值的信息。
在这里插入图片描述
然后尝试抓包,将数据包送入repeater,go一下就可以看到flag了
在这里插入图片描述

13.网站被黑

从这个题开始知道御剑这个软件,用御剑进行扫描,得到一个shell.php网页
双击打开,界面如下
在这里插入图片描述
需要输入密码,用burp进行密码爆破:
先在输入框中随便输入一个密码然后进行抓包,将数据包送入intruder,在Add from list 中选择Passwprds.
在这里插入图片描述
点击start attack 得到如下界面
在这里插入图片描述
发现 hack 长度不同(爆破成功的密码返回长度与失败的返回长度差异很大),输入hack试一下,得到flag
在这里插入图片描述
2019/11/25更新

14.管理员系统

查看元素,发现这个
在这里插入图片描述
应该是base64加密,(base64加密的末尾通常有一到两个等号),解码得到“test123”,当成flag提交,不对,那就先随便输入一个用户名和密码,输入后提示本地管理员可以登陆,所以可以伪装成本地管理员登录。
在这里插入图片描述先随便输入一个用户名和密码然后用burp抓包
在这里插入图片描述
发送到Repeater进行改包,在Headers中增添一对键值对: X-Forwarded-For : 127.0.0.1

X-Forwarded-For 简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP

在这里插入图片描述go一下,得到flag
在这里插入图片描述

15.web4

打开发现让看看源代码,那就看看源代码
在这里插入图片描述
发现这些东西,应该是URL编码,解码得到
在这里插入图片描述可以看到,解码得到的东西并不完整,再根据源代码中的最后一行
在这里插入图片描述
将p1和p2放在一起解码
在这里插入图片描述得到
在这里插入图片描述将看起来很不一样的字符串67d709b2b54aa2aa648cf6e87a7114f1输入试一下,得到flag
在这里插入图片描述

16.flag在index里

首先尝试了bp抓包,没有什么有用的信息。
然后结合其他博主的博客,从点击click me的链接之后出现的网页的URL中的file关键字可以看到,有文件包含漏洞+php伪协议的结合应用,参考文章1(关于php://filter)参考文章2.
在这里插入图片描述
构造URL http://123.206.87.240:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php得到一串base64加密过的字符串:
在这里插入图片描述解释一下构造的url,php://filter/read=convert.base64-encode是指读取方式是base64编码,/resource=index.php是指目标文件是index.php。
解密得到flag:
在这里插入图片描述

17.输入密码查看flag

五位数字密码爆破
先随便输入一个密码然后用burp抓包,送入intruder,然后设置密码为变量
在这里插入图片描述
然后设置数字的范围
在这里插入图片描述
开始爆破
得到密码
在这里插入图片描述输入密码得到flag
在这里插入图片描述

18.点击一百万次

先查看元素,想修改clicks>=1000000这里的数据为1,但是修改不了…所以就到控制台,将clicks的值改成一个比1000000大的数即可。
在这里插入图片描述

19.备份是个好习惯

打开之后发现一串字符,MD5解密一下试试,发现是空密码
再看题,备份,应该是让我们找一个.bak文件,(备份文件的常见格式还有.swp)所以构造一个url123.206.87.240:8002/web16/index.php.bak,得到一个文件,下载下来,把后缀改成txt试试,发现代码。
在这里插入图片描述
很明显的MD5绕过。构造urlhttp://123.206.87.240:8002/web16/?key1=s155964671a&key2=QNKCDZO但是竟然不对
在这里插入图片描述
又上网搜了一下,发现比较代码上面的函数被我忽略了
就是这里的代码:

$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);

其中,

strstr(string,search,before_search):找到search字符串在string中第一次出现的位置,并把后面的字符串输出;before_search如果为true,则返回位置之前的字符串;默认为false;
substr(string,start,length):看参数很容易理解,返回字符串的一部分;
str_replace(find,replace,string,count):在字符串sting中找到字符串find,并把它替换 成replace;
parse_str(string,array):把查询字符串解析到变量中;

这段代码的意思是:代码从?后开始截取到str中,也就是变量后开始截取字符串;然后从位置1开始截到字符串结束;之后把字符串中的kay字段全用‘ ’替代,这个我们可以通过构造"kekeyy"来绕过;最后把key1和key2解析成变量。
也就是说,最终构造的url为:http://123.206.87.240:8002/web16/?kekeyy1=s155964671a&kekeyy2=QNKCDZO
得到flag:
在这里插入图片描述
不过我有一点很疑惑,最开始的那一串MD5是干嘛的…?

20.成绩单

看到题就感觉应该是个SQL注入的题,打开一看果然是…?
从这一题开始接触SQL注入并使用SQLmap。

一个小总结:
1.XXE

简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
通常攻击者会将payload注入XML文件中,一旦文件被执行,将会读取服务器上的本地文件,并对内网发起访问扫描内部网络端口。换而言之,XXE是一种从本地到达各种服务的方法。此外,在一定程度上这也可能帮助攻击者绕过防火墙规则过滤或身份验证检查。


版权声明:本文为NEMOAMO原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。