Thinkphp 5.1.24 parseKey缺陷导致聚合注入 分析
测试url:
http://127.0.0.1/thinkphp/thinkphp_5.1.24/public/index.php/index/index/sqli2?id=2
控制器是获取id参数作为进行聚合查询的字段名,如下图所示
看一下存在漏洞的parseKey方法
可以看到,这里直接在$key的前后加上反引号就直接返回了。根据前面几个漏洞的分析我们可以知道parseKey是用来解析字段名的。对于insert和update之类的数据,程序一般是字段名固定,数据和where语句的等于号之后的值部分可控,因此在这两种查询中parseKey里的参数是用户接触不到的【update member set money=$m where id=$id】。而对于聚合查询而言,一共就只需要一个字段名参数【select max($id) from member】,如果用户可控,就刚好在parseKey进行了拼接。
调试一下,url如下:
http://127.0.0.1/thinkphp/thinkphp_5.1.24/public/index.php/index/index/sqli2?id=kkk
跟进aggregate
跟进parseKey,注意这里的第三个参数为true
可以看到,由于第三个参数是true,所以143行是一个恒真条件,然后在144行在$key前后加上反引号`,最后直接返回。
我们在最终执行SQL语句处看一下最后的SQL语句是啥。
可以看到直接拼接了进去。尝试payload:
id`) from member where updatexml(1,concat(0x7e,user(),0x7e),1) %23
可以看到,我们的数据成功逃逸出了反引号和括号。
不过这个payload的限制就是payload前半部分的id`) from member必须是存在的字段名和表名,否则前半部分就会报错。如果师傅们有啥姿势欢迎留言~
最新文章
- windows和linux平台下的通用时间测试函数
- SSL handshake alert: unrecognized_name error since upgrade to Java 1.7
- 命名空间“System.Web”中不存在类型或命名空间名称“HttpUtility”。是否缺少程序集引用?
- Zend Studio实用快捷键一览表
- linux硬件时间修改与查看
- 动态调整对话框属性(去掉标题栏,去掉边框,修改类似成Border:NONE样式)(调用ModifyStyle和ModifyStyleEx,然后调用SetWindowPos重新显示)
- 程序A+B问题(一次输入和多次输入)
- ACCP6.0 教程课件,可用
- Swift - 文本标签(UILabel)的用法
- SVG 学习(一)
- Ubuntu 16 04 安装KVM
- vue 相对其他热门 框架 优点 --- 待续
- 关于Vue的各个UI框架(elementUI、mint-ui、VUX)
- Appium测试,定位H5元素(HTML5)
- Python开发爆破字典
- Startup在不同环境中的处理
- VGG-Net
- Secondary Indices
- Unity shader学习之Alpha Test的阴影
- 20155306 白皎 《网络攻防》 EXP8 Web基础
热门文章
- 1. 初探--prometheus调研
- NodeJS4-9静态资源服务器实战_发到npm上
- plsql修改某一行数据
- 《Java知识应用》Java-线程池(ScheduledExecutorService)
- SpringBoot微服务电商项目开发实战 --- api接口安全算法、AOP切面及防SQL注入实现
- zookeeper扫盲
- MySql数据库之连接查询
- FlowPortal:流程节点定义有误,合流节点";合流";没有对应的聚焦节点
- unittest---unittest多种加载用例方法
- springboot 读取 resource 下的文件