| 关键词: ignore 漏洞 Laravel request 代码 函数 写法 input 跟踪 如果 |
0x01 背景最近研究Laravel框架的代码审计,因为3月份爆出过一个ignore函数的一个漏洞,网上找了些文章,看了下, 自己搭建环境测试,一直没有成功, 自己就详细的审计了一遍 0x02 laravel介绍Laravel 在全球范围内有着众多用户。该框架在国外很受欢迎,国外用户量远大于国内。当然,国内也有大型企业使用该框架。此次曝出的 SQL 注入漏洞,并不是太通用,需要一定的条件。[直接复制粘贴] 0x03 漏洞测试环境搭建数据库内容 ![]() 代码测试: $validator = Validator::make($request->input(), [ 路由定义: Route::any("index","UserController@index");访问测试: ![]() ![]() 理解这个漏洞之前, 需要了解laravel的自动验证机制 Rule::unique("users")->ignore($request->input("id"),$request->input("column")) 这种写法不常见,常见的是 Rule::unique("users")->ignore($request->input("id")) 这种写法, 后面的变量如果不写,默认是id, 写上去代表自定义查询字段. 我们可以把测试环境更改为 Rule::unique("users")->ignore($request->input("id")) 然后进行代码跟踪调试 0x04 代码跟踪调试参数提交内容 ?username=admin&id=2 直接下断点 ![]() 跟踪进入, 注意几个关键点函数即可 关键点1: ignore函数 ![]() 直接对ignore 和 idColumn进行赋值 如果idColumn没有传入,默认为id ,然后进入另一个 toString方法 ![]() 漏洞也是主要对这里进行修复 修复后的代码 laravel社区对这种修复,讨论很多, 认为addslashes 无法根本防止注入, 因为ignore的有些写法还是会引起问题. 后面继续跟踪调试, 就会进入 laravel的PDO操作处理 跟踪的出来的sql语句为: ![]() 后续就是进行 PDO查询操作, 因为没有带入exp,所以会正常执行 0x05 注入演示因为如果是pdo操作, 注入通常是对键名 进行带入, 如果带入进键值的话, 没有任何效果, 这里关键的突破点就是 ignore函数中的 idColumn 变量, 以及 toString() 在处理 ignore中的处理方式 讲传入的id参数修改为: 1","liusha"," url为: ![]() 这样传入id,就会对 idColumn 进行覆盖, 默认是id, 现在column 就变为 liusha, 如果这个字段不存在表中 , 这个键名 就会对带入PDO查询操作中,导致报错. 后续生成的sql : ![]() sql的键值带入了我们出入的 liusha 非法字段 最后导致报错 ![]() 提示不存在 liusha这个column. ok,演示完成. 0x06 总结这个漏洞是今年3月份爆出来的, 实际开发中, ignore函数用的比较少, laravel的代码审计 , 大部分还是审计一些开发作者在开发中的一些不规范写法导致的漏洞. |
| 本文出处: https://www.toutiao.com/a6699339786886316556/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|