freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

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

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

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

FreeBuf+小程序

FreeBuf+小程序

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

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
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者