从ThinkPHP谈基于框架开发程序的安全性(从SQL注入到代码执行)

- AV AC AU C I A
发布: 2025-04-13
修订: 2025-04-13

### 简要描述: 从ThinkPHP谈基于框架开发程序的安全性,以ThinkPHP,ThinkSNS,大米CMS等最新版漏洞证明为例 ### 详细说明: 从ThinkPHP谈基于框架开发程序的安全性,以ThinkPHP,ThinkSNS,大米CMS等为例 之前在看ThinkPHP开发手册的时候看到这个: ``` 字符串方式 字符串方式条件即以字符串的方式将条件作为 where() 方法的参数,例子: $Dao = M("User"); $List = $Dao->where('uid<10 AND email="Jack@163.com"')->find(); 实际执行的 SQL 为: SELECT * FROM user WHERE uid<10 AND email="Jack@163.com" LIMIT 1 字符串方式设定的条件即为实际 SQL 执行的条件,也是最接近原生 SQL 的方式,ThinkPHP 不会对条件做任何(类型上的)检查。 ``` 这就是说当程序员使用GPC接受的值以字符串形式进入where中,此值是原生的字符换,不会进行任何检查和处理,即便是错误类型和恶意sql语句等,这样就导致sql注入的隐患存在了。 我们举个例子,拿最新版的ThinkPHP为例: 注意这里$role = $_POST['role'],直接将POST的值付给了变量role 然后变量以role拼接字符串的形式进入了where中: ``` 这样没有单引号保护 $row = M('user')->where('role='.$role)->find(); 或者这样加上单引号保护 $row = M('user')->where("role='".$role."'")->find(); ``` 不懂安全的程序员任务,将role变量带入where中,ThinkPHP应该会自己处理,应该是安全的 但事实上,这样就导致了SQL注入,不管是否加了单引号 [<img src="https://images.seebug.org/upload/201412/22231338b29493be44d82443f21738b00e2f0d57.png" alt="1.png" width="600"...

0%
暂无可用Exp或PoC
当前有0条受影响产品信息