框架概述

其实框架,就是别人写好的包装起来的一套工具,把你原来必须要写的,必须要做的东西写好了放在那里,你只需要调用他给定的方法来实现相应的功能,很方便开发者进行相关的开发

WEB开发的MVC模式,其中M是模型,V是视图(表现层),C是控制层,框架就是M层,把一个不涉及业务相关的东西都写好了包装起来,我们使用就可以了,框架其实就是把很多复杂的东西都弄好了,我们只需要在里面加上具有我们独有的东西就可以了

框架的设计出来的目的是为了省略掉一些基本的相同底层代码的反复书写,只需调用框架的方法就可以实现我们想要的功能

我们常见的框架就是TP框架,下面都拿TP框架进行举例学习

基于TP框架的CMS

AdminLTE后台管理系统
layui后台管理系统
thinkcmf
H-ui.admin后台管理系统
tpshop
FsatAdmin
eyoucms
LarryCMS后台管理系统
tpadmin后台管理系统
snake后台管理系统
ThinkSNS
DolphinPHP后台管理系统
WeMall商城系统
CLTPHP
齐博CMS
DSMALL
YFCMF
HisiPHP后台管理系统
Tplay后台管理系统
lyadmin后台管理系统
haoid后台管理系统

以上这些是常见的以TP框架开发的CMS,有个了解就行

TP路径访问

TP框架也是支持MVC的,即基于模型、视图、控制器的设计模式,如下图所示

56b6b91d0d49ad84ce325362ea457e88

我们如果要访问对应的方法,我们必须以如下方式进行

/index(文件夹)/index(控制器)/xxx(方法),如下图所示

186cacd8cd71f93436151562fb38f85d

从中我们也可以受到相应的启发,我们可以从路径中发现他的控制器,以及类名,当拿到源码的时候,也不至于胡乱寻找,同时,使用这种方式的网站也有很多,我们可以使用inurl:index.php/index进行关键字查询,如下就是一个典型的使用MVC方式的网站,控制器为Index,类为news_detail,方法为3306

image-20240527181351909

当方法里面有参数的时候,我们有两种方式进行书写

当代码接受参数使用$_GET的时候,我们必须使用/index/index/xxx?x=1的写法

image-20240527181011513

但是当接受参数使用的是input函数时,我们也可以使用/index/index/xxx/x/1的方式进行传参

image-20240527181232549

TP写法区别

首先。我们先使用TP框架进行数据库的查询,下面是相关的代码

public function sqlin(){
$id = $_GET['x'];
$coon = mysql_connect('localhost','root','root');
mysql_select_db('syguestbook');
$sql = "select * from sy_message where id = $id";
$result = (row = mysql_fetch_array($result)){
echo $row['gid'];
echo $row['name'];
}
}

此时我们可以很容易的看出,这种写法是存在SQL注入漏洞的,id参数是可控的,我们可以依此进行sql注入

但是如果将写法换成如下,就不可进行sql注入

public function n_sqlin(){
$id = input("?get.x");
$coon = mysql_connect('localhost','root','root');
mysql_select_db('syguestbook');
$sql = "select * from sy_message where id = $id";
$result = (row = mysql_fetch_array($result)){
echo $row['gid'];
echo $row['name'];
}
}

具体原因如下图所示

image-20240527195411872

同时,我们还有下面的写法,进行数据过滤,以控制sql注入

public function m_sqlin(){
$id = input('?get.x');
Db::table('sy_message')->where('id',$id)->select();
}

这个语句其实就和select from一致,但是它内置了过滤方法以防止sql注入,这种过滤法则其实就是封装在框架中的,这也体现出了框架的优势,通过完全不同的语法,实现同一样的功能,同时还进行了过滤处理,但是如果你依然使用自己的方法瞎写,就和框架没有关系了,但是大部分人都会使用框架自带的方法,不然使用框架干什么?

TP历史漏洞

关于历史漏洞,我们的利用思路可以如下

首先先看框架类型,比如我们可以使用wappalyzer插件进行中间价识别,先判断相关的框架

image-20240527202112893

然后再通过报错信息找到相关的版本号(黑盒),白盒直接看代码,找到version即可

1645085245558-36989422-d322-47c0-87e2-9bdb4a65d921.png

之后搜索相关的TP版本有没有爆出过相关漏洞,通过网上的信息构造攻击代码

如果是黑盒,当构造的代码无法达到预期的效果市,那么很有可能是开发者在相应的代码地区打上了补丁,如果是白盒测试,可以直接看漏洞代码处有没有被做相应的修改,如果进行了修改,那么就不能利用历史漏洞进行攻击

但是对于我们这种水平,没有办法挖出0day,所以我们也只能找历史漏洞,遇到打了补丁的,提桶跑路吧🤣🤣🤣