ctfshow web入门(二)
前言
本来是想把做的题目全部写在一篇里的,但是就在昨天晚上发生了十分悲惨的故事,我写的
最后一题,后面的部分被吃掉了……
所以今天再写一篇新的,记录新写下的题目,嘿嘿~
顺便放一下上一篇的链接:
https://blog.csdn.net/qq_45746876/article/details/123045818?spm=1001.2014.3001.5501
一、爆破 web23
这道题就是昨天被吃掉的那道题,先来看题目:
给了一串代码,放到编译器仔细阅读一波并加上注释:
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 11:43:51
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 11:56:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0); # 判断是否为空的函数
include('flag.php');
if (isset($_GET['token'])) {
$token = md5($_GET['token']); # token = token的md5值
if (substr($token, 1, 1) === substr($token, 14, 1) && substr($token, 14, 1) === substr($token, 17, 1)) { # 并且token的第1位 = 第14位 = 第17位,substr函数用于返回字符串的一部分
# intval函数用于获取变量的整数值:
if ((intval(substr($token, 1, 1)) + intval(substr($token, 14, 1)) + substr($token, 17, 1)) / substr($token, 1, 1) === intval(substr($token, 31, 1))) {
echo $flag;
}
}
} else {
highlight_file(__FILE__);
}
大致意思是get一个值 token,token的md5值满足条件: 第1位 = 第14位 = 第17位,并且取整后 第1位 + 第14位 + 第17位/第1位 === 第17位,此时就会输出flag。
然后再写一个python脚本爆破一下,这题写了很久的原因就是我想直接用在phpstorm上面把token爆破出来,但是php水平又很差,于是想了很久……
后来发现python好像也可以完成,然后又写了python脚本爆破:
# date:2022-2-24 23:25
# author:marxycj
from hashlib import md5
import string
alllist = '0123456789' + string.ascii_lowercase + string.ascii_uppercase
token_md5 = md5(alllist.encode("utf-8")).hexdigest()
for a in alllist:
for b in alllist:
token = str(a) + str(b)
token_md5 = md5(token.encode("utf-8")).hexdigest()
if token_md5[1] == token_md5[14] and token_md5[14] == token_md5[17]:
# if int(token_md5[1]) + int(token_md5[14]) + int(token_md5[17]) / int(token_md5[1]) == int(token_md5[31]): # 是照着条件写出来的,但是有问题,为了不耽误睡觉,就没有改着一行
print('token:{}'.format(token))
print('token+md5:{}'.format(token_md5))
但是由于有一个限制条件没有写出来,所以跑出来有几个结果:
然后再一个一个试(爆破又爆破),最后得到 ?token=3j 是正确的,得出flag。
二、命令执行 web29
先来看题目:
查找一下preg_match函数:
参考: https://www.php.cn/php-weizijiaocheng-381228.html
利用preg_match函数可以进行字符串匹配,!preg_match(“/flag/i”)说明传入的参数中不可以带有 ‘flag’,可以用占位符?或者*代替。
通过eval函数可以执行传入的c,比如传入c=phpinfo();
提示 由于在php环境下,传入的参数要带上 ;
查看当前目录下文件,发现flag.php:
将flag.php 复制到 f.txt:
payload:url?c=system(“cp fla*.php f.txt”);
得出flag:
三、命令执行 web30
参考链接:https://www.bilibili.com/video/av927657095/
先来看题目:
相对于上一题,传参多过滤掉了 一个 ‘php’,但是在php中可以执行命令的函数有很多,由于对php不是很熟,所以去查了一下,参考链接:PHP命令执行函数
可以使用passthru函数来替代system函数,比如出传入?c=passthru(‘ls’);
(别忘记分号)
可以查看当前目录下的文件,有flag.php,但是flag和php都不可以用qaq
然后就暂时琢磨不明白了,看了狐狸师傅的视频才知道echo 加上两个`; 是可以执行``里的内容的。当然本题的payload有很多,可以多去尝试学习一些。
上一题是copy flag.php到f.txt,然后查看f.txt得出了flag。所以在本题中也可以将flag.php的内容复制到f.txt中:
构造payload(下方红色的字时由于``在博客里会把字体变红):
?c=echo
cat ????.??? >> f.txt
;
再访问f.txt即可得出flag:
为什么不直接cat ???.???呢,是因为flag是flag.php一个变量,cat ???.???会执行flag.php而不会输出其中的内容,是这样的。