目录
1、ThinkPHP 中存在的 SQL注入 漏洞( select 方法注入)
1.1.1将 composer.json 文件的 require 字段设置成如下:
1.1.2设置application/index/controller/Index.php 文件
2、ThinkPHP 中存在的 SQL注入 漏洞( orderby 方法注入)
2.1.1将 composer.json 文件的 require 字段设置成如下:
2.1.2并配置 application/index/controller/Index.php
2.1.3在 config/database.php 文件中配置数据库相关信息,并开启 config/app.php 中的 app_debug 和 app_trace
3.1.1查看admin.php,发现构造函数可以跳过admin的限制
3.1.2这里就要考虑一下怎么在反序列化后放一个注入,有解密就有加密,所以我们要把加密函数提取出来,加密函数提取后还有提取其他的关联函数才可以
3.2.2.写注入语句,注入语句必须是数组,这里要清楚库里面有多少个字段才行
3.3拿到以后怎么访问到后台,查看源码会发现是remotelogin,然后还要加一个args传参
1、ThinkPHP 中存在的 SQL注入 漏洞( select 方法注入)
1.1环境配置
本次漏洞存在于 Mysql 类的 parseWhereItem 方法中。由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。漏洞影响版本: ThinkPHP5全版本
1.1.1将 composer.json 文件的 require 字段设置成如下:
"require": {
"php": ">=5.4.0",
"topthink/framework": "5.0.15"
}
1.1.2设置application/index/controller/Index.php 文件
<?php
namespace app\index\controller;
class Index
{
public function index()
{
$username = request()->get('username');
$result = db('users')->where('username','exp',$username)->select();
return 'select success';
}
}
1.1.3在 application/database.php 文件中配置数据库相关信息,并开启 application/config.php 中的 app_debug 和 app_trace 。
并在数据库中创建好users表
1.1.4Payload触发SQL注入
1.2漏洞分析
程序默认调用 Request 类的 get 方法中会调用该类的 input 方法,然后进到thinkphp/helper.php中的db方法,再进到thinkphp/library/think/db/Query.php中where方法,通过其 parseWhereExp 方法分析查询表达式,然后再返回并继续调用 select 方法准备开始构建 select 语句
此处调用$this->builder的select方法,而此处$this->builder 为think/db/builder/Mysql类,继承于Builder类,因此调用的是Builder类的select方法
在 select 方法中,程序会对 SQL 语句模板用变量填充,其中用来填充 %WHERE% 的变量中存在用户输入的数据,跟进这个 where 分析函数,会发现其会调用生成查询条件 SQL 语句的 buildWhere 函数,此处 $where 经过 buildWhere 方法处理后返回 $whereStr,期间调用 parseWhereItem 方法
继续跟进 buildWhere 函数,发现用户可控数据又被传入了 parseWhereItem where子单元分析函数。我们发现当操作符等于 EXP 时,将来自用户的数据直接拼接进了 SQL 语句,最终导致了 SQL注入漏洞 。
2、ThinkPHP 中存在的 SQL注入 漏洞( orderby 方法注入)
2.1漏洞环境
本次漏洞存在于 Builder 类的 parseOrder 方法中。由于程序没有