freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

thinkphp5.0.15 sql注入漏洞复现与详细分析
z3 2021-12-06 15:12:13 267199
所属地 辽宁省

thinkphp5.0.15sql注入

复现

搭建环境



漏洞复现

漏洞分析

漏洞出在这句
$res = DB::table('users')->insert(['name'=>$name]);
跟进insert看下
和上一篇有点像,跟进builder->insert看下

parseData生成了注入语句

在parseData中,如果传入参数是数组,通过switch判断第一个参数,如果是inc,则直接拼接第二第三个参数到

然后直接将生成好的键值替换到模板insertSql语句中,,生成了注入语句
name=updatexml(1,concat(0x7,user(),0x7e),1)+1
protected $insertSql = '%INSERT% INTO %TABLE% (%FIELD%) VALUES (%DATA%) %COMMENT%';

同样的,update也使用了parseData函数,所以也会导致注入

回过头来看一下,不仅可以用inc,也可以用dec

上一篇是由于预处理导致的可以执行user()等函数,比较鸡肋
但这次是真实的,通过了预处理,将sql语句交给了数据库执行
所以可以通过报错注入查看数据

总结

parseData函数未对用户输入进行过滤,用户输入的数据控制了代码的执行
exp,inc,dec这些本应在sql语句生成过程中由代码生成,用户设置自增或自减
但未考虑用户输入

如何修复

看5.0.24
只对val[1]拼接,并且会将val[1]强制转换为floatval类型,这样就不能构造语句了
但根本问题还是没有解决啊!用户输入的数据控制了代码的执行!还是会产生未预期的情况

假设场景,用户注册,权限0是管理员,1是普通用户
普通用户注册时,应是1的权限,但是由于用户输入了含有'dec'的数组,导致在插入数据时,让用户权限减一,造成了提权。

# web安全 # 漏洞分析 # 代码审计 # 漏洞复现 # ThinkPHP5
本文为 z3 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
thinkphp系列代码审计
z3 LV.4
  • 27 文章数
  • 89 关注者
Java 反序列化回显链研究:漏洞检测工程化
2022-04-01
Z3专栏 | CommonsCollections3分析
2022-03-19
MeterSphere未授权导致的rce漏洞分析、复现、exp编写
2022-02-11