当前位置: 首页 > ds >正文

sqli-labs靶场通关笔记:第17关 POST请求的密码重置

一、审题

这关显示是密码重置的界面。在用户名的输入框内测试,发现注入语句都没有效果。

二、思考

查看一下源码,发现用户名输入框使用check_input()函数进行了过滤。

function check_input($value)
{// 1. 输入值非空检查if(!empty($value)) {// 2. 输入长度截断 (最多15字符)$value = substr($value,0,15);}// 3. 魔术引号处理if (get_magic_quotes_gpc()) {// 4. 移除自动添加的反斜杠$value = stripslashes($value);}// 5. 数字类型判断if (!ctype_digit($value)) {// 6. 非数字处理:转义+单引号包裹$value = "'" . mysql_real_escape_string($value) . "'";} else {// 7. 数字处理:转换为整数$value = intval($value);}return $value;
}

也就是说,必须输入真实有效的用户名,才能进行密码修改的操作,但是密码输入框没有做过滤。用户名输入admin,密码输入123456,提示修改成功。再修改密码,输入单引号,页面回显报错。

那么测试一下报错注入,发现是可以成功注入。

这里还需要注意一个问题,更新密码的操作是update,为数据操作语言(DML),而select是数据查询语言(DQL),两个不能在同一语句中执行,所以查询users表中字段数据会报错。

 -1' and updatexml(1,concat(0x7e,(select group_concat(username,password) from users)),1) #

解决的办法就是,创建一个独立的子查询,将结果集作为一张临时表,然后通过查询临时表获取数据。

-1' and updatexml(1,concat(0x7e,(select group_concat(username,password) from (select username,password from users)a)),1)#

这里的(select username,password from users)a意思是执行一个独立的子查询作为临时表,别名为a,再将其整合到update语句中。

对于报错回显字符有限制的局限,可以使用字符串截断函数进行截断回显。

三、做法

爆数据库名,爆表名,爆字段,爆数据。

http://www.xdnf.cn/news/15609.html

相关文章:

  • 连接new服务器注意事项
  • kiro, 新款 AI 编辑器, 简单了解一下
  • Java基础(八):封装、继承、多态与关键字this、super详解
  • 笔试——Day8
  • Scrapy扩展深度解析:构建可定制化爬虫生态系统的核心技术
  • 直播数据统计:如何让数据为我们所用?
  • CommunityToolkit.Mvvm IOC 示例
  • C++回顾 Day8
  • 一文深入:AI 智能体系统架构设计
  • 简单工厂设计模式
  • QT 中各种坑
  • 算法学习day16----Python数据结构--模拟队列
  • haproxy负载均衡
  • 【雅思播客016】New Year Resolution 新年决心
  • vue实现el-table-column中自定义label
  • 深入理解C++11 std::iota:从原理到实践
  • Oracle日期时间函数说明及与MySql区别说明
  • 028_分布式部署架构
  • lanch4j将jar转成exe
  • Mac IDEA启动报错:Error occurred during initialization of VM
  • WPF中的ListBox详解
  • 国内第一梯队终端安全产品解析:技术与场景实践
  • 分布式存储之Ceph使用指南--部署篇(未完待续)
  • CSS `:root` 伪类深入讲解
  • 7.14 Java基础|String 和StringBuilder
  • 系统思考:跨境跨界团队学习
  • Vim库函数
  • 图像修复:深度学习GLCIC神经网络实现老照片划痕修复
  • Sharding-Sphere学习专题(三)数据加密、读写分离
  • AI 临床医学课题【总结】